Como ocultar atributos vazios em qualquer template magento?


12

Eu quero ocultar o atributo personalizado no modelo magento. Minha versão do magento é 1.8.1

Adicionamos atributos personalizados para o nosso produto, como marca, dimensão, tipo de produto etc., mas às vezes não adicionamos valores nesses atributos. magento mostra Não ou N / D na página de visualização do produto.

Portanto, queremos ocultar atributos vazios ou sem valor no modelo.


Vamos precisar de bastante mais informações, a fim de ajuda (que atributo onde?)
benmarks

Respostas:


7

Uma solução rápida:

Em app/[mypackage]/[mytheme]/template/catalog/product/view/attributes.phtml(ou copie este arquivo no seu tema da base ou tema personalizado padrão):

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

Abaixo não é necessário para conseguir o que você pediu:

Esses atributos ainda estão carregados. Para otimizar isso (se você tiver um grande número de atributos nos conjuntos de atributos), faça:

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

Observe os dois // Fix:comentários.

Esta função modificada é de Mage_Catalog_Block_Product_View_Attributes. Você precisa copiar a função acima na sua classe de bloco do seu módulo. Sua classe de bloco reescreve a classe de bloco principal. A aplicação disso melhorará consideravelmente o carregamento da página de visualização do produto no front-end.

Se você não sabe como criar um módulo personalizado no diretório local, pesquise um tutorial sobre como criar um módulo Magento e como reescrever uma classe de bloco principal. Ou tente http://www.magentocommerce.com/magento-connect/ultimate-module-creator.html .


A primeira solução para alterar o arquivo de modelo é boa, mas há dois problemas. Primeiro, se houver um tipo de atributo Sim / Não com um valor definido como Não, ele ficará oculto no frontend, o que não está correto. Segundo, se não houver atributos, você receberá o cabeçalho Informações Adicionais, que não está OK. Se não houver atributos, esse cabeçalho não deve aparecer.
precisa saber é o seguinte

6

Encontre e abra o arquivo attribute.phtml . Este arquivo pode ser encontrado aqui: /app/design/frontend/[YOUR PACKAGE]/[YOUR THEME]/template/catalog/product/view/attribute.phtml

Abra o arquivo e procure as seguintes linhas:

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

Substitua o loop foreach inteiro pelas seguintes linhas de código:

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

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

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


4

Não sei exatamente, mas já li em algum lugar.

Oculte os atributos vazios apenas editando o arquivo de modelo nomeado como "attribute.phtml".

No seu código, encontre as seguintes linhas:

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

e substitua estas linhas por estas:

<?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
Sua solução oculta apenas o tipo de atributo datetime, que é o único com valor N / D. Um campo de texto, área de texto, seleção múltipla e menu suspenso não tem valor. Se o tipo de atributo for datetime e o valor estiver definido como No, ele deverá ser mostrado em vez de ocultar.
precisa saber é o seguinte

1

altere o seguinte código em app / design / frontend / base / default / template / catalog / product / view / attribute.phtml :

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

para:

<?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
Não alterar os modelos de base ...
Jelle Siderius

1

Em seu tema personalizado, navegue até: catalog\product\view\attributes.phtml. Seu código PHP deve verificar se o valor do atributo é "Não" ou "N / D" em todos os idiomas. Isso não renderizará os atributos com esses valores.

O código ficará assim:

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

A variável $emptyValuesé adicionada e a verificação se está na matriz foi adicionada ao código.

Certifique-se de esvaziar o cache depois de fazer alterações no frontend.


não trabalhar acima código para mim
Gem

1

Isso pode ser feito com um pequeno pedaço de código. Encontre e abra o attributes.phtmlarquivo. Este arquivo pode ser encontrado aqui:/app/design/frontend/[theme name]/[package name]/template/catalog/product/view/attribute.phtml

Abra o arquivo e procure as seguintes linhas:

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

Substitua o loop foreach inteiro pelas seguintes linhas de código:

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

Maneira fácil, mas não necessária melhor que outras.

Atualize seu arquivo de tradução Mage_Catalog.csv. Defina valores vazios como abaixo.

N/A,""
No,""

Os atributos de front-end serão ignorados quando Não ou N / D.


0

Às vezes, encontramos uma loja que deseja ter muitos atributos diferentes do produto, mas eles querem apenas o conjunto de atributos padrão. Isso significa que todo produto terá, digamos, mais de 10 opções que às vezes não se aplicam a determinados produtos. Por exemplo, uma peça de roupa pode precisar de um atributo de tamanho, mas uma peça de mobília não. Como a loja usa os mesmos conjuntos de atributos para cada produto, o atributo de tamanho vazio será exibido assim:

É claro que isso é muito confuso para os clientes; portanto, a melhor opção seria ocultar os valores dos atributos que estão vazios. Isso pode ser feito com um pequeno pedaço de código. Encontre e abra o attributes.phtmlarquivo. Este arquivo pode ser encontrado aqui:app/design/frontend/default/[theme name]/template/catalog/product/view/attribute.phtml

Abra o arquivo e procure as seguintes linhas:

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

Substitua o loop foreach inteiro pelas seguintes linhas de código:

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

É isso aí! Os atributos vazios agora serão ocultados nas páginas do seu produto. Não se esqueça de atualizar seu cache para ver as alterações.

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


não trabalhar acima código
Gem
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.