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

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


Recommended Posts

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

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

Link to post
Share on other sites

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

$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
Link to post
Share on other sites
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 %}

 

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

Link to post
Share on other sites

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

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

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

 

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

 

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

Link to post
Share on other sites
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;
}

 

Link to post
Share on other sites

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

if (!$option_exist

Где вы у меня это видели?

Link to post
Share on other sites
3 минуты назад, chukcha сказал:

Где вы у меня это видели?

 

а без этого ошибка 500    0_о

Link to post
Share on other sites

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

а без этого ошибка

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

Link to post
Share on other sites
4 минуты назад, chukcha сказал:

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

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

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

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

{% if not option_exist %}

текст

{% endif %}

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

Link to post
Share on other sites

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

Какая у вас версия сборки?

 

OcStore 2.3

Link to post
Share on other sites

Теперь ругается что не может найти переменную(((

Notice: Undefined variable: option_exist in

как сложно оказалось все

Link to post
Share on other sites

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

Link to post
Share on other sites

Posted (edited)
13 часов назад, chukcha сказал:

$data['option_exist']

 

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

$data['options_exist'] = false;

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

Edited by Tobolskiy
Link to post
Share on other sites

Вариант решения на примере 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
Link to post
Share on other sites

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

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


 

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

 

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

 

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

Link to post
Share on other sites

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

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


 

Цитата

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

 

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

Link to post
Share on other sites
4 часа назад, searchingman сказал:

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

 

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

 

 

Link to post
Share on other sites

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

 

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

 

 

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

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

  • +1 1
Link to post
Share on other sites

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

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

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

 

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

Link to post
Share on other sites

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

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

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

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

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

Link to post
Share on other sites

В 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. В итоге на дефолтном шаблоне  будет выглядеть так.

Edited by searchingman
  • +1 2
Link to post
Share on other sites

В 09.04.2021 в 15:04, searchingman сказал:

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

 

 

Спасибо большое!!!

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.