È utile creare un'istanza di una classe getModel su modelli phtml?


14

Questa è una domanda riguardante le buone pratiche di programmazione in Magento.

Devo mostrare (nella lista dei prodotti della categoria) il prodotto con i relativi prodotti nelle miniature. Quindi ho modificato mypackage/mytheme/template/catalog/product/list.phtmlcon qualcosa del genere

<?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 funziona molto bene.

Ma la mia domanda è: è corretto istanziare una classe di modello sui file phtml?

In caso contrario, quale sarebbe il modo migliore per ottenere questa funzionalità? Voglio dire, quale file è meglio modificare o quale classe è meglio aggiungere, dove? Un aiutante?

Potete fornire un piccolo esempio o darmi uno sguardo a quali file è meglio modificare.

Risposte:


10

Non sono d'accordo con la risposta di Sonassi :)

L'avvio di un modello nel modello è una cattiva pratica. A volte è necessario e talvolta lo faccio anche io. Ma se è possibile, dovresti impedire di aggiungere codice ai tuoi file pHTML e echodare solo cose.

È la separazione delle preoccupazioni . Non confondere HTML e roba di programmazione. Questo dovrebbe essere nella classe Block.


3
Sono anche d'accordo con il tuo disaccordo :) Ma caricare un singolo modello al di fuori di un ciclo non è la fine del mondo. Altrimenti diventa un caso di astrazione infinita - l'aggiunta di ulteriori classi esistenti semplicemente per la separazione di una singola riga di codice dalla vista. Aggiunge semplicemente per riscrivere le spese generali, per non parlare della manutenzione.
Ben Lessani - Sonassi,

Hai troppo tempo per correggere tutti i miei errori di ortografia, grazie per quello :-)
Fabian Blechschmidt,

A proposito, hai ragione sonassi :-) È solo qualcosa con cui dovremmo stare attenti. Ho visto query SQL in file phtml ... NO NO :-)
Fabian Blechschmidt,

4

Non c'è niente di sbagliato nel caricare un modello in un phtmlfile. Ma dipende dal motivo per cui lo stai facendo.

Se è necessario l'intero modello e tutti i dati ad esso associati, è possibile caricare l'intero modello.

Ma se hai solo bisogno dell'URL del prodotto (dal tuo esempio), puoi semplicemente caricare la raccolta corretta

$_product->getRelatedProductCollection();

Quindi scorrere attraverso ciò come necessario

<?php $_relatedCollection = $_product->getRelatedProductCollection(); ?>
<?php foreach ($_relatedCollection as $_item): ?>
<li>
  <a href="<?php echo $_item->getProductUrl(); ?>">
    <img src="<?php echo $this->helper('catalog/image')->init($_item, 'small_image')->resize(20); ?>" width="20" height="20">
  </a>
<li>
<?php endforeach; ?>

3

Vuoi mettere qui i miei 5 centesimi. Dovremmo rispettare i principi dell'architettura utilizzati in Magento. Il modello architettonico principale utilizzato in Magento è MVC. Nel caso di Magento la parte "Visualizza" contiene diverse cose (blocco, modello, layout). Sono stati creati blocchi per spostare la logica di preparazione dei dati dal modello a un'altra classe per rendere i modelli più puliti e leggibili per gli sviluppatori di frontend. Qui voglio essere d'accordo con Fabian.

Per quanto riguarda le preoccupazioni di Sonassi per troppe classi non necessarie, suggerisco di aspettare con impazienza MVC basato. In questo caso consideriamo il controller come comandante che definisce quale blocco e quali dati dovrebbero avere. L'azione nel controller potrebbe contenere il codice richiesto per caricare i dati e metterli in blocco (tramite setter magici) prima del rendering.


3

Concordo con Fabian Blechschmidt sul fatto che sia una cattiva pratica e che dovresti rispettare la separazione delle preoccupazioni.

Per aggiungere un suggerimento costruttivo:

Questo è qualcosa per cui sono pensate le classi Block. Nel tuo caso dovresti riscrivere Mage_Catalog_Block_Product_List per aggiungere la funzionalità desiderata:

public function hasRelatedProducts()
{
    return count($this->getRelatedProductIds()) > 0;
}
public function getRelatedProducts()
{
    $products = array();
    foreach ($this->getRelatedProductIds() as $id) {
        $products[] = Mage::getModel('catalog/product')->load($id);
    }
    return $products;
}

Dovrebbe essere ovvio come utilizzare questi metodi nel modello.

Nota: riscrivere non significa modificare il file principale. Segui il tutorial di personalizzazione se non sai come riscrivere un blocco.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.