Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Название товаров в категории


Recommended Posts

Подскажите пожалуйста, как правильно реализовать. Сам в программировании не силен, по этому прошу не смеяться и отвечать по проще)

Вот это ванильный код из контролера категории. 
 

Спойлер
foreach ($results as $result) {
				if ($result['image']) {
					$image = $this->model_tool_image->resize($result['image'], $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_height'));
				} else {
					$image = $this->model_tool_image->resize('placeholder.png', $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_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;
				}

				if ($this->config->get('config_review_status')) {
					$rating = (int)$result['rating'];
				} else {
					$rating = false;
				}
                			
				
				$data['products'][] = array(
					'product_id'  => $result['product_id'],
					'thumb'       => $image,
					'name'        => $result['name'],
					'description' => utf8_substr(trim(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8'))), 0, $this->config->get('theme_' . $this->config->get('config_theme') . '_product_description_length')) . '..',
					'price'       => $price,
					'special'     => $special,
					'tax'         => $tax,
					'minimum'     => $result['minimum'] > 0 ? $result['minimum'] : 1,
					'rating'      => $result['rating'],
					'href'        => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url)
				 );
			}

 


Как его модифицировать, чтоб он мне выводил в название товара в категории из массива поочередно. Т.е. подставлял перед названием значение из массива.

(Сами товары у меня содержат в названии только фирму и модель.)

Сам я только до такого варианта дошел, но он работает только, если никто не будет увеличивать кол-во товаров на витрине, в другом случае сыпятся ошибки.
Наверное стоит, как то через foreach сделать, но мне не хватает знаний.  Прошу подсказать.

Вот мой вариант.
 

Спойлер
foreach ($results as $result) {
				if ($result['image']) {
					$image = $this->model_tool_image->resize($result['image'], $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_height'));
				} else {
					$image = $this->model_tool_image->resize('placeholder.png', $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_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;
				}

				if ($this->config->get('config_review_status')) {
					$rating = (int)$result['rating'];
				} else {
					$rating = false;
				}
                
				if 
				 (in_array($category_id, [94, 95, 100, 102], TRUE))
			    {
                 $category_prefix = array(); 
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Эл камин ";
				  $category_prefix[] = "Электрокамин ";
				  $category_prefix[] = "Электрический камин ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Эл камин ";
				  $category_prefix[] = "Электрокамин ";
				  $category_prefix[] = "Электрический камин ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
				  $category_prefix[] = "Элеткрокамин ";
				  $category_prefix[] = "Каминокомплект ";
                }				    
				elseif
			    ($category_id == '138') 
			    {
                 $category_prefix = array();
				  $category_prefix[] = "Элекрокаменка ";
				  $category_prefix[] = "Элекрокаменка ";
				  $category_prefix[] = "Элекрокаменка ";
				  $category_prefix[] = "Элекропечь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрическая печь ";
				  $category_prefix[] = "Элекрокаменка ";
				  }
				elseif 
				($category_id == '78') 
			    {
				$category_prefix = "Печь для бани ";
                }						  
				else
				{
                $category_prefix = null;
				}; 				
                
			   
				//Проверка типа переменной 
                if (is_array($category_prefix)) 
				{
				$prefix = $category_prefix[++$a];	
				}
				elseif (is_string($category_prefix))  
				{
				$prefix = $category_prefix;
				}
				 else
				{
                $prefix = null;
				}; 	 
				    
					
				$data['products'][] = array(
					'product_id'  => $result['product_id'],
					'thumb'       => $image,
					'name'        => $prefix.$result['name'],
					'description' => utf8_substr(trim(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8'))), 0, $this->config->get('theme_' . $this->config->get('config_theme') . '_product_description_length')) . '..',
					'price'       => $price,
					'special'     => $special,
					'tax'         => $tax,
					'minimum'     => $result['minimum'] > 0 ? $result['minimum'] : 1,
					'rating'      => $result['rating'],
					'href'        => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url)
				 );
			}

 



 

Edited by farshmac
Link to post
Share on other sites

7 минут назад, farshmac сказал:

чтоб он мне выводил в название товара в категории из массива поочередно.

вот эту фразу можно по-подробнее, не понянто, что в итоге надо.

К названию товара подставлять еще и его категории по иерархии?
Подставлять только текущую категорию ,в которой находимся?

Link to post
Share on other sites

Posted (edited)
56 минут назад, Prooksius сказал:

К названию товара подставлять еще и его категории по иерархии?
Подставлять только текущую категорию ,в которой находимся?

В зависимости от категории подставлять значение из заданного массива. 

if
			    ($category_id == '138') 
			    {
                 $category_prefix = array();
				  $category_prefix[] = "Элекрокаменка ";
				  $category_prefix[] = "Печька ";
}

В данном примере, в массиве 2 значения, надо чтобы первому товару ушло первое - Электрокамина название товара, второму второе - Печька название товара и далее по кругу, 3 товар - Электрокамина название товара. (устроит вариант, где не будет по кругу, а первым двум будет присвоено значение, а дальше пустые пойдут).

Edited by farshmac
Link to post
Share on other sites

Посетитель поменял сортировку у вас в магазине -  и все названия перепутались.
Удалили товар(ы) в админке - и снова все перепуталось.
Уж я не говорю про смену языка на сайте...

так а в названии товара просто добавить это все через админку почему не хотите? Я смотрю, товаров у вас немного.
P.S. А, пардон, ясно, зависит от того, в какой категории находимся..

Link to post
Share on other sites

Posted (edited)

Спасибо конечно за беспокойство, но если можно, то хотелось бы помощь в реализации идеи.
А так ничего не изменится, что бы пользователь не сделал. Или какие товары не удалить/добавить.
Все манипуляции идут в контролере категории, и подстановка слов идет соответственно на странице категории и ей совершенно все равно, какой именно товар и с какой сортировкой в ней выводится.
Я хочу, что бы к товару, только на уровне категории добавились ключевые слова, которые мне нужны. И у первого товара, каким бы он не был было одно и тоже слово (фраза) перед названием.
Т.е. в категории 25 товаров выводится и если мы задали массив из 25 значений, то как ты не мешай товары, у первого в списке будет название с первым значением массива. 

Что в принципе я уже сделал, но как раз если увеличить число выводимых товаров, приводит к ошибкам (для юзера не видимых), но я хотел бы этого избежать.


ЗЫ я привел пример, товаров у меня тысячи.

 

Вот пример в скринах, с разной сортировкой:

Спойлер

2021-04-27_22-44-49.thumb.jpg.cb5bd3c0e2b2ba8d8059cc84674f3fc8.jpg

 

 

 

2021-04-27_22-45-11.thumb.jpg.5b735d0749709c802e96fa89570359d8.jpg



 

Edited by farshmac
Link to post
Share on other sites

Во-первых, нужно перед началом цикла перебора товаров определить три переменные:

// Это массив первого условия
$category_prefix1 = array('Элеткрокамин', 'Эл камин', 'Электрокамин', ... , 'Каминокомплект');

// Это массив второго условия
$category_prefix2 = array('Элекрокаменка', 'Элекрокаменка', 'Элекрокаменка', ... , 'Элекрокаменка');

// это когда только одно значение добавки
$category_prefix3 = 'Печь для бани';

и уже в цикле вписать ваши условия в зав. от категорий

if (in_array($category_id, [94, 95, 100, 102], TRUE)) {
	$category_prefix = $category_prefix1;
} elseif ($category_id == '138') {
	$category_prefix = $category_prefix2;
} // ну и так далее


потом непонятно что вот здесь за $a:

$prefix = $category_prefix[++$a];

предполагаю, порядковый номер товара в цикле.
ну как вариант, если мешают ошибки, вероятно, не находится по номеру. Можно так сделать:

$prefix = isset($category_prefix[++$a]) ? $category_prefix[$a] : '';

и уже в заполнении названия товара:

'name'        => (!empty($prefix) ? ' ' . $prefix : '') . $result['name'],

- пробел можно один раз добавить.

Но это все страшный костыль, конечно...

  • +1 1
Link to post
Share on other sites

непонятно, как в разной сортировке товаров подходят одни и те же добавки..

По идее нужно для каждого товара в админке сделать такое поле, "добавка", но оно будет сложное, в зав. от категорий. То есть выбираем категорию - для нее задаем добавку к этому товару, выбираем еще категорию - и к ней добавку.
И уже на сайте читать эти значения из БД и просто добавлять к названию.
Так будет правильнее.

Link to post
Share on other sites

Posted (edited)

Спасибо, написал по вашему примеру, по итогу ничего не изменилось. 
Поясню. Мне надо оптимизировать страницы категорий под поисковик. Самый удобный вариант, как по мне проработать пару сотен категорий, пусть даже тысячу, чем десятки тысяч товаров. Как правильно, меня мало волнует, у многих конкурентов такой вариант, который я пытаюсь сделать реализован, как они мне конечно не скажут. Но мне кажется я иду по пути наименьшего сопротивления. Важно создать плотность по основному ключу и добавить все другие, которые мне нужны, и которые трудно добавить не в названии товара.

Да может показаться, что проще проработать выдачу по каждой категории, но это не так. Все товары имеют несколько категорий, некоторые более 10. И как сделать так, чтобы задавать сортировку по определенной категории мне не известно.
И так? вот в чем моя проблема. Это уже после ваших правок.
ЗЫ У меня не хватает знаний и поиск не помогает. Есть ли какая-то возможность зациклить массив, чтоб он отдавал 21, 22... какое-то значение. И как это сделать уже в цикле)

 

Спойлер

2021-04-28_00-30-48.jpg.77b1970a58786a5ef85ce735c64edfdc.jpg

Вот какой код у меня получился.
 

Спойлер
//Элекрокамины
				  $category_electrokamin = array(); 
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Эл камин ";
				  $category_electrokamin[] = "Электрокамин ";
				  $category_electrokamin[] = "Электрический камин ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Эл камин ";
				  $category_electrokamin[] = "Электрокамин ";
				  $category_electrokamin[] = "Электрический камин ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
				  $category_electrokamin[] = "Элеткрокамин ";
				  $category_electrokamin[] = "Каминокомплект ";
                				    
				//Элекрокаменка
			    ($category_id == '138') 
			    {
                 $category_elecrokamenka = array();
				  $category_elecrokamenka[] = "Элекрокаменка ";
				  $category_elecrokamenka[] = "Элекрокаменка ";
				  $category_elecrokamenka[] = "Элекрокаменка ";
				  $category_elecrokamenka[] = "Элекропечь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрическая печь ";
				  $category_elecrokamenka[] = "Элекрокаменка ";
				//Печь для бани
				$category-dly-bany = "Печь для бани ";
                

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

			$results = $this->model_catalog_product->getProducts($filter_data);

			foreach ($results as $result) {
				if ($result['image']) {
					$image = $this->model_tool_image->resize($result['image'], $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_height'));
				} else {
					$image = $this->model_tool_image->resize('placeholder.png', $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_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;
				}

				if ($this->config->get('config_review_status')) {
					$rating = (int)$result['rating'];
				} else {
					$rating = false;
				}
                
				if 
				 (in_array($category_id, [94, 95, 100, 102], TRUE))
				 {	
                $category_prefix = $category_electrokamin;
			     } 
				 elseif ($category_id == '138') 
				 {
	            $category_prefix = $category_elecrokamenka;
				}
				 elseif ($category_id == '78')
				 
				 {
	            $category_prefix = $category-dly-bany;
			   } 
			                    
				
				$prefix = isset($category_prefix[++$a]) ? $category_prefix[$a] : '';
				
				$data['products'][] = array(
					'product_id'  => $result['product_id'],
					'thumb'       => $image,
					'name'        > (!empty($prefix) ? ' ' . $prefix : '') . $result['name'],
					'description' => utf8_substr(trim(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8'))), 0, $this->config->get('theme_' . $this->config->get('config_theme') . '_product_description_length')) . '..',
					'price'       => $price,
					'special'     => $special,
					'tax'         => $tax,
					'minimum'     => $result['minimum'] > 0 ? $result['minimum'] : 1,
					'rating'      => $result['rating'],
					'href'        => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url)
				 );
			}

 

Edited by farshmac
Link to post
Share on other sites

Posted (edited)

Обновил, еще раз все перепроверил и переделал.
1) В итоге ругается на строку, в любых категориях: Undefined variable: a 

Цитата

$prefix = isset($category_prefix[++$a]) ? $category_prefix[$a] : '';


Что такое [++$a] я точно не знаю, я думал с помощью этого перебираются ключи массива по очереди.  

 

2) Там где нет массива, а одно значение  выводятся знаки вопросов.

17 часов назад, Prooksius сказал:

$category_prefix3 = 'Печь для бани';

Спойлер

2021-04-28_16-39-14.jpg.21a67d16189eead8755d04938a72ad59.jpg

А так выводятся 3 "добавки", если в массиве 3 ключа, что в принципе меня устраивает. Хотя возможно лучше бы было бы, что бы шло повторение. 

 

Спойлер

2021-04-28_16-38-05.thumb.jpg.d1eae10a2a27c00d4f3e116d73b280a5.jpg

 

Edited by farshmac
Link to post
Share on other sites

вместо

foreach ($results as $result) {

напишите

foreach ($results as $a => $result) {

и тогда ++ уберите из той строки, где ошибка

 

 

52 минуты назад, farshmac сказал:

Хотя возможно лучше бы было бы, что бы шло повторение

так продублируйте значения в вашем массиве

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.