ZippoMan

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

Рекомендуемые сообщения

ZippoMan    0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
lakbor    49

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

 

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

    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>

 

Г О Т О В О!

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
lakbor    49

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


Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
vakhrab    0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
lakbor    49

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Stackand    4

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
lakbor    49

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
chukcha    937

 

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу