Comment masquer un attribut vide dans n'importe quel modèle magento?

12

Je veux masquer l'attribut personnalisé dans le modèle magento. Ma version de Magento est 1.8.1

Nous avons ajouté un attribut personnalisé pour notre produit comme la marque, la dimension, le type de produit, etc., mais parfois nous n'avons pas ajouté de valeurs dans ces attributs. magento affiche Non ou N / A dans la page d'affichage du produit.

Donc, nous voulons masquer les attributs vides ou sans valeur dans le modèle.

Image clé
la source
Nous aurons besoin de beaucoup plus d'informations pour vous aider (quel attribut? Où?)
benmarks

Réponses:

7

Une solution rapide:

Dans app/[mypackage]/[mytheme]/template/catalog/product/view/attributes.phtml(ou copiez ce fichier dans votre thème à partir du thème personnalisé de base ou par défaut):

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

Ce qui suit n'est pas nécessaire pour réaliser ce que vous avez demandé:

Ces attributs sont toujours chargés. Pour optimiser cela (si vous avez un grand nombre d'attributs dans les jeux d'attributs), procédez comme suit:

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

Notez les deux // Fix:commentaires.

Cette fonction modifiée vient de Mage_Catalog_Block_Product_View_Attributes. Vous devez copier la fonction ci-dessus dans votre classe de bloc depuis votre module. Votre classe de blocs réécrit la classe de blocs de base. L'application de cela améliorera considérablement le chargement de la page de visualisation du produit sur le frontend.

Si vous ne savez pas comment créer un module personnalisé dans le répertoire local, recherchez un didacticiel sur la façon de créer un module Magento et de réécrire une classe de bloc de base. Ou essayez http://www.magentocommerce.com/magento-connect/ultimate-module-creator.html .

obscur
la source
La première solution de modification du fichier de modèle est très bien, mais il y a deux problèmes. Tout d'abord, s'il existe un type d'attribut Oui / Non avec une valeur définie sur Non, il sera masqué dans le frontend, ce qui n'est pas correct. Deuxièmement, s'il n'y a pas d'attributs, vous obtiendrez l'en-tête Informations supplémentaires qui n'est pas OK. S'il n'y a aucun attribut, cet en-tête ne doit pas apparaître.
ADDISON74
6

Recherchez et ouvrez le fichier attributes.phtml . Ce fichier se trouve ici: /app/design/frontend/[YOUR PACKAGE]/[YOUR THEME]/template/catalog/product/view/attribute.phtml

Ouvrez le fichier et recherchez les lignes suivantes:

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

Remplacez la boucle foreach entière par les lignes de code suivantes:

<?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: http://codingbasics.net/hide-magento-attributes-value/

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

Michael Yaeger
la source
4

Je ne sais pas exactement, mais je l'ai lu quelque part.

Masquez les attributs vides en modifiant simplement le fichier de modèle nommé «attributes.phtml».

Dans votre code, recherchez les lignes suivantes:

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

et remplacez ces lignes par celles-ci:

<?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
la source
1
Votre solution masque uniquement le type d'attribut datetime qui est le seul à avoir une valeur N / A. Un champ de texte, une zone de texte, une sélection multiple, une liste déroulante n'a aucune valeur. Si le type d'attribut est datetime et que la valeur est définie sur No, il doit être affiché au lieu de masquer.
ADDISON74
1

changez le code suivant dans app / design / frontend / base / default / template / catalogue / product / view / attributes.phtml :

de:

<?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; ?>
Daniel
la source
2
Ne changez pas les modèles de base ...
Jelle Siderius
1

Dans votre thème personnalisé, accédez à: catalog\product\view\attributes.phtml. Votre code PHP doit vérifier si la valeur de l'attribut est "Non" ou "N / A" dans toutes les langues. Cela ne rendra pas les attributs avec ces valeurs.

Le code ressemblera à ceci:

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

La variable $emptyValuesest ajoutée et la vérification de sa présence dans le tableau a été ajoutée au code.

Assurez-vous de vider le cache après avoir modifié le frontend.

Jelle Siderius
la source
ne fonctionne pas au-dessus du code pour moi
Gem
1

Cela peut être fait avec un petit morceau de code. Recherchez et ouvrez le attributes.phtmlfichier. Ce fichier se trouve ici:/app/design/frontend/[theme name]/[package name]/template/catalog/product/view/attribute.phtml

Ouvrez le fichier et recherchez les lignes suivantes:

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

Remplacez la boucle foreach entière par les lignes de code suivantes:

<?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
la source
0

Problème résolu :) La solution est ici: http://www.magentocommerce.com/boards%20/viewthread/294064/#t407742

Ce module fonctionne bien avec magento 1.8.1 Pas besoin d'acheter de module ou de modifier un code.

Merci Niro (développeur de ce module)

Image clé
la source
1
Le lien est rompu Puis-je connaître la mise à jour du lien en direct?
Lune
4
ou encore mieux: postez la bonne réponse ici. Un nouveau lien se
cassera à
0

Moyen facile, mais pas nécessaire mieux que d'autres.

Mettez à jour votre fichier de traduction Mage_Catalog.csv. Définissez des valeurs vides comme ci-dessous.

N/A,""
No,""

Les attributs frontaux seront ignorés lorsque Non ou N / A.

Rafael Patro
la source
0

Parfois, nous rencontrons un magasin qui veut avoir de nombreux attributs de produit différents, mais ils ne veulent que le jeu d'attributs par défaut. Cela signifie que chaque produit aura, disons, plus de 10 options qui, parfois, ne s'appliquent pas à certains produits. Par exemple, un vêtement peut avoir besoin d'un attribut de taille, mais pas un meuble. Étant donné que le magasin utilise les mêmes ensembles d'attributs pour chaque produit, l'attribut de taille vide s'affichera comme ceci:

Ceci est bien sûr très déroutant pour les clients, donc la meilleure option serait de masquer les valeurs d'attribut qui sont vides. Cela peut être fait avec un petit morceau de code. Recherchez et ouvrez le attributes.phtmlfichier. Ce fichier se trouve ici:app/design/frontend/default/[theme name]/template/catalog/product/view/attribute.phtml

Ouvrez le fichier et recherchez les lignes suivantes:

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

Remplacez la boucle foreach entière par les lignes de code suivantes:

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

C'est ça! Les attributs vides seront désormais masqués sur vos pages de produits. N'oubliez pas de rafraîchir votre cache pour voir les changements.

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

Alkesh Goswami
la source
ne fonctionne pas au-dessus du code
Gem