Magento 如果属性值为 x 或 y 则显示自定义块
Magento if attribute value is x or y then show custom block
在 view.phtml 上,如果属性平台的值为 "xbox"、"playstation" 或 [=,我正在尝试让自定义块 "console" 显示20=].
我得到了适用于 xbox 的代码,但我该如何解决它以便块显示它的值而不是 playstation 或 nintendo?
Br,
托比亚斯
<?php if ($_product->getAttributeText('platform') == "xbox"): ?>
<?php echo $this->getLayout()->createBlock('cms/block')->setBlockId('console')->toHtml() ?><?php endif; ?>
如果你想为这 3 个值中的任何一个使用相同的块,应该这样做:
<?php
$productAttribute = $_product->getAttributeText('platform');
if ($productAttribute == "xbox" || $productAttribute == "playstation" || $productAttribute == "nintendo"): ?>
<?php echo $this->getLayout()->createBlock('cms/block')->setBlockId('console')->toHtml() ?><?php endif; ?>
如果您想要根据值使用不同的块,应该这样做:
<?php
$productAttribute = $_product->getAttributeText('platform');
switch ($productAttribute){
case "xbox":
echo $this->getLayout()->createBlock('cms/block')->setBlockId('xbox')->toHtml();
break;
case "playstation":
echo $this->getLayout()->createBlock('cms/block')->setBlockId('playstation')->toHtml();
break;
case "nintendo":
echo $this->getLayout()->createBlock('cms/block')->setBlockId('nintendo')->toHtml();
break;
}
?>
你的意思是你想要任何控制台的相同块?我建议 switch statement
将您编写的 if 语句替换为:
switch($_product->getAttributeText('platform')){
case "xbox" :
case "nintendo" :
case "playstation" :
echo $this->getLayout()->createBlock('cms/block')->setBlockId('console')->toHtml();
break;
default :
//here you can put a default other block or show nothing or whatever you want to do if the product is not a console
}
现在您可以通过添加更多 case "other console" :
语句来添加更多控制台。
还有其他方法。您可以从属性值创建一个包含所有控制台的数组,然后使用 inArray(); - 如果您的客户通过 Magento 管理员向属性添加更多控制台,那么这对于一般情况可能更好。
**已编辑**在下面的评论后
如果属性 'platform' 是多选的,那么 $_product->getAttributeText('platform')
将是字符串(如果选择了一个项目),但如果选择了多个项目,它将是一个数组。所以你需要处理一个可以是字符串或数组的变量。这里我们将字符串转换为数组并使用 PHP's handy array_intersect() function.
我建议:
$platformSelection = $_product->getAttributeText('platform');
if (is_string($platformSelection))
{
//make it an array
$platformSelection = array($platformSelection); //type casting of a sort
}
//$platformSelection is now an array so:
//somehow know what the names of the consoles are:
$consoles = array('xbox','nintendo','playstation');
if(array_intersect($consoles,$platformSelection)===array())
{
//then there are no consoles selected
//here you can put a default other block or show nothing or whatever you want to do if the product is not a console
}
else
{
//there are consoles selected
echo $this->getLayout()->createBlock('cms/block')->setBlockId('console')->toHtml();
}
请注意,array_intersect() 函数严格比较数组元素 ===
,因此它区分大小写,函数 returns 一个空数组 array()
如果没有交集。
在 view.phtml 上,如果属性平台的值为 "xbox"、"playstation" 或 [=,我正在尝试让自定义块 "console" 显示20=].
我得到了适用于 xbox 的代码,但我该如何解决它以便块显示它的值而不是 playstation 或 nintendo?
Br, 托比亚斯
<?php if ($_product->getAttributeText('platform') == "xbox"): ?>
<?php echo $this->getLayout()->createBlock('cms/block')->setBlockId('console')->toHtml() ?><?php endif; ?>
如果你想为这 3 个值中的任何一个使用相同的块,应该这样做:
<?php
$productAttribute = $_product->getAttributeText('platform');
if ($productAttribute == "xbox" || $productAttribute == "playstation" || $productAttribute == "nintendo"): ?>
<?php echo $this->getLayout()->createBlock('cms/block')->setBlockId('console')->toHtml() ?><?php endif; ?>
如果您想要根据值使用不同的块,应该这样做:
<?php
$productAttribute = $_product->getAttributeText('platform');
switch ($productAttribute){
case "xbox":
echo $this->getLayout()->createBlock('cms/block')->setBlockId('xbox')->toHtml();
break;
case "playstation":
echo $this->getLayout()->createBlock('cms/block')->setBlockId('playstation')->toHtml();
break;
case "nintendo":
echo $this->getLayout()->createBlock('cms/block')->setBlockId('nintendo')->toHtml();
break;
}
?>
你的意思是你想要任何控制台的相同块?我建议 switch statement
将您编写的 if 语句替换为:
switch($_product->getAttributeText('platform')){
case "xbox" :
case "nintendo" :
case "playstation" :
echo $this->getLayout()->createBlock('cms/block')->setBlockId('console')->toHtml();
break;
default :
//here you can put a default other block or show nothing or whatever you want to do if the product is not a console
}
现在您可以通过添加更多 case "other console" :
语句来添加更多控制台。
还有其他方法。您可以从属性值创建一个包含所有控制台的数组,然后使用 inArray(); - 如果您的客户通过 Magento 管理员向属性添加更多控制台,那么这对于一般情况可能更好。
**已编辑**在下面的评论后
如果属性 'platform' 是多选的,那么 $_product->getAttributeText('platform')
将是字符串(如果选择了一个项目),但如果选择了多个项目,它将是一个数组。所以你需要处理一个可以是字符串或数组的变量。这里我们将字符串转换为数组并使用 PHP's handy array_intersect() function.
我建议:
$platformSelection = $_product->getAttributeText('platform');
if (is_string($platformSelection))
{
//make it an array
$platformSelection = array($platformSelection); //type casting of a sort
}
//$platformSelection is now an array so:
//somehow know what the names of the consoles are:
$consoles = array('xbox','nintendo','playstation');
if(array_intersect($consoles,$platformSelection)===array())
{
//then there are no consoles selected
//here you can put a default other block or show nothing or whatever you want to do if the product is not a console
}
else
{
//there are consoles selected
echo $this->getLayout()->createBlock('cms/block')->setBlockId('console')->toHtml();
}
请注意,array_intersect() 函数严格比较数组元素 ===
,因此它区分大小写,函数 returns 一个空数组 array()
如果没有交集。