Перейти к содержанию
Baco

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

Рекомендуемые сообщения

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

 

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

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

catalog\model\localisation\language.php

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

if ($result['status']) {

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

 

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

 

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

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

admin/model/localisation/language.php

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Смотри

if ($data) {

} else{

 

вот здесь

 

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё же в админке, я бы в 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() ... 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня это не 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{

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

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В controller/ /information

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Долго думал

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'

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Долго думал

 

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'

 

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

 

А какой файл?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

index.php

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

index.php

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


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

 

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

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

 

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

 

ИМХО

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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') . "'

Есть идеи ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

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

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.