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

Жёстко виснет сайт при переходе в категорию. Помогите разобраться.


Recommended Posts

Добавил вывод опций в каталог. Вывожу их вот так:

Спойлер

<div class="options">

                  <?php if ($product['options']) { ?>

                    <div id="option_<?php echo $product['product_id']; ?>">

                    <?php foreach ($product['options'] as $option) { ?>

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

                        <?php if ($option['option_id'] == '11') { ?>

                            <div id="option-<?php echo $option['product_option_id']; ?>" class="option">

                              <?php foreach ($option['product_option_value'] as $option_value) { ?>

                              <div class="option-value hidden">

                                <input type="radio" name="option[<?php echo $option['product_option_id']; ?>]" value="<?php echo $option_value['product_option_value_id']; ?>" id="option-value-<?php echo $option_value['product_option_value_id']; ?>" data-optprice="<?php echo number_format(preg_replace("/\..+$/", "", $option_value['price']), 0, '', '') ?>" />

                                <label for="option-value-<?php echo $option_value['product_option_value_id']; ?>" name="<?php echo $option_value['name']; ?>">

                                  <?php echo $option_value['name']; ?>

                                </label>

                              </div>

                              <?php } ?>

                            </div>

                        <?php } ?>

                      <?php } ?>

                    <?php } ?>

                  </div>

                  <?php } ?>

</div>

 

 

 

В контроллере добавил:

$options = $this->model_catalog_product->getProductOptions($result['product_id']);

 

И в контроллере в $data['products'][] = array(

добавил:

'options' => $options,

 

Проблем в том, что при переходе в категорию жёстко долго грузится страница. Может минуту висеть. В чём проблема? Помогите.

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


потому что видимо много товаров и это прям больной запрос

вам нужно получать опции более простым способом

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

16 минут назад, spectre сказал:

потому что видимо много товаров и это прям больной запрос

вам нужно получать опции более простым способом

Вроде этого?

Спойлер

$options = array();
foreach ($this->model_catalog_product->getProductOptions($this->request->get['product_id']) as $option) {
	$product_option_value_data = array();
	foreach ($option['product_option_value'] as $option_value) {
		if (!$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']) {
				$oprice = $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 {
				$oprice = false;
			}
			$product_option_value_data[] = array(
				'product_option_value_id' => $option_value['product_option_value_id'],
				'option_value_id'         => $option_value['option_value_id'],
				'name'                    => $option_value['name'],
				'image'                   => $option_value['image'] ? $this->model_tool_image->resize($option_value['image'], 100, 100) : '',
				'price'                   => $oprice,
				'price_prefix'            => $option_value['price_prefix']
			);
		}
	}
	$options[] = array(
		'product_option_id'    => $option['product_option_id'],
		'product_option_value' => $product_option_value_data,
		'option_id'            => $option['option_id'],
		'name'                 => $option['name'],
		'type'                 => $option['type'],
		'value'                => $option['value'],
		'required'             => $option['required']
	);
}

 

 

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


13 минут назад, DenKuzmin сказал:

Вроде этого?

Это Вы уже что-то совсем не то делаете.
Сама getProductOptions всё это уже возвращает.
 

 

42 минуты назад, DenKuzmin сказал:

Проблем в том, что при переходе в категорию жёстко долго грузится страница. Может минуту висеть. В чём проблема? Помогите.

А сколько у Вас товаров в этой категории. И в среднем сколько опций на товар?

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

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

А сколько у Вас товаров в этой категории. И в среднем сколько опций на товар?

Где-то 48 товаров на листе. Всего около 350 в категории. В каждом товаре примерно 5 групп опций. В группах от 6 до 40 опций.

8 минут назад, nogocuHoBuk сказал:

Это Вы уже что-то совсем не то делаете.
Сама getProductOptions всё это уже возвращает.

Делаю по аналогии в файле product.php

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


5 минут назад, DenKuzmin сказал:

Где-то 48 товаров на листе. Всего около 350 в категории. В каждом товаре примерно 5 групп опций. В группах от 6 до 40 опций.

Общее количество в категории не играет роли. Запрос ограничен количеством на странице.
А если уменьшить количество товаров до 12, например? 
Просто 48 товаров, обход циклом. В цикле 5 групп опций, да по 6-20 опций. 
Делать "по аналогии" - равносильно прямому запросу. Это не ускорит выполнение. Нужно как-то оптимизировать сам запрос и написать свою функцию получения опций с фильтром (к примеру пропустить какие-то, )
типа: 
MygetProductOptions($result['product_id'],$filter);
ну а в фильтре уже указывать группы опций, или прямо задать какие именно опции нужны.

 

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

Только что, nogocuHoBuk сказал:

Нужно как-то оптимизировать сам запрос и написать свою функцию получения опций с фильтрами (к примеру пропустить какие-то)

Мне по сути нужна только одна группа опций с id= 11

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


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

А если уменьшить количество товаров до 12, например? 

Уменьшил до 12 на страницу. Стало быстрее примерно в 2,5 раза.

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


26 минут назад, DenKuzmin сказал:

Мне по сути нужна только одна группа опций с id= 11

В catalog/model/catalog/product.php полностью копируете функцию 
getProductOptions()
В скопированной функции переименовываете название на MygetProductOptions и после $product_id добавляете ещё один параметр - $option_id можно с дефолтным значением:
Получится так: 
 

public function MygetProductOptions($product_id,$option_id = 11) {


А в строке запроса, где $product_option_query = ... добавляете фильтр по опции, т.е. перед po.product_id ставите проверку
Получится примерно так: 
было

WHERE po.product_id

стало:
 

WHERE o.option_id = '" . (int)$option_id . "' AND po.product_id


Итоговая функция:
 

public function MygetProductOptions($product_id, $option_id = 11) {
		$product_option_data = array();

		$product_option_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option po LEFT JOIN `" . DB_PREFIX . "option` o ON (po.option_id = o.option_id) LEFT JOIN " . DB_PREFIX . "option_description od ON (o.option_id = od.option_id) WHERE o.option_id = '" . (int)$option_id . "' AND po.product_id = '" . (int)$product_id . "' AND od.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY o.sort_order");

		foreach ($product_option_query->rows as $product_option) {
			$product_option_value_data = array();

			$product_option_value_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_value pov LEFT JOIN " . DB_PREFIX . "option_value ov ON (pov.option_value_id = ov.option_value_id) LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (ov.option_value_id = ovd.option_value_id) WHERE pov.product_id = '" . (int)$product_id . "' AND pov.product_option_id = '" . (int)$product_option['product_option_id'] . "' AND ovd.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY ov.sort_order");

			foreach ($product_option_value_query->rows as $product_option_value) {
				$product_option_value_data[] = array(
					'product_option_value_id' => $product_option_value['product_option_value_id'],
					'option_value_id'         => $product_option_value['option_value_id'],
					'name'                    => $product_option_value['name'],
					'image'                   => $product_option_value['image'],
					'quantity'                => $product_option_value['quantity'],
					'subtract'                => $product_option_value['subtract'],
					'price'                   => $product_option_value['price'],
					'price_prefix'            => $product_option_value['price_prefix'],
					'weight'                  => $product_option_value['weight'],
					'weight_prefix'           => $product_option_value['weight_prefix']
				);
			}

			$product_option_data[] = array(
				'product_option_id'    => $product_option['product_option_id'],
				'product_option_value' => $product_option_value_data,
				'option_id'            => $product_option['option_id'],
				'name'                 => $product_option['name'],
				'type'                 => $product_option['type'],
				'value'                => $product_option['value'],
				'required'             => $product_option['required']
			);
		}

		return $product_option_data;
	}



Ну и теперь в контроллере вызывайте вместо
 

$options = $this->model_catalog_product->getProductOptions($result['product_id']);

нужно заменить на

$options = $this->model_catalog_product->MygetProductOptions($result['product_id']);

А если нужно сменить в запросе группу, то так:

 

$options = $this->model_catalog_product->MygetProductOptions($result['product_id'],12);

Т.е. запрос будет по группе 12

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

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

У меня нет $product_option_query в product.php

точно тут смотрите?

  

55 минут назад, nogocuHoBuk сказал:

В catalog/model/catalog/product.php

 

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

21 минуту назад, nogocuHoBuk сказал:

точно тут смотрите?

Блин, не там смотрел.

 

В контроллер так?

Спойлер

$options = array();
foreach ($this->model_catalog_product->MygetProductOptions($result['product_id']) as $option) {
	$product_option_value_data = array();
	foreach ($option['product_option_value'] as $option_value) {
		if (!$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']) {
				$oprice = $this->currency->format($this->tax->calculate($option_value['price'], $result['tax_class_id'], $this->config->get('config_tax') ? 'P' : false), $this->session->data['currency']);
			} else {
				$oprice = false;
			}
			$product_option_value_data[] = array(
				'product_option_value_id' => $option_value['product_option_value_id'],
				'option_value_id'         => $option_value['option_value_id'],
				'name'                    => $option_value['name'],
				'image'                   => $option_value['image'] ? $this->model_tool_image->resize($option_value['image'], 100, 100) : '',
				'price'                   => $oprice,
				'price_prefix'            => $option_value['price_prefix']
			);
		}
	}
	$options[] = array(
		'product_option_id'    => $option['product_option_id'],
		'product_option_value' => $product_option_value_data,
		'option_id'            => $option['option_id'],
		'name'                 => $option['name'],
		'type'                 => $option['type'],
		'value'                => $option['value'],
		'required'             => $option['required']
	);
}

 

 

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


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

В контроллер так?

Я ж понятия не имею как Вы всё выводите и что обрабатываете. По кускам кода сложно "догадаться" :)

Для начала верните как было у Вас в первом посте
т.е.
 

 

2 часа назад, DenKuzmin сказал:

В контроллере добавил:




$options = $this->model_catalog_product->getProductOptions($result['product_id']);

 

И в контроллере в $data['products'][] = array(

добавил:




'options' => $options,

 

Проблем в том, что при переходе в категорию жёстко долго грузится страница. Может минуту висеть. В чём проблема? Помогите.

Только  вместо 
$options = $this->model_catalog_product->getProductOptions($result['product_id']);
будет
$options = $this->model_catalog_product->MygetProductOptions($result['product_id']);

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

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

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

$options = $this->model_catalog_product->getProductOptions($result['product_id']);
будет
$options = $this->model_catalog_product->MygetProductOptions($result['product_id']);

Заработало. Спасибо большое!

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


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

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

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

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

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

Вхід

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

Вхід зараз
×
×
  • Створити...

Important Information

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