Як приховати порожній атрибут у будь-якому шаблоні 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

Знайдіть і відкрийте файл attributes.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

Я не знаю точного, але я його десь читав.

Прихойте порожні атрибути, просто відредагуйте файл шаблону, названий як "attributes.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. Текстове поле, область тексту, мультиселекція, випадаючий не має значення. Якщо типом атрибайта є дата, а значення встановлено "Ні", його слід відображати замість ходингу.
ADDISON74

1

змінити наступний код у програмі / дизайні / frontend / base / за замовчуванням / шаблон / каталог / продукт / view / attributes.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-код повинен перевірити, чи значення атрибута "Ні" або "N / A" в усіх мовах. Це не відображатиме атрибути з цими значеннями.

Код буде виглядати приблизно так:

<?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 Не потрібно купувати модуль чи редагувати будь-який код.

Дякую Niro (розробник цього модуля)


1
Посилання розірвано Чи можу я знати оновлення прямого посилання?
Місяць

4
а ще краще: розмістіть правильну відповідь тут. Нове посилання знову розіб'ється ...
simonthesorcerer

0

Простий спосіб, але не потрібен краще, ніж інші.

Оновіть файл перекладу Mage_Catalog.csv. Встановіть порожні значення, як показано нижче.

N/A,""
No,""

Атрибути Frontend будуть ігноровані, коли немає або ні / A.


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; ?>

Це воно! Порожні атрибути тепер будуть приховані від ваших сторінок продукту. Не забудьте оновити кеш, щоб побачити зміни.

Джерело : 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.