Esta é uma pergunta sobre boas práticas de programação no Magento.
Preciso mostrar (na lista de produtos da categoria) o produto com seus produtos relacionados em miniaturas. Então eu editei mypackage/mytheme/template/catalog/product/list.phtml
com algo assim
<?php
$related=$_product->getRelatedProductIds();
if(count($related)>0){
echo '<div class="a'.$ap.'"></div>';
echo '<div class="li_p"><ul>';
foreach($related as $rela){
$rela_nom=Mage::getModel('catalog/product')->load($rela);
echo '<li><a href="'.$rela_nom->getProductUrl().'"> <img src="'.$this->helper('catalog/image')->init($rela_nom, 'small_image')->resize(20).'" width="20" height="20"> </a><li>';
}
echo '</ul></div>';
}
?>
E funciona muito bem.
Mas minha pergunta é: está correto instanciar uma classe de modelo nos arquivos phtml?
Caso contrário, qual seria a melhor maneira de obter essa funcionalidade? Quero dizer, qual arquivo é melhor editar ou que classe é melhor adicionar, onde? Um ajudante?
Você pode dar um pequeno exemplo ou dar uma olhada em quais arquivos são melhores para editar.
fonte
Não há nada errado em carregar um modelo em um
phtml
arquivo. Mas depende de por que você está fazendo isso.Se você precisar de todo o modelo e de todos os dados associados, também poderá carregar o modelo inteiro.
Mas se você apenas precisar do URL do produto (do seu exemplo), poderá carregar a coleção correta
Em seguida, repita isso conforme necessário
fonte
Quer colocar meus 5 centavos aqui. Devemos respeitar os princípios da arquitetura que são usados no Magento. O principal padrão arquitetural usado no Magento é o MVC. No caso do Magento "View", a parte contém várias coisas (bloco, modelo, layout). Os blocos foram criados para mover a lógica de preparação de dados do modelo para outra classe para tornar os modelos mais limpos e legíveis para os desenvolvedores de front-end. Aqui eu quero concordar com Fabian.
Quanto às preocupações de Sonassi sobre muitas classes desnecessárias, sugiro esperar ansiosamente por MVC baseado em push. Nesse caso, consideramos o controlador como comandante que define qual bloco e quais dados devem ter. A ação no controlador pode conter o código necessário para carregar os dados e colocá-los em bloco (por meio de setters mágicos) antes da renderização.
fonte
Concordo com Fabian Blechschmidt que é uma prática ruim e você deve respeitar a Separação de Preocupações.
Para adicionar uma sugestão construtiva:
Isso é algo para o qual as classes Block são destinadas. No seu caso, você teria que reescrever
Mage_Catalog_Block_Product_List
para adicionar a funcionalidade desejada:Deve ser óbvio como usar esses métodos no modelo.
Nota: Reescrever não significa editar o arquivo principal. Siga o tutorial de customização se você não souber reescrever um bloco.
fonte