Wie verstecke ich ein leeres Attribut in einer Magento-Vorlage?

12

Ich möchte das benutzerdefinierte Attribut in der Magento-Vorlage ausblenden. Meine Magento-Version ist 1.8.1

Wir haben benutzerdefinierte Attribute für unser Produkt wie Marke, Abmessung, Produkttyp usw. hinzugefügt, aber manchmal haben wir diesen Attributen keine Werte hinzugefügt. magento zeigt No oder N / A in der Produktansicht an.

Wir möchten also Attribute ausblenden, die leer sind oder keinen Wert in der Vorlage haben.

Keyframe
quelle
Wir werden viel mehr Informationen brauchen, um zu helfen (welches Attribut? Wo?)
benmarks

Antworten:

7

Eine schnelle Lösung:

In app/[mypackage]/[mytheme]/template/catalog/product/view/attributes.phtml(oder kopieren Sie diese Datei in Ihr Design aus dem Basis- oder benutzerdefinierten Standarddesign):

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

Das Folgende ist nicht notwendig, um das zu erreichen, was Sie gefragt haben:

Diese Attribute werden noch geladen. Um dies zu optimieren (wenn Sie eine große Anzahl von Attributen in Attributsätzen haben), gehen Sie wie folgt vor:

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

Beachten Sie die beiden // Fix:Kommentare.

Diese geänderte Funktion ist von Mage_Catalog_Block_Product_View_Attributes . Sie müssen die obige Funktion in Ihre Blockklasse aus Ihrem Modul kopieren. Ihre Blockklasse schreibt die Kernblockklasse neu. Wenn Sie dies anwenden, wird das Laden der Produktansichtsseite im Frontend erheblich verbessert.

Wenn Sie nicht wissen, wie Sie ein benutzerdefiniertes Modul in einem lokalen Verzeichnis erstellen, suchen Sie in einem Lernprogramm, wie Sie ein Magento-Modul erstellen und eine Kernblockklasse neu schreiben. Oder versuchen Sie es unter http://www.magentocommerce.com/magento-connect/ultimate-module-creator.html .

obskur
quelle
Die erste Lösung zum Ändern der Vorlagendatei ist in Ordnung, es gibt jedoch zwei Probleme. Erstens, wenn es einen Attributtyp Ja / Nein mit dem Wert Nein gibt, wird dieser im Frontend ausgeblendet, was nicht in Ordnung ist. Zweitens, wenn es keine Attribute gibt, erhalten Sie die Überschrift Zusätzliche Informationen, die nicht OK sind. Wenn keine Attribute vorhanden sind, sollte der Header nicht angezeigt werden.
ADDISON74
6

Suchen und öffnen Sie die Datei attributes.phtml . Diese Datei finden Sie hier: /app/design/frontend/[YOUR PACKAGE]/[YOUR THEME]/template/catalog/product/view/attribute.phtml

Öffnen Sie die Datei und suchen Sie nach den folgenden Zeilen:

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

Ersetzen Sie die gesamte foreach-Schleife durch die folgenden Codezeilen:

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

Quelle: http://codingbasics.net/hide-magento-attributes-value/

Quelle: http://www.magthemes.com/magento-blog/empty-attributes-showing-na-fix/

Michael Yaeger
quelle
4

Ich weiß es nicht genau, aber ich habe es irgendwo gelesen.

Blenden Sie die leeren Attribute aus, indem Sie einfach die Vorlagendatei mit dem Namen "attributes.phtml" bearbeiten.

Suchen Sie in Ihrem Code nach folgenden Zeilen:

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

und ersetze diese Zeilen durch diese:

<?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
quelle
1
In Ihrer Lösung wird nur der Attributtyp datetime ausgeblendet, der als einziger den Wert N / A hat. Ein Textfeld, Textbereich, Mehrfachauswahl, Dropdown hat keinen Wert. Wenn der Attributtyp datetime ist und der Wert Nein lautet, sollte er angezeigt werden, anstatt zu verbergen.
ADDISON74
1

Ändern Sie den folgenden Code in app / design / frontend / base / default / template / catalog / product / view / attributes.phtml :

von:

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

zu:

<?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
quelle
2
Ändern Sie nicht die Basisvorlagen ...
Jelle Siderius
1

Navigieren Sie in Ihrem benutzerdefinierten Thema zu: catalog\product\view\attributes.phtml . Ihr PHP-Code sollte prüfen, ob der Attributwert in allen Sprachen "Nein" oder "N / A" ist. Dadurch werden die Attribute mit diesen Werten nicht gerendert.

Der Code sieht folgendermaßen aus:

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

Die Variable $emptyValues wird hinzugefügt und die Prüfung, ob sie sich im Array befindet, wurde dem Code hinzugefügt.

Stellen Sie sicher, dass Sie den Cache leeren, nachdem Sie Änderungen am Frontend vorgenommen haben.

Jelle Siderius
quelle
funktioniert nicht über Code für mich
Gem
1

Dies kann mit einem kleinen Stück Code erfolgen. Suchen und öffnen Sie die attributes.phtmlDatei. Diese Datei finden Sie hier:/app/design/frontend/[theme name]/[package name]/template/catalog/product/view/attribute.phtml

Öffnen Sie die Datei und suchen Sie nach den folgenden Zeilen:

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

Ersetzen Sie die gesamte foreach-Schleife durch die folgenden Codezeilen:

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

Problem gelöst :) Die Lösung ist hier: http://www.magentocommerce.com/boards%20/viewthread/294064/#t407742

Dieses Modul funktioniert einwandfrei mit Magento 1.8.1. Sie müssen kein Modul kaufen oder Code bearbeiten.

Danke Niro (Entwickler dieses Moduls)

Keyframe
quelle
1
Der Link ist kaputt. Kann ich wissen, ob der Live-Link aktualisiert wurde?
Mond
4
oder noch besser: poste die richtige antwort hier. Ein neuer Link wird wieder unterbrochen ...
Simonthesorcerer
0

Einfacher Weg, aber nicht unbedingt besser als andere.

Aktualisieren Sie Ihre Übersetzungsdatei Mage_Catalog.csv. Stellen Sie leere Werte wie unten ein.

N/A,""
No,""

Frontend-Attribute werden ignoriert, wenn Nein oder N / A.

Rafael Patro
quelle
0

Manchmal stoßen wir auf ein Geschäft, das viele verschiedene Produktattribute haben möchte, aber nur die Standardattribute festlegen möchte. Dies bedeutet, dass jedes Produkt über 10 Optionen verfügt, die manchmal für bestimmte Produkte nicht gelten. Beispielsweise benötigt ein Kleidungsstück möglicherweise ein Größenattribut, ein Möbelstück jedoch nicht. Da der Store für jedes Produkt die gleichen Attributmengen verwendet, wird das Attribut für die leere Größe folgendermaßen angezeigt:

Dies ist natürlich für Kunden sehr verwirrend. Daher ist es die bessere Option, leere Attributwerte auszublenden. Dies kann mit einem kleinen Stück Code erfolgen. Suchen und öffnen Sie die attributes.phtmlDatei. Diese Datei finden Sie hier:app/design/frontend/default/[theme name]/template/catalog/product/view/attribute.phtml

Öffnen Sie die Datei und suchen Sie nach den folgenden Zeilen:

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

Ersetzen Sie die gesamte foreach-Schleife durch die folgenden Codezeilen:

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

Das ist es! Leere Attribute werden jetzt auf Ihren Produktseiten ausgeblendet. Vergessen Sie nicht, Ihren Cache zu aktualisieren, um die Änderungen zu sehen.

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

Alkesh Goswami
quelle
funktioniert nicht über Code
Gem