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

Вот чего не хватает 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.

Добавить комментарий

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