Как стать автором
Обновить

Комментарии 21

Вы правы. Нужно попробовать сделать (если это еще не исправили).
Немного позанудствую.

// headfire debug begin
$f=fopen('headfire.txt','a+');
fwrite($f,print_r($sql_query,true));
fwrite($f, PHP_EOL);
fclose($f);
// headfire debug end

Можно заменить на
file_put_contents('headfire.txt', print_r($sql_query, true), FILE_APPEND);


А еще круче — научиться использовать дебаггер.
За трюк с file_put_contents — спасибо. Не подозревал, что его можно использовать с флагами. Насчет дебаггера — может посоветуйте, что можно использовать на больших проектах (типа PrestaShop). Я как-то пробовал настроить связку с Notepad++, что-то все глючило и было очень неудобно.
НЛО прилетело и опубликовало эту надпись здесь
Хм, внезапно пригодилось: XDebugClient
Плагин отладчика для Notepad++. Писал для себя 3 года назад. Написан на C#. Код ужасный конечно.
Спасибо.
$logger = new Monolog\Logger();
$logger->addDebug('SQL:', $sql_query);
В статье прекрасно все — от методов дебагинга через дамп в файл, до исправлении бага в core файле магазина.
Хотя судя по этому листингу Prestashop их код особо и не расчитан, чтобы его нормально кастомизировали и правили
Правился все-таки модуль, хоть и официальный. В данном движке есть способ кастомизации модулей, что позволит обновлять модуль из админки.
За такой код надо казнить
  foreach ($filter_value as $filter_val)
	$query_filters .= 'fp.`id_feature_value` = '.(int)$filter_val.' OR ';
   $query_filters = rtrim($query_filters, 'OR ').') ';


Вы и руками пишете такую аброкадабру, когда есть конструкция IN?

$query_filters =  'fp.`id_feature_value` IN (' . implode(',', $filter_value) . ')'


Абсолютно нечитаемо и неэффективно, также как и конструкция вроде EXISTS.
Код с rtrim не из красивых. Я об этом в статье упомянул и исправил в меру своих сил. Ваше решение с IN элегантнее, чем с OR. Мне оно в голову не пришло (хотя должно было бы). Просто я не думал о рефакторинге самого SQL — я исправлял алгоритм его формирования.

Мда, преста никогда не отличалась красотой кода… Помню, как правил основные цвета темы, раскиданные по всему файлу: кнопка здесь, ховер на кнопку там, клик еще гдето.

А вы видели opencart?
В OpenCart самое интересное, что в ней модули подключаются через специальную примочку, которая на лету исправляет PHP-код ядра. Таким странным образом решается проблема расширения функциональности и кастомизации.
Это в старых версиях так было. Сейчас вроде сделали нормальную систему плагинов.

Опенкарт практически не щупал, но подозреваю, что там так же, вроде читал где-то, что преста выросла из opencart. Могу ошибаться.

Я подобных задач в день не один десяток решаю. Может, сначала стоит до конца изучить азы языка, а потом писать на хабр?
Очень хочется видеть в таких местах prepeared statement.
Предложу вот такой код:
private static function getId_featureFilterSubQuery($filter_value, $ignore_join = false)
{
  if (empty($filter_value))
      return array();

  //headfire hack begin
      $query_filters = ' AND EXISTS (SELECT * FROM '._DB_PREFIX_.'feature_product fp WHERE fp.id_product = p.id_product AND ';
      $query_filters .= ' fp.`id_feature_value` in (' .implode(', ', 'intval', $filter_value)). '))';
		
      return array('where' => $query_filters);
 }

P.S. скобки не считал, мог ошибиться.
Прошу прощения, array_map потерялся.
private static function getId_featureFilterSubQuery($filter_value, $ignore_join = false)
{
    if (empty($filter_value))
        return array();

    //headfire hack begin
    $query_filters = ' AND EXISTS (SELECT * FROM ' . _DB_PREFIX_ . 'feature_product fp WHERE fp.id_product = p.id_product AND ';
    $query_filters .= ' fp.`id_feature_value` in (' . implode(', ', array_map('intval', $filter_value)) . '))';
    return array('where' => $query_filters);
}
Можно извлечь урок: не делай релиз без тестов.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации