Добавление нового столбца в таблицу товаров админки 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 комментариев

  • Vlad (23.11.2020@15:36)

    Здравствуйте.
    В принципе все работает. Добавил колонку с stock_status_id
    Но:
    1. Выдает только значения из БД. Я так понимаю нужно языковой фаил поправлять?
    2. Не работает сортировка. Вылетает на страницу авторизации админпанели.

    • Dim565Vlad (23.11.2020@17:54)

      Здравствуйте.
      1) Не понял, какие значения из БД, можете описать подробней?
      2) Какая у вас версия движка? Постараюсь проверить

      • VladDim565 (24.11.2020@14:35)

        Коды половину срезались.
        Поэтому если ест желание и возможность, то контакт написал выше.

        • Dim565Vlad (24.11.2020@14:42)

          Да, здесь код режется, отправьте на info@dim565.ru

          Письмо получил, вышло сделать так:
          В /admin/controller/catalog/product.php после строки

          $product_total = $this->model_catalog_product->getTotalProducts($filter_data);

          Добавить

          function searchSubArray(Array $array, $key, $value) {  
              foreach ($array as $subarray){ 
                  if (isset($subarray[$key]) && $subarray[$key] == $value)
                    return $subarray;      
              }
          }
          $this->load->model('localisation/stock_status');
          $stock_statuses = $this->model_localisation_stock_status->getStockStatuses($filter_data);

          Ниже в массив добавить stock_status_id и stock_status_name:

          $data['products'][] = array(
                          'product_id' => $result['product_id'],
                          'image'      => $image,
                          'name'       => $result['name'],
                          'model'      => $result['model'],
                          'price'      => $result['price'],
                          'category'   => $category,
                          'special'    => $special,
                          'quantity'   => $result['quantity'],
                          'status'     => $result['status'] ? $this->language->get('text_enabled') : $this->language->get('text_disabled'),
                          'stock_status_id'       => $result['stock_status_id'],
                          'stock_status_name'       => searchSubArray($stock_statuses, "stock_status_id", $result['stock_status_id'])['name'],
                          'edit'       => $this->url->link('catalog/product/edit', 'token=' . $this->session->data['token'] . '&product_id=' . $result['product_id'] . $url, true)
                      );

          Теперь в файле tpl сможете выводить не только stock_status_id, а stock_status_name

      • VladDim565 (24.11.2020@14:34)

        Версия движка ocStore 2.3.0.2.3
        С доработками, но они админку и БД не затрагивают.

        Параметр добавляемый в админку p.stock_status_id — отображает статус заказов. У меня в частности статус товаров с нулевым остатком.

        Произведенные изменения на примере добавления UPC
        Файл product_list.tpl (/admin/view/template/catalog/product_list.tpl)
        Добавлено

        <a href="» class=»»>

        <a href="»>

        Добавлено

        Изменено на 9

        Файл product.php (/admin/controller/catalog/product.php)
        Добавлено
        ‘stock_status_id’ => $result[‘stock_status_id’],
        Вот на сколько я понимаю как раз в этом месте и проблема. stock_status_id хранит в себе значение в цифрах статуса. А само наименование статуса хранится в другом месте. То есть код верно отрабатывает — выдает значение статуса. А хочется что бы выдавал наименование.

        Файл product.php (/admin/model/catalog/product.php)
        Добавлено
        ‘p.stock_status_id’,

        Все добавления делались как по инструкции.

        Можем связаться напрямую и обговорить момент доната.
        8 917 892 60 51 — Владислав
        Ватсап, телега.

        • ДенисVlad (01.01.2021@11:45)

          Скажите, а можно ли сделать так, чтобы можно было менять цену не заходя в карточку товара?

            • ДенисDim565 (02.01.2021@13:48)

              Спасибо за модуль, не думал что есть такой модуль. А еще вопрос, а можно ли аналогичным методом как вы писали в статье, вывести столбец с ценами со скидками от количества?

              • Dim565Денис (02.01.2021@14:45)

                Вы про цены из вкладки «Скидки» в карточке товара? Вывести можно, но думаю придется копировать дополнительные куски кода из контроллера product.php, похожий пример в моем комментарии от 24.11.2020@14:42, только у вас первая строчка похоже будет $product_discounts = $this->model_catalog_product->getProductDiscounts($this->request->get[‘product_id’]);

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

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