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

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


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,

 

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

Link to comment
Share on other sites


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

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

Link to comment
Share on other sites

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']
	);
}

 

 

Link to comment
Share on other sites


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

Врогде этого?

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

 

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

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

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

  • +1 1
Link to comment
Share on other sites

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

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

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

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

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

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

Link to comment
Share on other sites


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

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

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

 

  • +1 1
Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites


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

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

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

Link to comment
Share on other sites


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

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

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

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

  

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

В catalog/model/catalog/product.php

 

  • +1 1
Link to comment
Share on other sites

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']
	);
}

 

 

Link to comment
Share on other sites


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

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

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

Зарилиило. Спасипотому что потому чтольшое!

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.