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

Если все опции с количеством 0 - выводим текст


Tobolskiy

Recommended Posts

Всем привет! Подскажите пожалуйста, на странице товара есть опции, они все зависимы на "вычитать со склада", то есть, если все опции будут с количеством 0, опции показываться не будут, как сделать так, что бы если опций нет (у всех кол-во 0) выводить какой то текст, например "опции не доступны"...

Буду благодарен если найдется рабочее решение. Заранее спасибо!!!

Надіслати
Поділитися на інших сайтах


решать комлексно

$option_exist = false;

foreach ($option['product_option_value'] as $option_value) {

 $option_exist  = $option_exist  || (!$option_value['subtract'] || ($option_value['quantity'] > 0) 

 

 

 

{% if not option_exist %}

текст

{% endif %}

  • +1 1
Надіслати
Поділитися на інших сайтах

1 час назад, chukcha сказал:

$option_exist = false;

foreach ($option['product_option_value'] as $option_value) {

 $option_exist  = $option_exist  || (!$option_value['subtract'] || ($option_value['quantity'] > 0) 

 

это в контроллер product.php после какой строчки нужно?

 

1 час назад, chukcha сказал:

{% if not option_exist %}

текст

{% endif %}

 

это в шаблон, тут понял))

Надіслати
Поділитися на інших сайтах


1 минуту назад, Tobolskiy сказал:

foreach ($option['product_option_value'] as $option_value) {

Это базовая строка контроллера

 

Если опций несколько

 

$option_exist[$option['option_id']] = false;

Надіслати
Поділитися на інших сайтах

1 час назад, chukcha сказал:

Это базовая строка контроллера

 

Если опций несколько

 

$option_exist[$option['option_id']] = false;

 

 

 

Получается в контроллер так?

 

$option_exist[$option['option_id']] = false;
foreach ($option['product_option_value'] as $option_value) {
if (!$option_exist  = $option_exist  || (!$option_value['subtract'] || ($option_value['quantity'] > 0))) {
if ((($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) && (float)$option_value['price']) {
$price = $this->currency->format($this->tax->calculate($option_value['price'], $product_info['tax_class_id'], $this->config->get('config_tax') ? 'P' : false), $this->session->data['currency']);
} else {
$price = false;
}

 

Надіслати
Поділитися на інших сайтах


4 минуты назад, chukcha сказал:

точки с запятой не было?

нет)) скопировал как написали, можно сделать так

$option_exist  = $option_exist  || (!$option_value['subtract'] || ($option_value['quantity'] > 0));

но тогда во фронте код

{% if not option_exist %}

текст

{% endif %}

выводится как есть и не обрабатывается 

Надіслати
Поділитися на інших сайтах


Ну либо я не туда вставляю, или не так, или еще что то дофантазировать нужно (что пришло в голову попробовал) но при таком раскладе либо ошибка 500 либо всегда выводится текст вне зависимости от опций. возможно я окончательно запутался и тп

Надіслати
Поділитися на інших сайтах


13 часов назад, chukcha сказал:

$data['option_exist']

 

Это должно иметь такой вид?

$data['options_exist'] = false;

или как вы написали?

Змінено користувачем Tobolskiy
Надіслати
Поділитися на інших сайтах


Вариант решения на примере ocStore 2.3.0.2.4 (дефолтный шаблон)

1. В контроллере карточки товара catalog\controller\product\product.php

Спойлер

 

После строки


$data['options'] = array();


Добавляем


$data['options_exist'] = false; // опций нет

После строки 


if (!$option_value['subtract'] || ($option_value['quantity'] > 0)) {


Добавляем


$data['options_exist'] = true; // есть хотя бы одна опция (вычитать со склада - Да и остаток > 0)


 

2. В вьюхе карточки товара catalog\view\theme\default\template\product\product.tpl

Спойлер

 

Вместо


<?php if ($options) { ?>


Заменяем на


<?php if ($options && $options_exist) { ?>

В конце блока условия, т.е. перед


<?php } ?>


Добавляем


<?php } else { ?>
  <h3>Опций нет</h3>

В нужных типах опций, н-р, 
для списка вместо


<?php if ($option['type'] == 'select') { ?>


вставляем  


<?php if ($option['type'] == 'select' && $option['product_option_value']) { ?>

для переключателей вместо


<?php if ($option['type'] == 'radio') { ?>


вставляем


<?php if ($option['type'] == 'radio' && $option['product_option_value']) { ?>

для флажков вместо


<?php if ($option['type'] == 'checkbox') { 


вставляем


<?php if ($option['type'] == 'checkbox' && $option['product_option_value']) { ?>


 

3. Логика работы после изменений.
Если все опции с (вычитать со склада - Да и Остаток = 0), то показывается текст "Опций нет"
Если у конкретного типа опций (список, флажок, переключатель) нет опций (вычитать со склада - Да и Остаток > 0), то опция не показывается.
Если у конкретного типа опций (список, флажок, переключатель) есть опции (вычитать со склада - Нет), то опция показывается


 

  • +1 2
Надіслати
Поділитися на інших сайтах


57 минут назад, searchingman сказал:

3. Логика работы после изменений.
Если все опции с (вычитать со склада - Да и Остаток = 0), то показывается текст "Опций нет"
Если у конкретного типа опций (список, флажок, переключатель) нет опций (вычитать со склада - Да и Остаток > 0), то опция не показывается.
Если у конкретного типа опций (список, флажок, переключатель) есть опции (вычитать со склада - Нет), то опция показывается


 

Спасибо большое за ваше решение, работает! Спасибо за труд!!!

 

13 часов назад, chukcha сказал:

 

Простите что я такой тупой)))

Надіслати
Поділитися на інших сайтах


1 час назад, Tobolskiy сказал:

Простите что я такой тупой)))


 

Цитата

Чукча рыбачит на берегу Берингова пролива. Вдруг всплывает американская подводная лодка. Оттуда спрашивают:
- Как проплыть к морю Лаптевых?
- Норд-норд-ост.
- О'кей, сэнкью, гуд бай!
Через час всплывает наша подлодка.
- Эй, чукча, тут не проходила американская подводная лодка?
- Да.
- А куда она пошла?
- Норд-норд-ост.
- Да ты не умничай, ты рукой покажи!

 

Я только рукой показал

Надіслати
Поділитися на інших сайтах

4 часа назад, searchingman сказал:

Вариант решения на примере ocStore 2.3.0.2.4 (дефолтный шаблон)

 

Буду благодарен если подскажете как сделать то же самое для catalog, там код немного отличается.

 

 

Надіслати
Поділитися на інших сайтах


1 час назад, Tobolskiy сказал:

 

Буду благодарен если подскажете как сделать то же самое для catalog, там код немного отличается.

 

 

Если речь, про страницы категорий товаров, то в дефолтном шаблоне на страницах категорий  опции для товаров не выводятся.

Если у Вас выводятся, то логичнее обратиться к разработчику шаблона.

  • +1 1
Надіслати
Поділитися на інших сайтах


9 минут назад, searchingman сказал:

Если речь, про страницы категорий товаров, то в дефолтном шаблоне на страницах категорий  опции для товаров не выводятся.

Если у Вас выводятся, то логичнее обратиться к разработчику шаблона.

 

нет, тоже не выводятся, но в категории товаров нужно просто текст "есть опции" "нет опции" - без непосредственно самих опций.

Надіслати
Поділитися на інших сайтах


3 часа назад, searchingman сказал:

Если речь, про страницы категорий товаров, то в дефолтном шаблоне на страницах категорий  опции для товаров не выводятся.

Если у Вас выводятся, то логичнее обратиться к разработчику шаблона.

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

в контроллере ничего связанного с опциями действительно не нашел

Надіслати
Поділитися на інших сайтах


В 06.04.2021 в 17:45, Tobolskiy сказал:

 

Буду благодарен если подскажете как сделать то же самое для catalog, там код немного отличается.

 

 

Для ocStore 2.3.0.2.4 (дефолтный шаблон)

1. В файле модели catalog\model\catalog\product.php

Спойлер

// в конце перед закрывающей 
}
// добавляем
	/**
	 * Получить IDs товаров для показа с условиями:
	 * - у опции  товара установлено (вычитать со склада - Да и Остаток > 0)
	 * - у опции товара установлено (вычитать со склада - Нет))
	 *
	 * @param array $product_ids , н-р, [33, 68, 84]
	 * @return array 
	 */
	public function getIdsProductsOptionsWithConditions($product_ids)
	{
		$query = $this->db->query("SELECT product_id, SUM(CASE WHEN (quantity > 0 AND subtract = 1 OR subtract = 0) THEN 1 ELSE 0 END) AS show_option FROM " . DB_PREFIX . "product_option_value WHERE  product_id IN (" . implode(",", $product_ids) . ") GROUP BY product_id");
 
		return $query->rows;
	}

 

2. В контроллере catalog\controller\product\category.php

Спойлер

// после
$data['products'] = array();
// вставить
$ids_subtract_quantity = array(); // ++++ 
// после
foreach ($results as $result) {
// вставить
$ids_subtract_quantity[] = $result['product_id']; // ++++ add id product
// после блока
$data['products'][] = array(
					'product_id'  => $result['product_id'],
					'thumb'       => $image,
					'name'        => $result['name'],
					'description' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, $this->config->get($this->config->get('config_theme') . '_product_description_length')) . '..',
					'price'       => $price,
					'special'     => $special,
					'tax'         => $tax,
					'minimum'     => ($result['minimum'] > 0) ? $result['minimum'] : 1,
					'rating'      => $rating,
					'href'        => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url)
				);
			}
//вставить
			// +++++
			if ($ids_subtract_quantity) {
				$data['ids_subtract_quantity'] = array();
				$ids_subtract_quantity = $this->model_catalog_product->getIdsProductsOptionsWithConditions($ids_subtract_quantity);
				foreach ($ids_subtract_quantity as $id_subtract_quantity) {
					if ($id_subtract_quantity['show_option'] > 0)
						$data['ids_subtract_quantity'][] = $id_subtract_quantity['product_id'];
				}
			}
			// +++++

 

3. в файле представления catalog\view\theme\default\template\product\category.tpl

Спойлер

// после блока
                      <p class="price">
                        <?php if (!$product['special']) { ?>
                          <?php echo $product['price']; ?>
                        <?php } else { ?>
                          <span class="price-new"><?php echo $product['special']; ?></span> <span class="price-old"><?php echo $product['price']; ?></span>
                        <?php } ?>
                        <?php if ($product['tax']) { ?>
                          <span class="price-tax"><?php echo $text_tax; ?> <?php echo $product['tax']; ?></span>
                        <?php } ?>
                      </p>
// вставить
                      <?php if (isset($ids_subtract_quantity) && in_array($product['product_id'], $ids_subtract_quantity)) { ?>
                        <h5>Опции есть</h5>
                      <?php } else { ?>
                        <h5>Опций нет!</h5>
                      <?php } ?>

 

4. В итоге на дефолтном шаблоне  будет выглядеть так.

Змінено користувачем searchingman
  • +1 2
Надіслати
Поділитися на інших сайтах


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

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

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

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

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

Вхід

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

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

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

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

Important Information

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