Jak ukryć pusty atrybut w dowolnym szablonie Magento?


12

Chcę ukryć niestandardowy atrybut w szablonie magento. Moja wersja Magento to 1.8.1

Dodaliśmy niestandardowy atrybut dla naszego produktu, taki jak marka, wymiar, typ produktu itp., Ale czasami nie dodawaliśmy wartości w tych atrybutach. magento pokazuje No lub N / A na stronie widoku produktu.

Chcemy więc ukryć atrybuty, które są puste lub nie mają wartości w szablonie.


Będziemy potrzebować znacznie więcej informacji, aby pomóc (który atrybut? Gdzie?)
zaznacza

Odpowiedzi:


7

Szybka poprawka:

W app/[mypackage]/[mytheme]/template/catalog/product/view/attributes.phtml(lub skopiuj ten plik do motywu z podstawowego lub domyślnego motywu niestandardowego):

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

Poniżej nie jest konieczne, aby osiągnąć to, o co prosiłeś:

Te atrybuty są nadal ładowane. Aby to zoptymalizować (jeśli masz dużą liczbę atrybutów w zestawach atrybutów):

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

Zwróć uwagę na dwa // Fix:komentarze.

Ta zmodyfikowana funkcja pochodzi z Mage_Catalog_Block_Product_View_Attributes. Musisz skopiować powyższą funkcję z klasy bloku z modułu. Twoja klasa bloków przepisuje podstawową klasę bloków. Zastosowanie tej opcji znacznie poprawi ładowanie strony widoku produktu w interfejsie użytkownika.

Jeśli nie wiesz, jak utworzyć niestandardowy moduł w lokalnym katalogu, wyszukaj w samouczku, jak utworzyć moduł Magento i jak przepisać klasę bloku podstawowego. Lub spróbuj http://www.magentocommerce.com/magento-connect/ultimate-module-creator.html .


Pierwsze rozwiązanie polegające na zmianie pliku szablonu jest w porządku, ale są dwa problemy. Po pierwsze, jeśli istnieje typ atrybutu Tak / Nie z wartością ustawioną na Nie, zostanie on ukryty w interfejsie użytkownika, co nie jest prawidłowe. Po drugie, jeśli nie ma atrybutów, otrzymasz nagłówek Dodatkowe informacje, które nie są w porządku. Jeśli nie ma atrybutów, nagłówek nie powinien się pojawiać.
ADDISON74

6

Znajdź i otwórz plik attribute.phtml . Ten plik można znaleźć tutaj: /app/design/frontend/[YOUR PACKAGE]/[YOUR THEME]/template/catalog/product/view/attribute.phtml

Otwórz plik i wyszukaj następujące linie:

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

Zastąp całą pętlę foreach następującymi wierszami kodu:

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

Źródło: http://codingbasics.net/hide-magento-attributes-value/

Źródło: http://www.magthemes.com/magento-blog/empty-attributes-showing-na-fix/


4

Nie wiem dokładnie, ale gdzieś to przeczytałem.

Ukryj puste atrybuty, po prostu edytuj plik szablonu o nazwie „attribute.phtml”.

W kodzie znajdź następujące wiersze:

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

i zamień te linie na te:

<?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
Twoje rozwiązanie ukrywa tylko typ atrybutu datetime, który jako jedyny ma wartość N / A. Pole tekstowe, obszar tekstowy, wielokrotny wybór, menu rozwijane nie ma wartości. Jeśli typem atrybutu jest data / godzina, a wartość jest ustawiona na Nie, zamiast ukrywania należy go wyświetlić.
ADDISON74

1

zmień następujący kod w app / design / frontend / base / default / template / catalog / product / view / attribute.phtml :

z:

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

do:

<?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
Nie zmieniaj podstawowych szablonów ...
Jelle Siderius

1

W niestandardowego tematu, przejdź do: catalog\product\view\attributes.phtml. Twój kod PHP powinien sprawdzić, czy wartość atrybutu to „Nie” lub „Nie dotyczy” we wszystkich językach. To nie będzie renderować atrybutów z tymi wartościami.

Kod będzie wyglądał następująco:

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

Zmienna $emptyValueszostanie dodana, a sprawdzenie, czy jest w tablicy, zostało dodane do kodu.

Pamiętaj, aby opróżnić pamięć podręczną po wprowadzeniu zmian w interfejsie użytkownika.


dla mnie nie działa powyżej kodu
Gem

1

Można to zrobić za pomocą małego fragmentu kodu. Znajdź i otwórz attributes.phtmlplik. Ten plik można znaleźć tutaj:/app/design/frontend/[theme name]/[package name]/template/catalog/product/view/attribute.phtml

Otwórz plik i wyszukaj następujące linie:

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

Zastąp całą pętlę foreach następującymi wierszami kodu:

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

Łatwy sposób, ale niekoniecznie lepszy niż inne.

Zaktualizuj plik tłumaczenia Mage_Catalog.csv. Ustaw puste wartości, jak poniżej.

N/A,""
No,""

Atrybuty interfejsu zostaną zignorowane, gdy Nie lub Nie.


0

Czasami spotykamy sklep, który chce mieć wiele różnych atrybutów produktu, ale chcą tylko domyślnego zestawu atrybutów. Oznacza to, że każdy produkt będzie miał powiedzmy ponad 10 opcji, które czasami nie dotyczą niektórych produktów. Na przykład odzież może wymagać atrybutu rozmiaru, ale mebel nie. Ponieważ sklep używa tych samych zestawów atrybutów dla każdego produktu, pusty atrybut rozmiaru będzie wyglądał następująco:

Jest to oczywiście bardzo mylące dla klientów, dlatego lepszym rozwiązaniem byłoby ukrycie pustych wartości atrybutów. Można to zrobić za pomocą małego fragmentu kodu. Znajdź i otwórz attributes.phtmlplik. Ten plik można znaleźć tutaj:app/design/frontend/default/[theme name]/template/catalog/product/view/attribute.phtml

Otwórz plik i wyszukaj następujące linie:

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

Zastąp całą pętlę foreach następującymi wierszami kodu:

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

Otóż ​​to! Puste atrybuty będą teraz ukryte na stronach produktów. Nie zapomnij odświeżyć pamięci podręcznej, aby zobaczyć zmiany.

Źródło : https://tejabhagavan.blogspot.in/2016/03/hide-magento-attributes-with-no-value-2.html


nie działa powyżej kodu
Gem
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.