Добавление нового столбца в таблицу товаров админки OpenCart 2

Способ в статье рабочий, но редактировать исходные файлы в OcStore/OpenCart считается «костылем», гораздо правильней написать модификацию (OCmod) и установить стандартными средствами движка, возможно такие модификации уже существуют, поищите, в любом случае не забывайте делать backup!
Задача: в админ-панели OpenCart 2 (тестировалось на версии 2.0.3.1, но должно работать и в более новых 2.x, а также в ocStore 2.x) на странице Каталог->Товары добавить новый столбец в таблицу товаров. Пускай это будет уже предусмотренное в движке поле UPC.

1) Файл product_list.tpl (/admin/view/template/catalog/product_list.tpl)

В product_list.tpl формируется таблица со списком товаров. Начинаем с заголовка таблицы (thead). Пусть новый столбец будет выводиться после столбца "Статус", находим этот фрагмент кода:

<td class="text-left"><?php if ($sort == 'p.status') { ?>
<a href="<?php echo $sort_status; ?>" class="<?php echo strtolower($order); ?>"><?php echo $column_status; ?></a>
<?php } else { ?>
<a href="<?php echo $sort_status; ?>"><?php echo $column_status; ?></a>
<?php } ?></td>

Добавляем после него:

<td class="text-left"><?php if ($sort == 'p.upc') { ?>
<a href="<?php echo $sort_upc; ?>" class="<?php echo strtolower($order); ?>"><?php echo 'UPC'; ?></a>
<?php } else { ?>
<a href="<?php echo $sort_upc; ?>"><?php echo 'UPC'; ?></a>
<?php } ?></td>

То есть мы скопировали код вывода столбца "Статус" в шапке таблицы и вставили ниже, изменив p.upc вместо p.status, $sort_upc вместо $sort_status, а вместо "echo $column_status" написали 'echo UPC', иначе пришлось бы вносить изменения еще в языковой файл.

Теперь тело таблицы (tbody). Находим:

<td class="text-left"><?php echo $product['status']; ?></td>

Добавляем строку ниже:

<td class="text-left"><?php echo $product['upc']; ?></td>

Последнее мелкое изменение:

<td class="text-center" colspan="8"><?php echo $text_no_results; ?></td>

Изменяем colspan на 9, чтобы таблица не "ломалась", если товары не найдены.

Смотрим, что получилось:
Добавление столбца OpenCart

Столбец добавился, но внутри пока ничего не выводится. Если на сервере включено отображение предупреждений может быть так: "Notice: Undefined index: upc in [путь]/public_html/admin/view/template/catalog/product_list.tpl on line 255".

2) Файл product.php (/admin/controller/catalog/product.php)

Этот файл отвечает за вызов "model", обработку и подготовку полученных данных для вывода в "view".
Делаем поиск по sort_status, будет всего одна строчка. Дублируем и меняем на sort_upc, должно получиться так:

$data['sort_status'] = $this->url->link('catalog/product', 'token=' . $this->session->data['token'] . '&amp;amp;sort=p.status' . $url, 'SSL');
$data['sort_upc'] = $this->url->link('catalog/product', 'token=' . $this->session->data['token'] . '&amp;amp;sort=p.upc' . $url, 'SSL');

Затем находим массив $data['products'][] и после строки:

'status'     => ($result['status']) ? $this->language->get('text_enabled') : $this->language->get('text_disabled'),

добавляем:

'upc'		=> $result['upc'],

3) Файл product.php (/admin/model/catalog/product.php)

В этом файле формируются запросы к базе данных, которые затем используются в "controller". Нужно внести только одну изменение: находим массив $sort_data и добавляем p.upc, получится так:

$sort_data = array(
'pd.name',
'p.model',
'p.price',
'p.quantity',
'p.status',
'p.upc',
'p.sort_order'
);

Все работает:
Добавление столбца OpenCart
Если после этих действий ничего не заработало:

  • попробуйте очистить кэш на странице "Расширения"-"Модификаторы" (если магазин уже функционирует советую перед этим сделать резервную копию файлов и БД)
  • возможно, вы допустили ошибки в коде, проверьте логи в админ-панели или в файле /system/logs/error.log

Posted under: OpenCart

60 комментариев

  • Олег (06.09.2018@14:25)

    Добрый день. Именно с UPC все стало на 2.3 как и описано. Сейчас мучаюсь с проблемой сделать вместо UPC — Производителя. Я так понял, что там немного различается метод интегрирования, т.к. там помимо значения идет еще и идентификатор, поєтому відает ошибки в выдаче. Не подскажете как правильно прописать Производителя вместо UPC?

    • Dim565Олег (06.09.2018@14:29)

      Здравствуйте. Давно не работал с OpenCart, нет возможности проверить у себя. Какие ошибки?

      • ОлегDim565 (06.09.2018@14:46)

        Notice: Undefined index: manufacturer /admin/controller/catalog/product.php
        Это я прописал везде, где у вас написано UPC — manufacturer

          • ОлегDim565 (06.09.2018@14:49)

            Opencart 2.3.0.2
            Ругается на строчку:
            ‘manufacturer’ => $result[‘manufacturer’],
            в блоке $data[‘products’][] = array(
            в /admin/controller/catalog/product.php

            • Dim565Олег (06.09.2018@15:39)

              Да, в таблице products нет названия производителя, а только его id.

              Нужно изменить файл /admin/controller/catalog/product.php

              Перед строкой $data[‘products’][]
              Добавить
              $this->load->model(‘catalog/manufacturer’);
              $manufacturer_info = $this->model_catalog_manufacturer->getManufacturer($result[‘manufacturer_id’]);
              $manufacturer_name = $manufacturer_info[‘name’];

              А внутри массива $data[‘products’][] сделать так:
              ‘manufacturer’ => $manufacturer_name,

              Проверьте, должно показывать производителя. И мне кажется неправильно подключать $this->load->model(‘catalog/manufacturer’) во второй раз (ниже по коду он тоже используется), но других идей нет.

  • Дмитрий (07.09.2018@23:26)

    Добрый день. А как добавить в админку столбец с датой редактирования товара? Opencart 2.3

      • ДмитрийDim565 (08.09.2018@10:13)

        Notice: Undefined index: date_modified in ….view/template/catalog/product_list.tpl on line 166
        166 строка:
        Подскажите, пожалуйста

        • ДмитрийДмитрий (08.09.2018@10:15)

          td class=»text-left»

          ?php echo $product[‘date_modified’]; ?

          /td

          треугольные скобки есть, естественно. Просто так не добавляет

                • ДмитрийDim565 (08.09.2018@12:39)

                  Проблема в общем такая — эта ошибка вылазит только в одном случае, когда я удаляю все заказы. Так что не страшно.. Спасибо!

                • ДмитрийDim565 (08.09.2018@12:25)

                  Теперь есть вопрос.. После чистки кэша стало всё ок, а затем проблема возникла:
                  Warning: Division by zero in …/system/storage/modification/admin/controller/common/column_left.php on line 1124

                  Строка 1124 такая: $data[‘other_status’] = round(($other_total / $order_total) * 100);

                  Везде всё стало мега крупным в админке.

                • ДмитрийDim565 (08.09.2018@12:15)

                  Это я голова два уха. Кэш модификатора не почистил… Спасибо огромное. Вы очень крутой мега мозг) Крутые штучки подсказываете.

  • Николай (05.11.2018@19:21)

    Версия ocStore 2.1.0.2.1
    Сделал пункт 1 но столбец ( пустой ) не отобразился

  • Павел (03.01.2019@13:30)

    Подскажите а как вывести в колонку атрибуты которые привязаны к товару, версия 2.3.Очень буду благодарен

    • Dim565Павел (03.01.2019@15:41)

      Вы хотите выводить только названия привязанных к товару атрибутов или еще и их значения?

      • ПавелDim565 (03.01.2019@19:45)

        канечно было бы хорошо вместе,но это если возможно,в противном случаии хотя бы название

        • Dim565Павел (03.01.2019@21:21)

          За эффективность/безопасность не отвечаю, но работает (проверял на OcStore 2.3.0.2.3).

          1. Файл product_list.tpl (/admin/view/template/catalog/product_list.tpl).
          1.1. Перед строкой:

          <td class="text-right"><?php echo $column_action; ?></td>

          Добавляете:

          <td class="text-left"><?php echo 'Атрибуты'; ?></a></td>

          1.2. После строки

          <td class="text-left"><?php echo $product['status']; ?></td>

          Добавляете:

          <td class="text-left">
          <?php foreach ($product['attributes'] as $product_attribute) { ?>
          <?php echo $product_attribute['attribute_name']; ?>
          =
          <?php echo $product_attribute['product_attribute_description'][1]['text']; //1 означает русскоязычное значение атрибута ?>
          <br />
          <?php } ?>
          </td>

          2. Файл product.php (/admin/controller/catalog/product.php)
          2.1. Перед массивом (~430 строка):

          $data['products'][] = array(

          Добавляете:

          $this->load->model('catalog/attribute');
          		$product_attributes = $this->model_catalog_product->getProductAttributes($result['product_id']);
          	$data['product_attributes'] = array(); // обнуляем массив от старых значений
          		foreach ($product_attributes as $product_attribute) {
          			$attribute_info = $this->model_catalog_attribute->getAttribute($product_attribute['attribute_id']);
          
          			if ($attribute_info) {
          				$data['product_attributes'][] = array(
          					'attribute_id'                  => $product_attribute['attribute_id'],
          					'attribute_name' => $attribute_info['name'],
          					'product_attribute_description' => $product_attribute['product_attribute_description']
          				);
          			}
          		}

          2.2. После строки:

          'quantity'   => $result['quantity'],

          Добавляете:

          'attributes' => $data['product_attributes'],
              • ПавелDim565 (04.01.2019@00:39)

                Скажите а можно вас попросить написать этот код с коментариями.Учусь по немногу

                $this->load->model(‘catalog/attribute’);
                $product_attributes = $this->model_catalog_product->getProductAttributes($result[‘product_id’]);
                $data[‘product_attributes’] = array(); // обнуляем массив от старых значений
                foreach ($product_attributes as $product_attribute) {
                $attribute_info = $this->model_catalog_attribute->getAttribute($product_attribute[‘attribute_id’]);

                if ($attribute_info) {
                $data[‘product_attributes’][] = array(
                ‘attribute_id’ => $product_attribute[‘attribute_id’],
                ‘attribute_name’ => $attribute_info[‘name’],
                ‘product_attribute_description’ => $product_attribute[‘product_attribute_description’]
                );
                }
                }

                • Dim565Павел (04.01.2019@10:12)

                  Напишу так, как я его понимаю.

                  $this->load->model('catalog/attribute'); // подключаем "модель" (для получения информации из БД), файл admin/model/catalog/attribute.php
                  $product_attributes = $this->model_catalog_product->getProductAttributes($result['product_id']); // в переменную product_attributes заносим все атрибуты для текущего товара (функция getProductAttributes находится в admin/model/catalog/product.php), если их нет получается пустой массив
                  $data['product_attributes'] = array(); // обнуляем массив data['product_attributes'] от старых значений (предыдущих товаров)
                  foreach ($product_attributes as $product_attribute) { // перебираем каждый элемент массива $product_attributes
                  $attribute_info = $this->model_catalog_attribute->getAttribute($product_attribute['attribute_id']); // в массив $attribute_info заносим название, значение атрибута и т.п по его id
                  
                  if ($attribute_info) { // если массив $attribute_info создался (такой атрибут существует), то заполняем массив $data['product_attributes'] (далее он будет перебираться в product_list.tpl)
                  $data['product_attributes'][] = array(
                  'attribute_id' => $product_attribute['attribute_id'],
                  'attribute_name' => $attribute_info['name'],
                  'product_attribute_description' => $product_attribute['product_attribute_description']
                  );
                  }
                  }
                  
  • Александр (13.05.2019@22:06)

    Здравствуйте, есть ли возможность сделать тоже самое только вместо UPS добавить дату создания товара, заранее спасибо!

    • Dim565Александр (13.05.2019@22:36)

      Здравствуйте. Возможно, в БД дата создания хранится в поле date_added. Нужно смотреть, есть ли в «контроллере» получение информации из «модели», если нет, тогда придется редактировать довольно много файлов.

  • Дмитрий (24.06.2019@02:06)

    Здравствуйте, как сделали все таки вывод производителя? после этого:
    Перед строкой $data[‘products’][]
    Добавить
    $this->load->model(‘catalog/manufacturer’);
    $manufacturer_info = $this->model_catalog_manufacturer->getManufacturer($result[‘manufacturer_id’]);
    $manufacturer_name = $manufacturer_info[‘name’];

    А внутри массива $data[‘products’][] сделать так:
    ‘manufacturer’ => $manufacturer_name,

    как вывели во вьюхе?

    Notice: Undefined index: manufacturer_info in /system/storage/modification/admin/view/template/catalog/product_list.tpl on line 445

    • Dim565Дмитрий (29.06.2019@10:29)

      Здравствуйте. Прошу извинить за долгий ответ. Исходников не осталось, но думаю, выводить в view нужно так: echo $product[‘manufacturer’]. Проверьте, если не поможет напишите версию движка, проверю.

  • Артур (21.08.2019@15:54)

    Добрый день!Opencart.PRO 2.3Сделал всё по инструкции столбец добавился,а вывода нет.
    2019-08-21 15:49:59 — PHP Notice: Undefined variable: sort_sku in /var/www/u0360859/data/www/elbinmotors.ru/admin/view/template/catalog/product_list.tpl on line 198

    2019-08-21 15:49:59 — PHP Notice: Use of undefined constant SKU — assumed ‘SKU’ in /var/www/u0360859/data/www/elbinmotors.ru/admin/view/template/catalog/product_list.tpl on line 198

    2019-08-21 15:49:59 — PHP Notice: Undefined index: sku in /var/www/u0360859/data/www/elbinmotors.ru/admin/view/template/catalog/product_list.tpl on line 239

    • Dim565Артур (21.08.2019@16:10)

      На Opencart.PRO не тестировал (до вашего комментария и не слышал о такой сборке), возможно код движка сильно отличается. Хотел проверить, но как понял PRO версия платная.

  • Алекс (24.03.2020@18:59)

    Добрый день, извиняюсь за глупый вопрос, переименовать Артикул в ( Код товара ) и добавить столбик SKU в котором будет поиск по SKU-коду. Сделал как вы описали в статье, но даже столбик не появился.
    Версия: OPENCART.PRO 2.3.0.2.1
    Спасибо за внимание.

    • Dim565Алекс (24.03.2020@19:14)

      Здравствуйте. Если вы отредактировали файлы, но ничего не изменилось, то обычно дело в кэше. Попробуйте нажать кнопку «очистка» в админ-панели на странице Расширения-Модификаторы (если магазин уже функционирует советую перед этим сделать резервную копию файлов и БД)

  • Илья (21.04.2020@14:30)

    Добрый! А не у кого не выводится кракозябры. Хочу вывести статус у категорий, использую Opencart 3.0. на последнем этапе выводятся кракозябры, причем всей страницы. Не могу понять почему(((

    • Dim565Илья (21.04.2020@16:35)

      Здравствуйте, если кодировка слетает после правок возможно дело в текстовом редакторе, вы какой используете?

      И еще сегодня в статье заметил проблему с отображением кода, например было так

      &lt;td class="text-left"&gt;&lt;?php if ($sort == 'p.status') { ?&gt;

      Правильно так:

      <td class="text-left"><?php if ($sort == 'p.status') { ?>

      Уже исправил, но может вы копировали проблемный код?

Добавить комментарий для Dim565 Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *