Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

блог для натуралов

  • записів
    10
  • коментаря
    72
  • перегляд
    9 141

унифицируем thumb как в опенкарт 4


kJlukOo

336 переглядів

на одном из проектов мини карточка товара формируется и выводится в 

категории, поиске, акциях, производителе, модулях окдевизарда и тд

сверху на это ложатся всякие модификаторы для опций в категории тд

 

в фигме мы видим, что все карточки товара везде выглядят одинаково

а значит момент формирования и вывода желательно унифицировать

 

формируем новый контроллер на основе модифицированного контроллера категории. тк в этот контроллер попали все необходимые модификации

вьюшку соответственно сформируем на основе модифицированной вьюшки категории по той же причине

технические детали пропустим (за 10 комментов и дополню статью)

 

на выходе мы получаем унифицированный контроллер для получения html карточки товара

используем как-то так

$data['products_thumb'][] = $this->load->controller("product/thumb/getThumb", $result['product_id']);

минус этого подхода состоим в том, что нужно будет подогнать контроллеры, в которых формируются карточки

чтобы решить эту траблу можно сделать модификатор, который сделает что-то подобное

foreach ($results as $result) {
$data['products_thumb'][] = $this->load->controller("product/thumb/getThumb", $result['product_id']);
continue;
//тут старый код, который не будет выполняться

второй минус в том, что отключения модификаторов для категории никак не повлияет на карточки

на боевом магазине все это провернуть однозначно не так просто. лучше это делать на ранних этапах проектирования

стоит ли игра свеч? 

12 коментарів


Recommended Comments

имхо в опенкарт 3 это делать поздно, а в 4 рано 

если унифицировать это только вью и то, потерять совместимость примерно со всем что модифицирует вывод 

Надіслати

Можна набагато простіше для шаблонів, щоб не тягати "туди-сюди" код шаблонів

 

{% include 'default/template/product/thumb.twig' %} 
//$loader = new \Twig\Loader\ArrayLoader(array($filename . '.twig' => $code));
$loader1 = new \Twig_Loader_Array(array($filename . '.twig' => $code));
$loader2 = new \Twig_Loader_Filesystem(array(DIR_TEMPLATE)); // to find further includes
$loader = new \Twig_Loader_Chain(array($loader1, $loader2));

 

Надіслати

Взагалі на "сітку" виводу отих усіх контролерів можна було зробити один контролер (так саме як і модулів виводу товарів)
І не писати простирадло (зараз код Даніеля виглядає як неандертальський в контролерах), а ось щось такого плану

        public function index($settings) {
            return $this
                ->start(settings)
                ->load_language()
                ->header()
                ->breadcrumb()
                ->main()
                ->positions()
                ->output();
        }
...        
private function header() {
	$this->document->setTitle($this->language->get('heading_title'));
	if (method_exists($this->document, 'setRobots')) {
		$this->document->setRobots('noindex,follow');
	}
	return $this;
}
...

 

 

А потім подіями як завгодно обробляти

 

// У файлі установки
$this->model_setting_event->addEvent('your_event_name', 'catalog/controller/your_controller/header/after', 'extension/event/your_event/afterHeader');

// У контролері події
public function afterHeader(&$route, &$data, &$output) {
    // Ваш код, який буде виконано після методу header()
}

 

  • +1 1
Надіслати

там проблема в зовсім іншому

 


				$product_data = [
					'product_id'  => $result['product_id'],
					'name'        => $result['name'],
					'description' => $description,
					'thumb'       => $image,
					'price'       => $price,
					'special'     => $special,
					'tax'         => $tax,
					'minimum'     => $result['minimum'] > 0 ? $result['minimum'] : 1,
					'rating'      => $result['rating'],
					'href'        => $this->url->link('product/product', 'language=' . $this->config->get('config_language') . '&product_id=' . $result['product_id'] . $url)
				];

				$data['products'][] = $this->load->controller('product/thumb', $product_data);


Ідея передавати product_id  у контролер, а в ньому вже getProduct, краще ніж у моделі getProducts
Або зовсім не $product_data, а краще увесь $result без усяких  попередніх змін, типу цього

				$description = trim(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')));

				if (oc_strlen($description) > $this->config->get('config_product_description_length')) {
					$description = oc_substr($description, 0, $this->config->get('config_product_description_length')) . '..';
				}

				if (is_file(DIR_IMAGE . html_entity_decode($result['image'], ENT_QUOTES, 'UTF-8'))) {
					$image = $this->model_tool_image->resize(html_entity_decode($result['image'], ENT_QUOTES, 'UTF-8'), $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height'));
				} else {
					$image = $this->model_tool_image->resize('placeholder.png', $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height'));
				}

				if ($this->customer->isLogged() || !$this->config->get('config_customer_price')) {
					$price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
				} else {
					$price = false;
				}

				if ((float)$result['special']) {
					$special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
				} else {
					$special = false;
				}

				if ($this->config->get('config_tax')) {
					$tax = $this->currency->format((float)$result['special'] ? $result['special'] : $result['price'], $this->session->data['currency']);
				} else {
					$tax = false;
				}


 

  • +1 1
Надіслати
В 13.11.2024 в 11:48, chukcha сказав:

там проблема в зовсім іншому

 


Ідея передавати product_id  у контролер, а в ньому вже getProduct, краще ніж у моделі getProducts
Або зовсім не $product_data, а краще увесь $result без усяких  попередніх змін, типу цього


 

Та там у Даніеля до фіга таких "нюансів" м'яко кажучи )))
Що таке уніфікація, стандартизація, відсутність фрагментації та відсутність диференціації мабуть він не чув.
Але ідеального в світі нічого не буває... як я кажу - "Навіть на сонці є плями, але воно нас гріє та дає життя"

Надіслати
В 13.11.2024 в 11:49, chukcha сказав:

Я писав про це на гіті, аде цар - сам по собі.

 

Ти вірно писав, але мабуть до нього не дійшло )))
 

 

В 13.11.2024 в 11:52, markimax сказав:

Та там у Даніеля до фіга таких "нюансів" м'яко кажучи )))
Що таке уніфікація, стандартизація, відсутність фрагментації та відсутність диференціації мабуть він не чув.
Але ідеального в світі нічого не буває... як я кажу - "Навіть на сонці є плями, але воно нас гріє та дає життя"

;)

Надіслати
13.11.2024 в 14:24, Sha сказал:

а не вiдiйдемо ми тодi від MVC?

ні разу
MVC це не послідовність
до речі у ОС - С - M - V

У OC може бути
С (c-m-v) - M (v) - V

Надіслати
14.11.2024 в 13:53, kJlukOo сказал:

унификация это основа

та нi уніфікацію ні хто не чіпає)

я про спосіб реалізації та ієрархію. Ось якраз про це

13.11.2024 в 14:33, chukcha сказал:

С (c-m-v) - M (v) - V

наскільки це правильно, таке розгалуження...

 

 

Надіслати
14.11.2024 в 21:39, Sha сказал:

наскільки це правильно, таке розгалуження...

а що в цьому не так?
наприклад breadcrumbs

а також

header
footer
...
 

  • +1 1
Надіслати

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.