Prestashop允许为产品功能创建CMS页面。至少,他们在CMS创建中提供了一个显示URL的字段。我想在我的产品页面中检索该URL,并用CMS扩展的不同控制器将其插入其中。如果可以检索到产品功能的实际URL,这应该是一项简单的任务,但这似乎是一项不可能完成的任务。使用时:
$this->product->getFrontFeatures($this->context->language->id);
在您的产品控制器中,您会得到一系列功能,如下所示:
Array
(
[name] => Material
[value] => Polartec Classic 200.
[id_feature] => 68
)
URL值没有在任何地方列出,当然这会使任务变得非常困难。除非我做错了什么,我应该使用不同的函数来获得特征值。有人能告诉我应该对Prestashop做哪些修改才能获得我需要的价值吗?我希望我的阵列看起来像这样:
Array
(
[name] => Material
[value] => Polartec Classic 200.
[id_feature] => 68
[URL] => polartec-classic-200
)
函数不返回功能的分层导航url。为了在该数组中包含此项,您需要进行覆盖:
在override/classes/中创建一个包含以下内容的文件Product.php:
<?php
class Product extends ProductCore
{
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, liflv.url_name AS url
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.')
LEFT JOIN '._DB_PREFIX_.'layered_indexable_feature_lang_value liflv ON (f.id_feature = liflv.id_feature AND liflv.id_lang = '.(int)$id_lang.')
'.Shop::addSqlAssociation('feature', 'f').'
WHERE pf.id_product = '.(int)$id_product.'
ORDER BY f.position ASC'
);
}
return self::$_frontFeaturesCache[$id_product.'-'.$id_lang];
}
}
并且不要忘记删除cache/class_index.php以清除覆盖缓存。
注1:该解决方案基于PrestaShop 1.6.0.14中的getFrontFeaturesStatic()方法注2:数组索引是小写的"url"(不是大写的url)-最佳实践