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

Сделать меню кешируемым


d2boy

Recommended Posts

Дописывал модуль под OC2 для вывода меню подкатегорий для заданной родительской категории.

Всё работает, но захотелось сделать меню с кешем


Нашёл нечто похожее от @Yesvik для стандартного модуля категорий. Нашёл похожий метод в моделе админки.

 

Но у меня реализация отличается, вот код

Spoiler

 


<?php
class ControllerModuleCatbyparrent extends Controller {
	public function index($setting) {


		$this->load->model('catalog/category');
        $this->load->model('setting/setting');

		if (isset($this->request->get['path'])) {
			$parts = explode('_', (string)$this->request->get['path']);
		} else {
			$parts = array();
		}

		if (isset($parts[0])) {
			$data['category_id'] = $parts[0];
		} else {
			$data['category_id'] = 0;
		}

		if (isset($parts[1])) {
			$data['child_id'] = $parts[1];
		} else {
			$data['child_id'] = 0;
		}
		
		if (isset($parts[2])) {
			$data['child_id2'] = $parts[2];
		} else {
			$data['child_id2'] = 0;
		}		
		
		if (isset($parts[3])) {
			$data['child_id3'] = $parts[3];
		} else {
			$data['child_id3'] = 0;
		}

  	$data['title'] = html_entity_decode($setting['title'][$this->config->get('config_language_id')]['title'], ENT_QUOTES, 'UTF-8');	  
	$data['categories'] = array();
		
		$categories_1 = $this->model_catalog_category->getAllCategories($setting['parent']);

		foreach ($categories_1 as $category_1) {
			$level_2_data = array();

			$categories_2 = $this->model_catalog_category->getAllCategories($category_1['category_id']);

			foreach ($categories_2 as $category_2) {
				$level_3_data = array();

				$categories_3 = $this->model_catalog_category->getAllCategories($category_2['category_id']);

				foreach ($categories_3 as $category_3) {
					
					$level_4_data = array();

					$categories_4 = $this->model_catalog_category->getAllCategories($category_3['category_id']);

					foreach ($categories_4 as $category_4) {
						$level_4_data[] = array(
							'category_id' => $category_4['category_id'],
							'name' => $category_4['name'],
							'href' => $this->url->link('product/category', 'path=' . $category_1['category_id'] . '_' . $category_2['category_id'] . '_' . $category_3['category_id'] . '_' . $category_4['category_id'])
						);
	
					}

					$level_3_data[] = array(
						'category_id' => $category_3['category_id'],
						'name' => $category_3['name'],
						'children' => $level_4_data,
						'href' => $this->url->link('product/category', 'path=' . $category_1['category_id'] . '_' . $category_2['category_id'] . '_' . $category_3['category_id'])
					);
	
				}

					$level_2_data[] = array(
						'category_id' => $category_2['category_id'],
						'name'     => $category_2['name'],
						'children' => $level_3_data,
						'href'     => $this->url->link('product/category', 'path=' . $category_1['category_id'] . '_' . $category_2['category_id'])
					);
			}

			$data['categories'][] = array(
				'category_id' => $category_1['category_id'],
				'name'     => $category_1['name'],
				'children' => $level_2_data,
				'href'     => $this->url->link('product/category', 'path=' . $category_1['category_id'])
			);
		}

	if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/module/cat-by-parrent.tpl')) {
		return $this->load->view($this->config->get('config_template') . '/template/module/cat-by-parrent.tpl',$data);
	} else {
		return $this->load->view('default/template/module/cat-by-parrent.tpl', $data);

}
}
}

 

 

Может быть подскажет кто-нибудь, как это лучше реализовать?

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


1 година назад, d2boy сказав:

Может быть подскажет кто-нибудь, как это лучше реализовать?

Просто берёте $data['categories'] перед строками рендера и запихиваете в кеш с ключом соответствующим текущему запросу.

Соответственно, в начале файла проверяете по этому ключу есть ли оно уже в кеше.

 

$data['categories'] = $this->cache->get('category.menu.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (string)$this->request->get['path']);

if (empty($data['categories']) {
   /*
   * Код генерации меню
   */

   $this->cache->set('category.menu.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (string)$this->request->get['path'], $$data['categories']);
}

if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/module/cat-by-parrent.tpl')) {
...

 

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


On 11/24/2020 at 6:31 AM, Dotrox said:

Просто берёте $data['categories'] перед строками рендера и запихиваете в кеш с ключом соответствующим текущему запросу.

Соответственно, в начале файла проверяете по этому ключу есть ли оно уже в кеше.

 


$data['categories'] = $this->cache->get('category.menu.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (string)$this->request->get['path']);

if (empty($data['categories']) {
   /*
   * Код генерации меню
   */

   $this->cache->set('category.menu.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (string)$this->request->get['path'], $$data['categories']);
}

if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/module/cat-by-parrent.tpl')) {
...

 

 

Огромное спасибо, подправил в паре мест и заработало

 

Spoiler

<?php
class ControllerModuleCatbyparrent extends Controller {
	public function index($setting) {


		$this->load->model('catalog/category');
        $this->load->model('setting/setting');

		if (isset($this->request->get['path'])) {
			$parts = explode('_', (string)$this->request->get['path']);
		} else {
			$parts = array();
		}

		if (isset($parts[0])) {
			$data['category_id'] = $parts[0];
		} else {
			$data['category_id'] = 0;
		}

		if (isset($parts[1])) {
			$data['child_id'] = $parts[1];
		} else {
			$data['child_id'] = 0;
		}
		
		if (isset($parts[2])) {
			$data['child_id2'] = $parts[2];
		} else {
			$data['child_id2'] = 0;
		}		
		
		if (isset($parts[3])) {
			$data['child_id3'] = $parts[3];
		} else {
			$data['child_id3'] = 0;
		}

  	$data['title'] = html_entity_decode($setting['title'][$this->config->get('config_language_id')]['title'], ENT_QUOTES, 'UTF-8');	  
	$data['categories'] = array();
	$data['categories'] = $this->cache->get('category.menu.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id'));

	if (empty($data['categories'])) {
	
		$categories_1 = $this->model_catalog_category->getCategories($setting['parent']);

		foreach ($categories_1 as $category_1) {
			$level_2_data = array();

			$categories_2 = $this->model_catalog_category->getCategories($category_1['category_id']);

			foreach ($categories_2 as $category_2) {
				$level_3_data = array();

				$categories_3 = $this->model_catalog_category->getCategories($category_2['category_id']);

				foreach ($categories_3 as $category_3) {
					
					$level_4_data = array();

					$categories_4 = $this->model_catalog_category->getCategories($category_3['category_id']);

					foreach ($categories_4 as $category_4) {
						$level_4_data[] = array(
							'category_id' => $category_4['category_id'],
							'name' => $category_4['name'],
							'href' => $this->url->link('product/category', 'path=' . $category_1['category_id'] . '_' . $category_2['category_id'] . '_' . $category_3['category_id'] . '_' . $category_4['category_id'])
						);
	
					}

					$level_3_data[] = array(
						'category_id' => $category_3['category_id'],
						'name' => $category_3['name'],
						'children' => $level_4_data,
						'href' => $this->url->link('product/category', 'path=' . $category_1['category_id'] . '_' . $category_2['category_id'] . '_' . $category_3['category_id'])
					);
	
				}

					$level_2_data[] = array(
						'category_id' => $category_2['category_id'],
						'name'     => $category_2['name'],
						'children' => $level_3_data,
						'href'     => $this->url->link('product/category', 'path=' . $category_1['category_id'] . '_' . $category_2['category_id'])
					);
			}

			$data['categories'][] = array(
				'category_id' => $category_1['category_id'],
				'name'     => $category_1['name'],
				'children' => $level_2_data,
				'href'     => $this->url->link('product/category', 'path=' . $category_1['category_id'])
			);
		}
		$this->cache->set('category.menu.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id'), $data['categories']);
	}

	if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/module/cat-by-parrent.tpl')) {
		return $this->load->view($this->config->get('config_template') . '/template/module/cat-by-parrent.tpl',$data);
	} else {
		return $this->load->view('default/template/module/cat-by-parrent.tpl', $data);

}
}
}

 

 

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


On 11/29/2020 at 12:14 AM, Dotrox said:

Зачем вам теперь эта строка?


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

Вы в следующей же строке перезаписываете значение.

 

Спасибо!

Да, надо выкинуть

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


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

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

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

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

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

Вхід

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

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

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

Important Information

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