题
除了创建自己的小部件或块类以做到这一点之外,是否有一种方法可以在静态块或CMS页面中显示产品的名称,SKU,价格或其他属性?
如果没有办法开箱即用的方法,是否有其他方法可以实现这一目标?
也就是说,我希望能够在街区或页面上做这样的事情
{{block type="some/block" sku="PRODUCT_SKU" variable_to_display="name"}}
并让产品的名称出现在静态块/页面中。
这是否存在于Magento的核心中?社区中的某个地方?
解决方案
我不完全意识到 核 要解决这个问题(我没有看),但是以下内容并不难以实施。
就在几天前,我们需要从帮手的输出 - 转回另一个通过CMS块渲染的帮手。
这不需要 phtml
仅出于单个功能而创建的文件 - 将允许相当灵活地使用 helper
或者 model
要执行的方法。
虽然可能不是您想要的干净核心解决方案,但输出应该是您所追求的。
调用助手方法
此处没有容错(即检查方法/类都存在等);但是,如果您真的需要它,则可以修改它以适应。
我想要的是获取获得捆绑产品最低价格的助手的回报值;然后将该输出通过货币助手推动以适当地格式化。
{{block type="sonassi.core/helper" helper="sonassi.core/catalog" function="getMinMaxPrice" arg1="5" arg2="" arg3="min" callback_helper="core" callback_function="currency" callback_arg1="function_response" callback_arg2="true" callback_arg3="false"}
使用以下类渲染。
<?php
/*
* @category Module
* @package Sonassi_Core
* @copyright Copyright (c) 2012 Sonassi
*/
class Sonassi_Core_Block_Helper extends Mage_Core_Block_Abstract
{
protected function _toHtml()
{
try {
$args = $this->getData();
$_helper = Mage::helper($args['helper']);
$html = false;
$argStr = implode("###", array_keys($args));
if (preg_match_all('/arg[0-9]+/', $argStr, $matches)) {
$data = array_intersect_key($args,array_flip($matches[0]));
array_walk($data, array(Mage::helper('sonassi.core'),'stringToBoolean'));
$html = call_user_func_array(array($_helper, $args['function']), $data);
}
if (isset($args['callback_helper'])) {
$_callbackHelper = Mage::helper($args['callback_helper']);
if (preg_match_all('/callback\_arg[0-9]+/', $argStr, $matches)) {
$data = array_intersect_key($args,array_flip($matches[0]));
$testCase = array_flip($data);
if (isset($testCase['function_response'])) {
$position = $testCase['function_response'];
$data[$position] = $html;
}
array_walk($data, array(Mage::helper('sonassi.core'),'stringToBoolean'));
$html = call_user_func_array(array($_callbackHelper, $args['callback_function']), $data);
}
}
return $html;
} catch(Exception $e) {}
return;
}
}
调用模型方法
因此,对上述代码进行了调整 (我已经删除了辅助回调,只是缩短了代码的量).
你可以执行,
{{block type="sonassi.core/model" model="catalog/product" load_attribute="sku" load_value="product-sku" function="getName"}}
在以下支持课上,
<?php
/*
* @category Module
* @package Sonassi_Core
* @copyright Copyright (c) 2012 Sonassi
*/
class Sonassi_Core_Block_Model extends Mage_Core_Block_Abstract
{
protected function _toHtml()
{
try {
$args = $this->getData();
$_model = Mage::getModel($args['model'])
if (isset($args['load_id']))
$_model->load($args['load_id']);
elseif (isset($args['load_attribute']) && isset($args['load_value']))
$_model->loadByAttribute($args['load_attribute'], $args['load_value']);
$html = false;
$argStr = implode("###", array_keys($args));
if (preg_match_all('/arg[0-9]+/', $argStr, $matches)) {
$data = array_intersect_key($args,array_flip($matches[0]));
array_walk($data, array(Mage::getModel('sonassi.core'),'stringToBoolean'));
$html = call_user_func_array(array($_model, $args['function']), $data);
}
return $html;
} catch(Exception $e) {}
return;
}
}
该课程保持相当通用,并为一种方法加载一种方法会很重 - 但是您可以根据自己的需求进行调整。
显然,这样的事情会更轻巧,但是您可以调整适合您需求的方法。
Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);
常见方法
上面引用的辅助方法, stringToBoolean
, ,只是以下内容:
public function stringToBoolean(&$value, $key)
{
if ($value == "true")
$value = true;
elseif ($value == "false")
$value = false;
}