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.

Klatka kluczowa
źródło
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 .

niejasny
źródło
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/

Michael Yaeger
źródło
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; ?>
Magento_ocodewire
źródło
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; ?>
Daniel
źródło
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.

Jelle Siderius
źródło
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; ?>
Teja Bhagavan Kollepara
źródło
0

Problem rozwiązany :) Rozwiązanie jest tutaj: http://www.magentocommerce.com/boards%20/viewthread/294064/#t407742

Moduł działa poprawnie z magento 1.8.1. Nie trzeba kupować modułu ani edytować żadnego kodu.

Dzięki Niro (twórca tego modułu)

Klatka kluczowa
źródło
1
Link jest zepsuty Czy mogę wiedzieć, aktualizuj link na żywo?
Księżyc
4
lub nawet lepiej: opublikuj poprawną odpowiedź tutaj. Nowy link znów się zepsuje ...
simonthesorcerer
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.

Rafael Patro
źródło
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

Alkesh Goswami
źródło
nie działa powyżej kodu
Gem