Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

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


Recommended Posts

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

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


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


Link to comment
Share on other sites


  • 2 years later...

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

Link to comment
Share on other sites


  • 4 months later...

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

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

Link to comment
Share on other sites


  • 6 months later...
  • 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 comment
Share on other sites


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

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

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

Link to comment
Share on other sites


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

 

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

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

Edited by sergey727677
Link to comment
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 comment
Share on other sites


  • 2 years later...

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
 Share

  • 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.