Как скрыть пустой атрибут в любом шаблоне magento?


12

Я хочу скрыть пользовательский атрибут в шаблоне magento. Моя версия magento 1.8.1

Мы добавили пользовательские атрибуты для нашего продукта, такие как бренд, размер, тип продукта и т. Д., Но иногда мы не добавляли значения в эти атрибуты. magento показывает Нет или N / A на странице просмотра продукта.

Итак, мы хотим скрыть атрибуты, которые являются пустыми или не имеют значения в шаблоне.


Нам понадобится гораздо больше информации, чтобы помочь (какой атрибут? Где?)
отметки

Ответы:


7

Быстрое исправление:

В app/[mypackage]/[mytheme]/template/catalog/product/view/attributes.phtml(или скопируйте этот файл в вашей теме из базовой или пользовательской темы по умолчанию):

<?php foreach ($_additional as $_data):
// Add these 2 lines
$_test_data_value = trim($_data['value']);
if ((empty($_test_data_value) || in_array($_test_data_value, array(Mage::helper('catalog')->__('N/A'), Mage::helper('catalog')->__('No'))))) continue;?>

Ниже не обязательно достигать того, что вы просили:

Эти атрибуты все еще загружены. Чтобы оптимизировать это (если у вас есть большое количество атрибутов в наборах атрибутов), выполните:

public function getAdditionalData(array $excludeAttr = array())
{
    $data = array();
    $product = $this->getProduct();
    $attributes = $product->getAttributes();
    foreach ($attributes as $attribute) {
//            if ($attribute->getIsVisibleOnFront() && $attribute->getIsUserDefined() && !in_array($attribute->getAttributeCode(), $excludeAttr)) {
        if ($attribute->getIsVisibleOnFront() && !in_array($attribute->getAttributeCode(), $excludeAttr)) {

            // Fix:
            //$value = $attribute->getFrontend()->getValue($product);

            if (!$product->hasData($attribute->getAttributeCode())) {
                $value = Mage::helper('catalog')->__('N/A');
            } 
            // Fix:
            elseif ((string) ($value = $attribute->getFrontend()->getValue($product)) == '') {
                $value = Mage::helper('catalog')->__('No');
            } elseif ($attribute->getFrontendInput() == 'price' && is_string($value)) {
                $value = Mage::app()->getStore()->convertPrice($value, true);
            }

            if (is_string($value) && strlen($value)) {
                $data[$attribute->getAttributeCode()] = array(
                    'label' => $attribute->getStoreLabel(),
                    'value' => $value,
                    'code'  => $attribute->getAttributeCode()
                );
            }
        }
    }
    return $data;
}

Обратите внимание на два // Fix:комментария.

Эта измененная функция от Mage_Catalog_Block_Product_View_Attributes. Вам нужно скопировать указанную выше функцию в вашем классе блоков из вашего модуля. Ваш класс блоков переписывает базовый класс блоков. Применение этого значительно улучшит загрузку страницы представления продукта на веб-интерфейсе.

Если вы не знаете, как создать пользовательский модуль в локальной директории, найдите учебник о том, как создать модуль Magento и как переписать базовый класс блоков. Или попробуйте http://www.magentocommerce.com/magento-connect/ultimate-module-creator.html .


Первое решение по изменению файла шаблона - это хорошо, но есть две проблемы. Во-первых, если есть тип атрибута Да / Нет со значением, установленным на Нет, он будет скрыт во внешнем интерфейсе, что не в порядке. Во-вторых, если нет атрибутов, вы получите заголовок Дополнительная информация, которая не в порядке. Если нет атрибутов, этот заголовок не должен появляться.
ADDISON74

6

Найдите и откройте файл attribute.phtml . Этот файл можно найти здесь: /app/design/frontend/[YOUR PACKAGE]/[YOUR THEME]/template/catalog/product/view/attribute.phtml

Откройте файл и найдите следующие строки:

<?php foreach ($_additional as $_data): ?>
    <tr>
        <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th>
        <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
    </tr>
<?php endforeach; ?>

Замените весь цикл foreach следующими строками кода:

<?php foreach ($_additional as $_data): ?>
    <?php $_attribute = $_product->getResource()->getAttribute($_data['code']);
    if (!is_null($_product->getData($_attribute->getAttributeCode())) && ((string)$_attribute->getFrontend()->getValue($_product) != '')) { ?>
    <tr>
        <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th>
        <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
    </tr>
    <?php } ?>
<?php endforeach; ?>

Источник: http://codingbasics.net/hide-magento-attributes-value/

Источник: http://www.magthemes.com/magento-blog/empty-attributes-showing-na-fix/


4

Я не знаю точно, но я где-то читал.

Скройте пустые атрибуты, просто отредактировав файл шаблона с именем «attribute.phtml».

В вашем коде найдите следующие строки:

<?php foreach ($_additional as $_data): ?>
    <tr>
        <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th>
        <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
    </tr>
<?php endforeach; ?>

и замените эти строки этими:

<?php foreach ($_additional as $_data): ?>
    <?php if ((string)$_data['value'] != '' and $_data['value'] != 'N/A'): ?>
        <tr>
            <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th>
            <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
        </tr>
    <?php endif; ?>
<?php endforeach; ?>

1
Ваше решение скрывает только атрибут типа datetime, который имеет значение N / A. Текстовое поле, текстовая область, множественный выбор, выпадающий список не имеет значения. Если тип атрибута - datetime, а значение установлено как No, его следует показывать вместо скрытия.
ADDISON74

1

измените следующий код в app / design / frontend / base / default / template / catalog / product / view / attribute.phtml :

из:

<?php foreach ($_additional as $_data): ?>
<tr>
    <th class="label"><?php echo $this->escapeHtml($this->__($_data['label'])) ?></th>
    <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
</tr>
<?php endforeach; ?>

чтобы:

<?php foreach ($_additional as $_data): ?>
<?php if ($_product->getAttributeText($_data['code']) == '') continue; ?>
<tr>
    <th class="label"><?php echo $this->escapeHtml($this->__($_data['label'])) ?></th>
    <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
</tr>
<?php endforeach; ?>

2
Не меняйте базовые шаблоны ...
Jelle Siderius

1

В вашей теме, перейдите по ссылке : catalog\product\view\attributes.phtml. Ваш PHP-код должен проверить, является ли значение атрибута «Нет» или «Н / Д» на всех языках. Это не будет отображать атрибуты с этими значениями.

Код будет выглядеть так:

<?php
$_helper = $this->helper('catalog/output');
$_product = $this->getProduct();
$emptyValues = array($this->__('N/A'), $this->__('No'));
?>
<?php if($_additional = $this->getAdditionalData()): ?>
    <h2><?php echo $this->__('Additional Information') ?></h2>
    <table class="data-table" id="product-attribute-specs-table">
        <col width="25%" />
        <col />
        <tbody>
        <?php foreach ($_additional as $_data): ?>
            <?php if(!in_array($_data['value'], $emptyValues)): ?>
                <tr>
                    <th class="label"><?php echo $this->escapeHtml($this->__($_data['label'])) ?></th>
                    <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
                </tr>
            <?php endif; ?>
        <?php endforeach; ?>
        </tbody>
    </table>
    <script type="text/javascript">decorateTable('product-attribute-specs-table')</script>
<?php endif;?>

Переменная $emptyValuesдобавлена, и проверка, если это находится в массиве, была добавлена ​​к коду.

Обязательно очистите кэш после внесения изменений в интерфейс.


не работает выше код для меня
Gem

1

Это можно сделать с помощью небольшого фрагмента кода. Найдите и откройте attributes.phtmlфайл. Этот файл можно найти здесь:/app/design/frontend/[theme name]/[package name]/template/catalog/product/view/attribute.phtml

Откройте файл и найдите следующие строки:

<?php foreach ($_additional as $_data): ?>
    <tr>
        <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th>
        <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
    </tr>
<?php endforeach; ?>

Замените весь цикл foreach следующими строками кода:

<?php foreach ($_additional as $_data): ?>
    <?php $_attribute = $_product->getResource()->getAttribute($_data['code']);
    if (!is_null($_product->getData($_attribute->getAttributeCode())) && ((string)$_attribute->getFrontend()->getValue($_product) != '')) { ?>
    <tr>
        <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th>
        <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
    </tr>
    <?php } ?>
<?php endforeach; ?>

0

Проблема решена :) Решение здесь: http://www.magentocommerce.com/boards%20/viewthread/294064/#t407742

Этот модуль отлично работает с magento 1.8.1 Нет необходимости покупать модуль или редактировать любой код.

Спасибо Ниро (Разработчик этого модуля)


1
Ссылка не работает. Могу ли я узнать, как обновить живую ссылку?
Луна

4
или даже лучше: напишите правильный ответ здесь. Новая ссылка снова будет разорвана ...
simonthesorcerer

0

Простой способ, но не обязательно лучше, чем другие.

Обновите ваш файл перевода Mage_Catalog.csv. Установите пустые значения, как показано ниже.

N/A,""
No,""

Атрибуты внешнего интерфейса будут игнорироваться, когда Нет или нет.


0

Иногда мы сталкиваемся с магазином, который хочет иметь много разных атрибутов товара, но им нужен только набор атрибутов по умолчанию. Это означает, что каждый продукт будет иметь, скажем, 10+ вариантов, которые иногда не относятся к определенным продуктам. Например, предмету одежды может потребоваться атрибут размера, а предмету мебели - нет. Поскольку магазин использует одинаковые наборы атрибутов для каждого продукта, атрибут пустого размера будет отображаться так:

Это, конечно, очень запутанно для клиентов, поэтому лучшим вариантом будет скрыть пустые значения атрибутов. Это можно сделать с помощью небольшого фрагмента кода. Найдите и откройте attributes.phtmlфайл. Этот файл можно найти здесь:app/design/frontend/default/[theme name]/template/catalog/product/view/attribute.phtml

Откройте файл и найдите следующие строки:

<?php foreach ($_additional as $_data): ?>
    <?php $_attribute = $_product->getResource()->getAttribute($_data['code']);
    if (!is_null($_product->getData($_attribute->getAttributeCode())) && ((string)$_attribute->getFrontend()->getValue($_product) != '')) { ?>
    <tr>
        <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th>
        <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
    </tr>
    <?php } ?>
<?php endforeach; ?>

Замените весь цикл foreach следующими строками кода:

<?php foreach ($_additional as $_data): ?>
    <?php $_attribute = $_product->getResource()->getAttribute($_data['code']);
    if (!is_null($_product->getData($_attribute->getAttributeCode())) && ((string)$_attribute->getFrontend()->getValue($_product) != '')) { ?>
    <tr>
        <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th>
        <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
    </tr>
    <?php } ?>
<?php endforeach; ?>

Это оно! Пустые атрибуты теперь будут скрыты от страниц вашего продукта. Не забудьте обновить кеш, чтобы увидеть изменения.

SOurce : https://tejabhagavan.blogspot.in/2016/03/hide-magento-attributes-with-no-value-2.html


не работает над кодом
Gem
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.