我今天早些时候遇到了同样的问题,最奇怪的是我的属性(下拉菜单)具有相同的属性,但一个显示下拉菜单,另一个显示高级搜索中的多选菜单。
我用不同的设置做了一些测试,结果发现在高级搜索中,每个属性都是一个列表(下拉和多选)并且它有超过 2 个选项显示为多选。
我查看了存储在 /app/code/core/Mage/CatalogSearch/Block/Advanced/Form.php 中的 Mage_CatalogSearch_Block_Advanced_Form 并且我看到了检查条件 2 的位置。 magento 核心团队这样做是为了确保“yesno”或布尔列表显示为下拉列表。
在上述文件中,从第 173 行开始(在当前版本的 magento 上)
是以下代码:
public function getAttributeSelectElement($attribute)
{
$extra = '';
$options = $attribute->getSource()->getAllOptions(false);
$name = $attribute->getAttributeCode();
// 2 - avoid yes/no selects to be multiselects
if (is_array($options) && count($options)>2) {
. . .
如果您将最后一行的数字 2 更改为数字 5,高级搜索将在每个选项少于 6 个的属性上显示下拉菜单。
我为自己做的是添加了一个新方法,getAttributeDropDownElement(),下面是 getAttributeSelectElement(),如下所示:
public function getAttributeDropDownElement($attribute)
{
$extra = '';
$options = $attribute->getSource()->getAllOptions(false);
$name = $attribute->getAttributeCode();
// The condition check bellow is what will make sure that every
// attribute will be displayed as dropdown
if (is_array($options)) {
array_unshift($options, array('value'=>'', 'label'=>Mage::helper('catalogsearch')->__('All')));
}
return $this->_getSelectBlock()
->setName($name)
->setId($attribute->getAttributeCode())
->setTitle($this->getAttributeLabel($attribute))
->setExtraParams($extra)
->setValue($this->getAttributeValue($attribute))
->setOptions($options)
->setClass('multiselect')
->getHtml();
}
接下来你需要做的是在表单的 switch 中的一个小的 if 语句(见下文),它将检查属性的名称并在此基础上调用 getAttributeSelectElement() 或我们的新方法 getAttributeDropDownElement() .我把这份工作留给你:)
case 'select': ?>
<div class="input-box"> <?php echo $this->getAttributeSelectElement($_attribute) ?> </div>
<?php endswitch; ?>