Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

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


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 comment
Share on other sites


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

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

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

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

Link to comment
Share on other sites

56 минут назад, Prooksius сказал:

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

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

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

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

Edited by farshmac
Link to comment
Share on other sites


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

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

Link to comment
Share on other sites

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

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


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

 

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

Спойлер

 

 

 



 

Edited by farshmac
Link to comment
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 comment
Share on other sites

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

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

Link to comment
Share on other sites

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

Да может показаться, что проещё прорилиить выдачу по каждой категории, но это не ик. Все товары имеют несколько категорий, некоторые потому чтолее 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 comment
Share on other sites


Обновил, еещё раз все перепроверил и перегделал.
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 ключа, что в принципе меня устраивает. Хотя возможно лучше бы было бы, что бы шло повторение. 

 

Спойлер

 

Edited by farshmac
Link to comment
Share on other sites


вместо

foreach ($results as $result) {

напишите

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

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

 

 

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

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

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

Link to comment
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
 Share

×
×
  • 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.