Кнопка “Редактировать товар” из пользовательской части

OpenCart
5 мин. на чтение

Вот чего не хватает OpenCart (из коробки), так это по аналогии с WordPress панели администратора:

а так даже после логина под Администратором, фронт-энд и админ часть магазина живут своей раздельной жизнью. Решить эту задачу пытались в рунете еще со времен версии 1.4, когда стали появляться первые «панели администратора». Бесплатный модификация я еще не встречал и что еще более смешно: разработчики этих панелей выставляют ценники в 30-50 баксов за копию. Хотя там не больше 50 строк кода :)

Самой востребованной функцией по праву является кнопка «Редактировать товар» на странице самого товара. Она перенаправляет по клику сразу на страницу редактирования товара в админ части движка. Удобно! Ее мы сегодня и сделаем.

Для лентяев: в конце статьи ссылка на ocmod дополнение, которое я переписал для OpenCart 2.3.x.

Для решения этой задачи нужно решить всего-навсего два вопроса:

  1. Как сделать так, чтобы кнопка появлялась только для залогиненного администратора;
  2. Немного переделать формирование ссылки, т.к. базовый класс Url для фронт-энд части OpenCart не заточен для ссылок в Администраторскую часть движка

Начнем как ни странно со второго пункта. Идем в редкий путь, в system/library/url.php

Нам нужна новая функция обработки Url, в корой можно сделать ссылку на административную часть. Напишем ее:

public function linkEditProduct($route, $args = '', $secure = false) {
		if ($this->ssl && $secure) {
			$url = $this->ssl . 'admin/index.php?route=' . $route;
		} else {
			$url = $this->url . 'admin/index.php?route=' . $route;
		}

		if ($args) {
			if (is_array($args)) {
				$url .= '&' . http_build_query($args);
			} else {
				$url .= str_replace('&', '&', '&' . ltrim($args, '&'));
			}

						return $url;
					}
		}

От основной версии она отличается двумя строками:

$url = $this->ssl . 'admin/index.php?route=' . $route;
$url = $this->url . 'admin/index.php?route=' . $route;

Т.е. я не люблю размещать хардкорно какие-то тексты в контроллерах, сделаем имя кнопки настраиваемое из языковых переменных. Для этого сначала для английской версии, а потом и для русской добавим следующее. В catalog/language/en-gb/product/product.php добавим:

/// Edit product button
 $_['text_button_edit'] = 'Edit Product';

А в catalog/language/ru-ru/product/product.php

/// Кнопка редактирования товара
 $_['text_button_edit'] = 'Редактировать товар';

Теперь моя душа спокойна и мы не калечили паттерн MVC(L) говнокодом.

Пришло время заняться Контроллером. Открываем catalog/controller/product/product.php и сразу после

$product_info = $this->model_catalog_product->getProduct($product_id);

добавим:

$data['button_edit_product'] = $this->language->get('text_button_edit');

Нетрудно догадаться, что так мы получили текст кнопки из языковой переменной.

Дальше, сразу после if ($product_info) {

добавим:

if(!empty($this->session->data['user_id']) && !empty($this->session->data['token'])){
$data['edit_product'] = ''.$data['button_edit_product'].'';
					}

Осталось вставить кнопку в tpl карточки товара. Идем в catalog/view/theme/default/template/product/product.tpl
Найдите в коде место, куда вам удобнее вставить кнопку, например это может быть после кнопки “Купить” как в моей реализации.
Сам код кнопки:

<?php if(!empty($edit_product)){echo $edit_product; } ?>

Итого получаем:

Скачать ocmod для OpenCart 2.3 можно тут.

Игорь Чишкала
Директор по технологиям в SoftForge. Люблю ИТ, пишу технические статьи в этом блоге или для сайта фриланс-биржи Upwork. Кодю на PHP с использованием фреймворков Laravel или Symfony.
Оцените автора
Авторский блог Игоря Чишкалы
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

  1. Юрген

    Круто.
    Спасибо, помогло!

    Ответить
  2. Дмитрий

    Спасибо. У меня 2.3, модуль установил, это (Когда вы включаете / отключаете или удаляете одно из дополнений, необходимо нажать на кнопку “Обновить” – чтобы обновить Кэш!) сделал. Но кнопки не появилось и в консоли ошибок нет.

    А в ручную если, то после вставки кода “if(!empty($this->sessi….” 500 ошибка (

    Шаблон не дефолтный.

    Ответить
    1. Ihor Chyshkala

      Какая версия PHP?

      Ответить
  3. Вадим

    К сожалению не отображается кнопка(

    Ответить
    1. Ihor Chyshkala

      Вадим, там часть правок делается для файла шаблона вашей темы. Пришлите адрес сайта, постараюсь помочь.

      Ответить