Jump to content
ZippoMan

[Решено] Кнопка копировать для категорий

Recommended Posts

Столкнулся с такой проблемой, что нужно большое количество подкатегорий продублировать в категориях. Но кнопки скопировать(такой как в товарах) в категориях нету. Решение с копированием div блока с подкатегориями к нужному результату не привел. Подскажите, может быть можно как то создать такую кнопку, которая будет копировать категории? Или например перепрограмировать кнопку копировать из товаров?

Share this post


Link to post
Share on other sites

ВНИМАНИЕ! Все изменения, вносимые в код вы делаете на свой страх и риск, все файлы советую бэкапить, В ТОМ ЧИСЛЕ БАЗУ ДАННЫХ!

 

Также, есть три нюанса:

    1. почему-то не переводит по завершению обратно на страницу категорий, но я думаю не оч сложно нажать в браузере "назад", попозже доработаю

    2. при работе выводит кучу мусора на страницу, инфа служебная, я ей пользовался при отладке, не смущайтесь также на ошибки и предупреждения, все работает с ними.

    3. если у категории есть подкатегории, то они не копируются при копировании родительской.

 

Приступаем!

 

1) открываем файл

/admin/controller/catalog/category.php

 Ищем функцию

public function insert() {
    $this->load->language('catalog/category');

    $this->document->setTitle($this->language->get('heading_title'));
		
    $this->load->model('catalog/category');
		
    if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validateForm()) {
	$this->model_catalog_category->addCategory($this->request->post);

	$this->session->data['success'] = $this->language->get('text_success');
		
	$this->redirect($this->url->link('catalog/category', 'token=' . $this->session->data['token'], 'SSL')); 
    }
    $this->getForm();
}

ПОСЛЕ нее вставляем следующий код:

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
public function my_copy() {
    $this->load->language('catalog/category');

    $this->document->setTitle($this->language->get('heading_title'));
		
    $this->load->model('catalog/category');
    	if (isset($this->request->post['selected'])) {
	    foreach ($this->request->post['selected'] as $category_id) {
		$this->my_copycat($category_id);
	    }
        $this->redirect($this->url->link('catalog/category', 'token=' . $this->session->data['token'], 'SSL'));
	}
    $this->getList();
}
			
private function my_copycat($cid) {
// GET LAST CID
    $query_id = $this->db->query("SELECT * FROM category;");
    $last_cid=0;
    foreach ($query_id as $qwerty_id) {
        foreach ($qwerty_id as $qqqq) {
	    if ($last_cid < (int)$qqqq['category_id']) {
  	        $last_cid = (int)$qqqq['category_id'];
	    } else { ;}
        }
    }
    echo ++$last_cid;

// 1-st QUERY ('category' DB)			
    $qq = "SELECT * FROM category WHERE category_id = " . $cid . ";";
    $query = $this->db->query($qq);
    $my_category = array();
    foreach ($query as $qwerty) {
        foreach ($qwerty as $qqqq) {
	    foreach ($qqqq as $mkey => $mval) {
	        if ($mval == '') {
		    $my_category[$mkey] = 'NULL';
		} else {
		    $my_category[$mkey] = $mval;
		}
	    }
	}
    }	

// 2-nd QUERY ('category_description' DB)
    $qq = "SELECT * FROM category_description WHERE category_id = " . $cid . ";";
    $query = $this->db->query($qq);
    $my_category_description = array();
    foreach ($query as $qwerty) {
        $j=0;
	foreach ($qwerty as $qqqq) {
	    foreach ($qqqq as $mkey => $mval) {
	        //echo '<h1>' . $j . ' - ' . $mkey .'-'. $mval . '</h1>';
		if ($mval == '') {
		    $my_category_description[$j][$mkey] = 'NULL';
		} else {
		    $my_category_description[$j][$mkey] = $mval;
		}
	    }
	    $j++;
	}
    }
//echo '<h1><font color=red>'.$my_category_description[0]['name'] . '</font></h1>';
			
// 3-rd QUERY ('category_to_store' DB)
    $qq = "SELECT * FROM category_to_store WHERE category_id = " . $cid . ";";
    $query = $this->db->query($qq);
    $my_category_to_store = array ();
    foreach ($query as $qwerty) {
        foreach ($qwerty as $mkey => $mval) {
	    $my_category_to_store[$mkey] = $mval; 
	}
    }
    echo '<h1><font color=green>store_id = ' . $my_category_to_store['store_id'] . 'cat id = ' . $my_category_to_store['category_id'] . '</font></h1>';
			
// READ QUERIES ENDED // READ QUERIES ENDED // READ QUERIES ENDED 
// WRITING TO DATABASE!!!  // WRITING TO DATABASE!!!  // WRITING TO DATABASE!!! 

//INS 1st ARRAY
    $qs = ', ';
    
    $qq_values = $last_cid . $qs . $my_category['image'] . $qs . $my_category['parent_id'] . $qs . $my_category['top'] . $qs . $my_category['column'] . $qs . $my_category['sort_order'] . $qs . $my_category['status'] . ', \'' . $my_category['date_added'] . '\', \'' . $my_category['date_modified'] . '\'';

    echo '<h1>' . $qq_values . '</h1>';
    
    echo $qq = 'INSERT INTO category (`category_id` ,`image` ,`parent_id` ,`top` ,`column` ,`sort_order` ,`status` ,`date_added` ,`date_modified`) VALUES (' . $qq_values . ');';
			
    $query = $this->db->query($qq);
		

//INS 2nd ARRAY
    $li = 0; $qs = ', ';
    while ($li < sizeof($my_category_description)) {
	
        echo '<br><br>' . $qq_values = $last_cid . $qs . $my_category_description[$li]['language_id'] . ', \'' . $my_category_description[$li]['name'] . '\', \'' . $my_category_description[$li]['description'] . '\', \'' . $my_category_description[$li]['meta_description'] . '\', \'' . $my_category_description[$li]['meta_keyword'] . '\', \'' . $my_category_description[$li]['seo_title'] . '\', \'' . $my_category_description[$li]['seo_h1'] . '\'';
				
        echo '<br><br>' . $qq = 'INSERT INTO category_description VALUES (' . $qq_values . ');';
	$query = $this->db->query($qq);
	$li++;
    }


//INS 3rd ARRAY
    echo '<br><br><font color=orange>' . $qq = 'INSERT INTO category_to_store VALUES (' . $last_cid . ', ' . $my_category_to_store['store_id'] . ');';

    echo '</font>';
    $query = $this->db->query($qq);
				
// WRITING COMPLETED!!!  // WRITING COMPLETED!!!  // WRITING COMPLETED!!!
}	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

Теперь ищем следующие две строки (у меня они вышли (после добавления кода выше) на 199 и 200 строках:

$this->data['insert'] = $this->url->link('catalog/category/insert', 'token=' . $this->session->data['token'], 'SSL');
$this->data['delete'] = $this->url->link('catalog/category/delete', 'token=' . $this->session->data['token'], 'SSL');

ПЕРЕД ними дописываем:

$this->data['copy'] = $this->url->link('catalog/category/my_copy', 'token=' . $this->session->data['token'], 'SSL');

 

/// вмешательство в файл category.php закончили

 

 

2) Теперь открываем файл

/admin/view/template/catalog/category_list.tpl

В нем ищем код:

<div class="buttons">
    <a onclick="location = '<?php echo $insert; ?>'" class="button"><?php echo $button_insert; ?></a>
    <a onclick="$('#form').submit();" class="button"><?php echo $button_delete; ?></a></div>
</div>

и дополняем его чтобы вышло так:

<div class="buttons">
    <a onclick="$('#form').attr('action', '<?php echo $copy; ?>'); $('#form').submit();" class="button"><?php echo 'Copy Category'; ?></a>
    <a onclick="location = '<?php echo $insert; ?>'" class="button"><?php echo $button_insert; ?></a>
    <a onclick="$('#form').submit();" class="button"><?php echo $button_delete; ?></a></div>
</div>

 

Г О Т О В О!

 

Еще раз повторюсь - ВСЁ на ваш страх и риск, скрипт работает напрямую с БД, поэтому, чтобы в мой адрес не было мата, делайте бэкапы!

  • +1 1

Share this post


Link to post
Share on other sites

ВНИМАНИЕ! Во время обкатки на одной и той же версии движка (1.5.4.1), но почему-то различающихся в коде, были выявлены ряд ошибок! из-за расхождений в коде, естественно. (расхождения оказались даже в БД) поэтому, если решите воспользоваться кодом выше - лучше свяжитесь со мной чтобы доработать код напильником под вашу уникальную версию движка


Share this post


Link to post
Share on other sites

а для opencart 2.0.2.0 не подскажете что там нужно изменить в файле /admin/controller/catalog/category.php, так как кнопку создал а она не функционирует.

Share this post


Link to post
Share on other sites

Упс) давненько я не заходил на Форум...

Ещё актуально?:)

Share this post


Link to post
Share on other sites

Тоже интересно, как с версией 2ххх

Share this post


Link to post
Share on other sites

Доброго всем дня!

По просьбам трудящихся выкладываю код для OC второй версии)

Скачал:

 ocStore 2.1.0.2.1 

Во-первых, сразу предупреждаю:

ВНИМАНИЕ! Все изменения, вносимые в код вы делаете на свой страх и риск, все файлы советую бэкапить, В ТОМ ЧИСЛЕ БАЗУ ДАННЫХ!

 

Во-вторых, этот код писался под мой любимый ocStore, поэтому для чистого Opencart и его просто русифицированных версий будет отличаться.

 

 

Итак, во-первых, как и раньше, лезем в файл:

/admin/controller/catalog/category.php

там перед последней фигурной скобкой } вставляем следующий код:

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
public function my_copy() {
    $this->load->language('catalog/category');

    $this->document->setTitle($this->language->get('heading_title'));
		
    $this->load->model('catalog/category');
    	if (isset($this->request->post['selected'])) {
	    foreach ($this->request->post['selected'] as $category_id) {
		$this->my_copycat($category_id);
	    }

	}
    $this->getList();
}
			
private function my_copycat($cid) {
// GET LAST CID
    $query_id = $this->db->query("SELECT * FROM " . DB_PREFIX . "category;");
    $last_cid=0;
    foreach ($query_id->rows as $qqqq) {
	    if ($last_cid < (int)$qqqq['category_id']) {
  	        $last_cid = (int)$qqqq['category_id'];
	    }
    }
    ++$last_cid;

// 1-st QUERY ('category' DB)			
    $qq = "SELECT * FROM " . DB_PREFIX . "category WHERE category_id = " . $cid . ";";
    $query = $this->db->query($qq);
    $my_category = array();
    foreach ($query->rows as $qqqq) {
			foreach ($qqqq as $mkey => $mval) {
				if ($mval == '') {
				$my_category[$mkey] = 'NULL';
			} else {
				$my_category[$mkey] = $mval;
			}
			}
    }	

// 2-nd QUERY ('category_description' DB)
    $qq = "SELECT * FROM " . DB_PREFIX . "category_description WHERE category_id = " . $cid . ";";
    $query = $this->db->query($qq);
    $my_category_description = array();
    $j=0;
	foreach ($query->rows as $qqqq) {
        
	    foreach ($qqqq as $mkey => $mval) {
		if ($mval == '') {
		    $my_category_description[$j][$mkey] = 'NULL';
		} else {
		    $my_category_description[$j][$mkey] = $mval;
		}
	    }
	    $j++;
    }
			
// 3-rd QUERY ('category_to_store' DB)
    $qq = "SELECT * FROM " . DB_PREFIX . "category_to_store WHERE category_id = " . $cid . ";";
    $query = $this->db->query($qq);
    $my_category_to_store = array ();
	foreach($query->rows as $qqqq){
        foreach ($qqqq as $mkey => $mval) {
	    $my_category_to_store[$mkey] = $mval; 
	}
	}  

// READING ENDED   // READING ENDED   // READING ENDED   
// WRITING TO DATABASE!!!  // WRITING TO DATABASE!!!  // WRITING TO DATABASE!!! 

//INS 1st ARRAY
    $qs = ', ';

    $qq_values = $last_cid . $qs . '\'' . $my_category['image'] . '\''. $qs . $my_category['parent_id'] . $qs . $my_category['top'] . $qs . $my_category['column'] . $qs . $my_category['sort_order'] . $qs . $my_category['status'] . ', \'' . $my_category['date_added'] . '\', \'' . $my_category['date_modified'] . '\'';

    $qq = 'INSERT INTO ' . DB_PREFIX . 'category (`category_id` ,`image` ,`parent_id` ,`top` ,`column` ,`sort_order` ,`status` ,`date_added` ,`date_modified`) VALUES (' . $qq_values . ');';
			
    $query = $this->db->query($qq);

//INS 2nd ARRAY
    $li = 0; $qs = ', ';
    while ($li < sizeof($my_category_description)) {

		$qq_values = $last_cid . $qs . $my_category_description[$li]['language_id'] . ', \'' . $my_category_description[$li]['name'] . '\', \'' . $my_category_description[$li]['description'] . '\', \'' . $my_category_description[$li]['meta_description'] . '\', \'' . $my_category_description[$li]['meta_keyword'] . '\', \'' . $my_category_description[$li]['meta_title'] . '\', \'' . $my_category_description[$li]['meta_h1'] . '\'';
				
		$qq = 'INSERT INTO ' . DB_PREFIX . 'category_description VALUES (' . $qq_values . ');';
	$query = $this->db->query($qq);
	$li++;
    }

//INS 3rd ARRAY
	$qq = 'INSERT INTO ' . DB_PREFIX . 'category_to_store VALUES (' . $last_cid . ', ' . $my_category_to_store['store_id'] . ');';

    $query = $this->db->query($qq);
				
// WRITING COMPLETED!!!  // WRITING COMPLETED!!!  // WRITING COMPLETED!!!
}	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

Далее, в этом же файле перед:

$data['add'] = $this->url->link('catalog/category/add', 'token=' . $this->session->data['token'] . $url, 'SSL');

вставляем:

$data['copy'] = $this->url->link('catalog/category/my_copy', 'token=' . $this->session->data['token'], 'SSL');

 

Теперь переходим к файлу:

/admin/view/template/catalog/category_list.tpl

В нём, в самом начале после:

<div class="page-header">
    <div class="container-fluid">
      <div class="pull-right">

Вставляем:

<a onclick="$('#form-category').attr('action', '<?php echo $copy; ?>'); $('#form-category').submit();" class="btn btn-warning"><?php echo 'Copy Category'; ?></a>

Класс кнопки может быть вместо btn-warning следующим:

  • btn-default (белая)
  • btn-primary (синяя)
  • btn-success (зелёная)
  • btn-info (голубая)
  • btn-warning (желтая)
  • btn-danger (красная)
  • btn-link (в виде ссылки)

 

Вот, собственно, и всё. Ещё раз - делайте бэкапы!

 

May the Force be with you!

 

P.S. Также поступило предложение заморочиться, чтобы копировалась не только сама категория, но и рекрсивно все подкатегории. Что ж, как будет время реализую)

P.P.S. Весь мусорный отладочный выврд убрал, код работает чисто.

Edited by lakbor

Share this post


Link to post
Share on other sites

 

Share this post


Link to post
Share on other sites

Приветствую! Возможно ли использовать с версией ocStore-2.3.0.2.3 ?

Share this post


Link to post
Share on other sites
В 01.11.2017 в 08:47, nospam09 сказал:

Приветствую! Возможно ли использовать с версией ocStore-2.3.0.2.3 ?

Проверил,работает !!! Спасибо автору )) Очень помогла эта статья !!!

Share this post


Link to post
Share on other sites
On 11/1/2017 at 9:47 AM, nospam09 said:

Приветствую! Возможно ли использовать с версией ocStore-2.3.0.2.3 ?

У меня не заработал

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.