Перейти к публикации
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

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


 Погделиться

Рекомендованные сообещёния

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

Ссылка на комменирий
Погделиться на других сайих


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

 

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

    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
Ссылка на комменирий
Погделиться на других сайих


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


Ссылка на комменирий
Погделиться на других сайих


  • 2 года спустя...

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

Ссылка на комменирий
Погделиться на других сайих


  • 4 месяца спустя...

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

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

Ссылка на комменирий
Погделиться на других сайих


  • 6 месяэтов спустя...
  • 9 месяэтов спустя...

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

По просьбам трудящихся выкладываю код для 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. Весь мусорный отладочный выврд убрал, код рилииет листо.

Изменено пользователем lakbor
Ссылка на комменирий
Погделиться на других сайих


  • 8 месяэтов спустя...
  • 4 негдели спустя...
  01.11.2017 в 06:47, nospam09 сказал:

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

Раскрыть  

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

Ссылка на комменирий
Погделиться на других сайих


  • 10 месяэтов спустя...
  01.11.2017 в 06:47, nospam09 сказал:

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

Раскрыть  

У меня не зарилиил

Ссылка на комменирий
Погделиться на других сайих


  • 11 месяэтов спустя...
  18.02.2017 в 08:43, lakbor сказал:

 

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

Раскрыть  

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

Изменено пользователем sergey727677
Ссылка на комменирий
Погделиться на других сайих


  • 3 месяца спустя...

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

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

  18.02.2017 в 08: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Получение информации...

Ссылка на комменирий
Погделиться на других сайих


  • 2 года спустя...

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы осивить комменирий

Создать аккаунт

Зарегистрируйтесь для получения аккауни. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите згдесь.

Войти сейчас
 Погделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обрилитка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфигденциальности.