Помогите! Уже который день бьюсь и безрезультатно. Ищу функцию в *.php , которая формирует массив для дальнейшего выводы в шаблоне
что именно не получается?
в Престе не идеальная, но вполне логичная для понимания модель используется:
Для просмотра ссылки Войди или Зарегистрируйся
в Престе 1.6 выборка из базы данных находится в соответствующем классе:
/classes/Product.php
public function getFrontFeatures($id_lang)
public static function getFrontFeaturesStatic($id_lang, $id_product)
и т.д.
формирование массива - в контроллере
/controllers/front/ProductController.php
public function initContent()
...
'features' => $this->product->getFrontFeatures($this->context->language->id),
...
соответственно можно или в функции править или прямо в контроллеле
<-------------- добавлено через 23632 сек. -------------->
В Характеристиках товара внёс характеристику с названием "(filter) Мощность, кВт".
Задумка такая: заполнить характеристику в каждом товаре, но на странице товара её не показывать. Она будет выводиться только в Фильтре подбора в Категории.
Редактирую /classes/Product.php
В условии выборки
WHERE добавляю
AND fl.name NOT REGEXP ".*(filter).*", чтобы исключить все х-ки, содержащие (filter). Но она всё-равно выводится у товара. А если этот же запрос делаю напрямую в базе MySQL, то всё ок...
Не могу разобраться что я делаю не так?
PHP:
public static function getFrontFeaturesStatic($id_lang, $id_product)
{
if (!Feature::isFeatureActive()) {
return array();
}
if (!array_key_exists($id_product.'-'.$id_lang, self::$_frontFeaturesCache)) {
self::$_frontFeaturesCache[$id_product.'-'.$id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT name, value, pf.id_feature
FROM '._DB_PREFIX_.'feature_product pf
LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.')
LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.')
LEFT JOIN '._DB_PREFIX_.'feature f ON (f.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.')
'.Shop::addSqlAssociation('feature', 'f').'
WHERE pf.id_product = '.(int)$id_product.' AND fl.name NOT REGEXP ".*(filter).*"
ORDER BY f.position ASC'
);
}
return self::$_frontFeaturesCache[$id_product.'-'.$id_lang];
}
зачем лезть в ядро сайта, если такие проверки на уровне вывода в файле шаблона вполне эффективно решаются?
в данном случае так можно по примеру решить задачу:
Код:
{foreach from=$features item=feature}
{if !(isset($feature.name)&&($feature.name=='(filter) Мощность, кВт'))}
<tr class="{cycle values="odd,even"}">
{if isset($feature.value)}
<td>{$feature.name|escape:'html':'UTF-8'}</td>
<td>{$feature.value|escape:'html':'UTF-8'}</td>
{/if}
</tr>
{/if}
{/foreach}
<-------------- добавлено через 35777 сек. -------------->
В Характеристиках товара внёс характеристику с названием "(filter) Мощность, кВт".
Задумка такая: заполнить характеристику в каждом товаре, но на странице товара её не показывать. Она будет выводиться только в Фильтре подбора в Категории.
Редактирую /classes/Product.php
В условии выборки
WHERE добавляю
AND fl.name NOT REGEXP ".*(filter).*", чтобы исключить все х-ки, содержащие (filter). Но она всё-равно выводится у товара. А если этот же запрос делаю напрямую в базе MySQL, то всё ок...
Не могу разобраться что я делаю не так?
PHP:
public static function getFrontFeaturesStatic($id_lang, $id_product)
{
if (!Feature::isFeatureActive()) {
return array();
}
if (!array_key_exists($id_product.'-'.$id_lang, self::$_frontFeaturesCache)) {
self::$_frontFeaturesCache[$id_product.'-'.$id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT name, value, pf.id_feature
FROM '._DB_PREFIX_.'feature_product pf
LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.')
LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.')
LEFT JOIN '._DB_PREFIX_.'feature f ON (f.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.')
'.Shop::addSqlAssociation('feature', 'f').'
WHERE pf.id_product = '.(int)$id_product.' AND fl.name NOT REGEXP ".*(filter).*"
ORDER BY f.position ASC'
);
}
return self::$_frontFeaturesCache[$id_product.'-'.$id_lang];
}
<-------------- добавлено через 11879 сек. -------------->
На данном этапе я именно так и сделал. Но в примере я привёл 1 характеристику, а на самом деле их кол-во измеряется несколькими десятками.
Менеджер может добавить ещё несколько и забудет предупредить программиста...
Хотелось обойтись "малой кровью" и отфильтровать по маске на этапе выборки из базы и всё положить в /override/.
первое правило работы с опенсорс CMS: если ты не разрабатываешь ядро - не трогай ядро, мало ли что в будущем туда напичкают или пофиксят разработчики
поэтому в 1.6 можно вполне функциями smarty
Для просмотра ссылки Войди или Зарегистрируйся можно много чего полезного при выводе на экран сделать, в данном случае просто проверку на вхождение твоего "секретного" слова-ключа в название характеристики:
Код:
{foreach from=$features item=feature}
{if $feature.name|strpos:"(filter)" === false}
<tr class="{cycle values="odd,even"}">
{if isset($feature.value)}
<td>{$feature.name|escape:'html':'UTF-8'}</td>
<td>{$feature.value|escape:'html':'UTF-8'}</td>
{/if}
</tr>
{/if}
{/foreach}
можно и в запросе к базе выбирать то, что нужно, только регулярку лучше не использовать и нужно играться с кавычками
Код:
AND fl.name NOT LIKE '%(filter)%'
<-------------- добавлено через 26265 сек. -------------->
После очередного обновления возникла ошибка, на панели управления пульт перестал показывать реальные значения, живет своей жизнью, то меньше показывает значения, то больше.
Как можно восстановить нормальную работу пульта?
если разговор про
1.6.1.17
то там есть баги
Для просмотра ссылки Войди или Зарегистрируйся
хотя такое подозрение, что наоборот: старый баг статистики поправили, теперь считает по другим правилам