Jump to content
Sign in to follow this  
Baco

Улучшения сборки по мелочам...

Recommended Posts

Доброго времени, дамы и господа, предлагаю в данной теме обсуждать и принимать на заметку при создании новой версии сборки, так как код, из самого ОС не совсем грамотно написанный и иногда "экономия на подзапросе" в итоге может дать свои , хоть и маленькие, но миллисекунды в приросте...

 

Создание темы навеяно холиваром из темы, где продается решение, в принципе простое, но столь же эффективное...

Менее с тем, итак, заметка от Chukcha №1:

catalog\model\localisation\language.php

в методе getLanguages нет условия по выборке языка со статусом "вкл"|1|true... тоесть, в сам кеш, добавляеться весь массив языков и лишь в контроллере идёт перебор по условию типа:

if ($result['status']) {

но в самом файле кеша сидит "мёртвый язык"...

 

В итоге, имеет несколько вкладок в админке с включенными "мёртвыми" вкладками...

 

Ваши идеи господа !?

  • +1 1

Share this post


Link to post
Share on other sites

Решение справедливо при условии, что так же будет исправленно в:

admin/model/localisation/language.php

Share this post


Link to post
Share on other sites

Там-то как раз с этим все в порядке...

 

Смотри

if ($data) {

} else{

 

вот здесь

 

}

Share this post


Link to post
Share on other sites

Всё же в админке, я бы в 310 строке заменил на:

$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language WHERE status = 1 ORDER BY sort_order, name");

так и спокойней и правильней и в кеш ниче не полезет ненужного...

 

а то ведь смотри как в статьи идёт выборка в контроллере:

$this->load->model('localisation/language');
		
$this->data['languages'] = $this->model_localisation_language->getLanguages();

тоесть тут параметр $data = array() ... 

 

В итоге, имеет вкладки из "мёртвых языков"...

Share this post


Link to post
Share on other sites

У меня это не 310 строка.

	public function getLanguages($data = array()) {
		if ($data) {
			$sql = "SELECT * FROM " . DB_PREFIX . "language";
	
			$sort_data = array(
				'name',
				'code',
				'sort_order'
			);	
			
			if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
				$sql .= " ORDER BY " . $data['sort'];	
			} else {
				$sql .= " ORDER BY sort_order, name";	
			}
			
			if (isset($data['order']) && ($data['order'] == 'DESC')) {
				$sql .= " DESC";
			} else {
				$sql .= " ASC";
			}
			
			if (isset($data['start']) || isset($data['limit'])) {
				if ($data['start'] < 0) {
					$data['start'] = 0;
				}					

				if ($data['limit'] < 1) {
					$data['limit'] = 20;
				}	
			
				$sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
			}
			
			$query = $this->db->query($sql);
	
			return $query->rows;
		} else {
			$language_data = $this->cache->get('language');
		
			if (!$language_data) {
				$language_data = array();
				
				$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language WHERE status = '1' ORDER BY sort_order, name");
	
    			foreach ($query->rows as $result) {
      				$language_data[$result['code']] = array(
        				'language_id' => $result['language_id'],
        				'name'        => $result['name'],
        				'code'        => $result['code'],
						'locale'      => $result['locale'],
						'image'       => $result['image'],
						'directory'   => $result['directory'],
						'filename'    => $result['filename'],
						'sort_order'  => $result['sort_order'],
						'status'      => $result['status']
      				);
    			}	
			
				$this->cache->set('language', $language_data);
			}
		
			return $language_data;			
		}
	}

А точнее

 

public function getLanguages($data = array()) {

if ($data) {

Если хоть что-то есть в массиве.

} else{

Даже если массив пустой

}

Share this post


Link to post
Share on other sites

В controller/ /information

		$this->load->model('localisation/language');
		
		$this->data['languages'] = $this->model_localisation_language->getLanguages();
		
Т.е. $data будет пустым массивом

Share this post


Link to post
Share on other sites

Значит, 310 это у меня в бро смещено, это как раз строка с выборкой... то кстати там, если $data = array() тогда идет, исходя из нумерации твоей строки, то: 289... а там, как видим, проверка на файл кеша и т.д... в общем поправлено в запросе самом, остальное думаю трогать не стоит.

Share this post


Link to post
Share on other sites

Вот это хорошая тема. За это мое уважение!

 

Мое мнение, что кэшировать запрос "SELECT * FROM " . DB_PREFIX . "language ORDER BY sort_order, name" - бесполезное занятие.

В таблице этой обычно 1-3 записи. MySQL такие запросы делает ну очень быстро. Больше ресурсов будут тратиться на поиск файла в кэше.

Share this post


Link to post
Share on other sites

Ну... тема создана на выявление и устранение таких вот мелких косяков и... доведения кода до состояния совершенства - вот цель топика.

 

P.S. Косяк с language - это не однократный момент рассмотрения в данной теме, позже будем добавлять по мере выявления другие недостатки и методы их устранения, а так же надеемся на активное участие сообщества, с целью совершенствования продукта.

Share this post


Link to post
Share on other sites

Долго думал

if ($store_query->num_rows) {
	$config->set('config_store_id', $store_query->row['store_id']);
} else {
	$config->set('config_store_id', 0);
}
		
// Settings
$query = $db->query("SELECT * FROM " . DB_PREFIX . "setting WHERE store_id = '0' OR store_id = '" . (int)$config->get('config_store_id') . "' ORDER BY store_id ASC");

Тайный смысл в 62-й строке

 

store_id = '0'

 

Или подразумевается, что могут быть общие настройки у магазинов?

Share this post


Link to post
Share on other sites

Долго думал

 

if ($store_query->num_rows) {
	$config->set('config_store_id', $store_query->row['store_id']);
} else {
	$config->set('config_store_id', 0);
}
		
// Settings
$query = $db->query("SELECT * FROM " . DB_PREFIX . "setting WHERE store_id = '0' OR store_id = '" . (int)$config->get('config_store_id') . "' ORDER BY store_id ASC");

Тайный смысл в 62-й строке

 

store_id = '0'

 

Или подразумевается, что могут быть общие настройки у магазинов?

 

А какой файл?

Share this post


Link to post
Share on other sites

index.php

Share this post


Link to post
Share on other sites

index.php

Во многих модулях настройки не привязаны к store_id

Share this post


Link to post
Share on other sites

Во многих модулях настройки не привязаны к store_id

в 99.7 % магазинов store_id == 0

Share this post


Link to post
Share on other sites
Во многих модулях настройки не привязаны к store_id

 

Что это меняет?

Я, действительно, понять не могу.

 

настройки берутся из get->config

Причем здесь id_store

Share this post


Link to post
Share on other sites
 

Или подразумевается, что могут быть общие настройки у магазинов?

 

Да, по умолчанию, в коробочном варианте, настройки используются как общие, хотя магазин всего один. А вот если магазинов 1+, можно добавить настройки, специфичные для каждого магазина, не отказываясь от использования стандартных.   

 

ИМХО

Share this post


Link to post
Share on other sites

Что это меняет?

Я, действительно, понять не могу.

 

настройки берутся из get->config

Причем здесь id_store

В админке настройки, которые в "Настройки" - "Мой магазин" привязаны к store_id

Share this post


Link to post
Share on other sites

Что это меняет?

Я, действительно, понять не могу.

 

настройки берутся из get->config

Причем здесь id_store

Слава, сперва: $config->set( а потом, чуть ниже: $config->get(

 

Смысл в проверке таблицы с мультиками, если они есть, то соотв в индексе и делать выборку по указанным настройкам.

Share this post


Link to post
Share on other sites

BTW, здесь есть перспектива для мелкой оптимизации:

OR store_id = '" . (int)$config->get('config_store_id')

вставлять в запрос, только если

$config->get('config_store_id')!= 0

 Зачем выбирать мультики, если их в 99,7% случаев нет?

Share this post


Link to post
Share on other sites

BTW, здесь есть перспектива для мелкой оптимизации:

OR store_id = '" . (int)$config->get('config_store_id')

вставлять в запрос, только если

$config->get('config_store_id')!= 0

 Зачем выбирать мультики, если их в 99,7% случаев нет?

В том то и суть... а теперь если посмотреть более глобально, на запросы типа:

LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id)

то возникает резонный вопрос: "Нахера здесь вообще category_to_store и обращение к ней а потом ещё и условие типа:

AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "'

Есть идеи ?

Share this post


Link to post
Share on other sites

В том то и суть... а теперь если посмотреть более глобально, на запросы типа:

LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id)

то возникает резонный вопрос: "Нахера здесь вообще category_to_store и обращение к ней а потом ещё и условие типа:

AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "'

Есть идеи ?

Ребяты, вы чего, SQL забыли?

Это же выбор категорий, привязанных к текущему магазину store_id.

Share this post


Link to post
Share on other sites

В том то и суть... а теперь если посмотреть более глобально, на запросы типа:

LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id)

то возникает резонный вопрос: "Нахера здесь вообще category_to_store и обращение к ней а потом ещё и условие типа:

AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "'

Есть идеи ?

А это как раз в угоду тем 0,3% с мультиками. Их ведь тоже со счетов сбрасывать нельзя.

 

И оптимизировать так же: включать или не включать в строку sql ту или иную конструкцию.

 

Только вот стоит ли экономить на спичках? Выигрыш - миллисекунды, а код усложнится изрядно.

 

По уму, надо бы иметь две версии моделей, для немультиков и мультиков, и выбирать загрузку с учетом store_id != 0

Share this post


Link to post
Share on other sites

Ребяты, вы чего, SQL забыли?

Это же выбор категорий, привязанных к текущему магазину store_id.

так в том то и суть, что в 99 % магазинов эти таблицы - не затрагиваются вообще, только в корне прописалось и всё, потом просто гоняются в порожняке запросы... зачем если априори store_id == 0 ?

Share this post


Link to post
Share on other sites

так в том то и суть, что в 99 % магазинов эти таблицы - не затрагиваются вообще, только в корне прописалось и всё, потом просто гоняются в порожняке запросы... зачем если априори store_id == 0 ?

Мультимагазинность требует жертв :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Similar Content

    • By Juuuice
      Всем доброго времени суток!
       
      Я занимаюсь клиентской разработкой сайтов, поддержкой и продвижением, на моем счету держится уже более 20 реально развивающихся сайтов на опенкарте, у меня есть человек, который поддерживает их, дорабатывает, работает с модулями и так далее - но он уже ничего не успевает. Объем работы большой.
       
      В связи с этим ищу человека, хорошо знающего опенкарт, способного спрограммировать или допилить некоторые модули, в данный момент висит около 3-5 крупных задач.
       
      Вот пример одной:
      Есть всем известный модуль импорт/экспорт товаров в искель. - его нужно допилить так, чтоб клиент мог загружать на сайт ему удобный иксель файл с наличием и ценой и чтобы соответсвенно сайт обновлял информацию о наличие и обновлял новую цену. + необходимо сделать так чтоб была возможность прибавки процентов к цене. Например у него есть прайс на продукцию и он хочет прибавить к ценнику 10%. При импорте иксель файла на сайт должно появляться поле куда он может ввести процент.
       
      Очень важные критерии: это скорость ответа и скорость исполнения и соблюдение обговоренных сроков, вопрос денег на втором плане.
       
       
      С уважением, Евгений
  • Recently Browsing   0 members

    No registered users viewing this page.

×

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.