Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

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


Recommended Posts

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

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
Link to post
Share on other sites

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


Link to post
Share on other sites

  • 2 years later...

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

Link to post
Share on other sites

  • 4 months later...

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

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

Link to post
Share on other sites

  • 6 months later...

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

Link to post
Share on other sites

  • 9 months later...

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

По просьбам трудящихся выкладываю код для 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
Link to post
Share on other sites

  • 8 months later...

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

Link to post
Share on other sites

  • 4 weeks later...
В 01.11.2017 в 08:47, nospam09 сказал:

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

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

Link to post
Share on other sites

  • 10 months later...
On 11/1/2017 at 9:47 AM, nospam09 said:

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

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

Link to post
Share on other sites

  • 11 months later...
В 18.02.2017 в 10:43, lakbor сказал:

 

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

Все установил, работает отлично.....а вот с копированием подкатегорий бы, был очень при очень признателен! Спасибо!

Edited by sergey727677
Link to post
Share on other sites

  • 3 months later...

Для 2.3 Ocstore заметил что при пустых значениях вставляется NULL текстом - заменил 'NULL' на ''

 - теперь все гуд

В 18.02.2017 в 10:43, lakbor сказал:

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


$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');

 

вместо 'SSL' используется true в 2.3

 

Завернул для удобства все из поста lakbor в ocmod под ocstore 2.3.0.2

categorycopybutton.ocmod.xml

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

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.