Überschreiben von Models und Methoden

Last modified by [m] zentrale on Tue, February 17, 2009 11:06
Source|Old Revisions  

This is an old revision of the document!


Beispiel #1 - Überschreiben eines Models

Im ersten Beispiel möchte ich erklären wie Ihr eine Mehtode aus einem Core-Model überlagern/überschreiben könnt.

Zu Beginn erstellen wir uns ein eigenes Modul. Dazu legen wir im Verzeichnis /app/code/local/Mage ein Verzeichnis für unser Modul an. Ich nenne es mal Mymodul. Innerhalb dieses Verzeichnises legen wir zwei weitere Ordner an, einmal etc (Enthält die Modulkonfiguration) und einmal Model (Enthält die Models). In das Modelverzeichnis legen wir eine PHP Datei mit dem Namen Mymodul.php, das ist das Model des neuen Moduls.

Mymodul.php

  1.       class Mage_Mymodul_Model_Mymodul extends Mage_Core_Model_Abstract
  2.    
  3.       {
  4.    
  5.          
  6.    
  7.       }

Im nächsten Schritt erstellen wir die config.xml Datei im Ordner etc des Moduls mit folgendem Inhalt:

  1.       <?xml version="1.0"?>
  2.    
  3.       <config>
  4.    
  5.           <modules>
  6.    
  7.               /* Definiert mein Modul und dessen Version */
  8.    
  9.               <Mage_Mymodul>
  10.    
  11.                   <version>0.2.0</version>
  12.    
  13.               </Mage_Mymodul>
  14.    
  15.           </modules>
  16.    
  17.           <global>       
  18.  
  19.               <models>
  20.  
  21.                   /* Definiert mein Modul und das zugehörige Model */
  22.  
  23.                   <mymodul>
  24.  
  25.                       <class>Mage_Mymodul_Model</class>               
  26.  
  27.                   </mymodul>           
  28.  
  29.               </models>       
  30.  
  31.           </global>   
  32.  
  33.       </config>

Nun wollen wir die Grundlagen schaffen die Funktion getTheme() aus dem Model Core/Design/Package.php zu üerschreiben. Hierzu erstellen wir in unserem Model Ordner einen neuen Ordner “Design” und darin die PHP Datei Package.php mit folgendem Inhalt.

  1.       /* Unser Model mit dem Ursprugsmodel erweitern */
  2.    
  3.       class Mage_Mymodul_Model_Design_Package extends Mage_Core_Model_Design_Package
  4.    
  5.       {
  6.    
  7.           public function getTheme($type)
  8.    
  9.           {
  10.    
  11.              
  12.    
  13.               if (empty($this->_theme[$type])) {           
  14.    
  15.                   $this->_theme[$type] = Mage::getStoreConfig('design/theme/'.$type,$this->getStore());
  16.    
  17.                   if ($type!=='default' && empty($this->_theme[$type])) {
  18.  
  19.                       $this->_theme[$type] = $this->getTheme('default');
  20.  
  21.                       if (empty($this->_theme[$type])) {
  22.  
  23.                           $this->_theme[$type] = self::DEFAULT_THEME;
  24.  
  25.                       }
  26.  
  27.                   }
  28.  
  29.               }
  30.  
  31.              
  32.  
  33.               return $this->_theme[$type];
  34.  
  35.           }   
  36.  
  37.       }

Als vorletzten Schritt editieren wir unsere config.xml um Magento anzuweisen das Model zu überlagern/überschreiben. Hierzu fügen wir folgenden Code in die config.xml ein, und zwar in den Zweig <models>:

  1.       <core> /* Modul Core */
  2.    
  3.                       <rewrite> /* überlagere/überschreibe */
  4.    
  5.                           <design_package> /* Welches Model soll überschrieben werden */
  6.    
  7.                           Mage_Mymodul_Model_Design_Package
  8.    
  9.                           </design_package>
  10.  
  11.                       </rewrite>
  12.    
  13.                   </core>

Die config.xml sollte dann diesen Aufbau haben:

  1.       <?xml version="1.0"?>
  2.    
  3.       <config>
  4.    
  5.           <modules>
  6.    
  7.               /* Definiert mein Modul und dessen Version */
  8.    
  9.               <Mage_Mymodul>
  10.    
  11.                   <version>0.2.0</version>
  12.    
  13.               </Mage_Mymodul>
  14.    
  15.           </modules>
  16.  
  17.           <global>       
  18.  
  19.               <models>
  20.  
  21.                   /* Definiert mein Modul und das zugehörige Model */
  22.  
  23.                   <mymodul>
  24.  
  25.                       <class>Mage_Mymodul_Model</class>               
  26.  
  27.                   </mymodul>
  28.  
  29.                   <core> /* Modul Core */
  30.  
  31.                       <rewrite> /* überlagere/überschreibe */
  32.  
  33.                           <design_package> /* Welches Model soll überschrieben werden, Wert ist unser neues Model */
  34.  
  35.                           Mage_Mymodul_Model_Design_Package
  36.  
  37.                           </design_package>
  38.  
  39.                       </rewrite>
  40.  
  41.                   </core>
  42.  
  43.               </models>       
  44.  
  45.           </global>   
  46.  
  47.       </config>

Im letzten Schritt legen wir eine Mage_Mymodul.xml, mit nachfolgendem Inhalt, im Verzeichnis app/etc/modules. Diese Datei weisst Magento an unser Modul zu laden

  1.       <?xml version="1.0"?>
  2.  
  3.       <config>
  4.    
  5.           <modules>
  6.    
  7.               <Mage_Mymodul>>
  8.  
  9.                   <active>true</active> /* Aktivieren */
  10.    
  11.                   <codePool>local</codePool>/* Wo liegt das Modul core,community oder local*/
  12.    
  13.               </Mage_Mymodul>>
  14.    
  15.           </modules>
  16.  
  17.       </config>

Beispiel #2 - Überschreiben eines Blocks

Im zweiten Teil wollen wir eine Methode aus dem Block “Poplular” (Erstellt die Box mit den beliebtesten Tags) des Moduls Tag überschreiben. Standardisiert werden die 20 beliebtesten Tags ausgelesen, wir wollen aber nur die beliebtesten 10 Tags angezeigt bekommen.

Im ersten Schritt erstellen wir einen neuen Ordner “Block” in unserem Modul. Angeleht am Tag Modul erstellen wir einen weitern Ordner “Tag” in diesem Ordner und darin die PHP-Datei Popular.php.

  1.       /* Wir erweiterun unser Model/Block mit dem original Model/Block */
  2.    
  3.       class Mage_Mymodul_Block_Tag_Popular extends Mage_Tag_Block_Popular
  4.    
  5.       {
  6.    
  7.        
  8.    
  9.              protected function _loadTags()
  10.    
  11.           {
  12.  
  13.               if (empty($this->_tags)) {
  14.  
  15.                   $this->_tags = array();
  16.    
  17.        
  18.  
  19.                   $tags = Mage::getModel('tag/tag')->getPopularCollection()
  20.  
  21.                       ->joinFields(Mage::app()->getStore()->getId())
  22.  
  23.                       /*->limit(20)*/
  24.  
  25.                       /* Wir definieren das Limit der Query neu */
  26.  
  27.                       ->limit(10)
  28.  
  29.                       ->load()
  30.  
  31.                       ->getItems();
  32.  
  33.        
  34.  
  35.                   if( count($tags) == 0 ) {
  36.  
  37.                       return $this;
  38.  
  39.                   }
  40.  
  41.        
  42.  
  43.        
  44.  
  45.                   $this->_maxPopularity = reset($tags)->getPopularity();
  46.  
  47.                   $this->_minPopularity = end($tags)->getPopularity();
  48.  
  49.                   $range = $this->_maxPopularity - $this->_minPopularity;
  50.  
  51.                   $range = ( $range == 0 ) ? 1 : $range;
  52.  
  53.                   foreach ($tags as $tag) {
  54.  
  55.                       if( !$tag->getPopularity() ) {
  56.  
  57.                           continue;
  58.  
  59.                       }
  60.  
  61.                       $tag->setRatio(($tag->getPopularity()-$this->_minPopularity)/$range);
  62.  
  63.                       $this->_tags[$tag->getName()] = $tag;
  64.  
  65.                   }
  66.  
  67.                   ksort($this->_tags);
  68.  
  69.               }
  70.  
  71.               return $this;
  72.  
  73.           }   
  74.  
  75.       }

Wir haben nun die Methode überarbeitet und das SQL-Limit auf 10 gesetzt. Nun müssen wir wie beim Überlagern des Model in unserer config.xml dafür sorgen das nun der Block mit unserem Block überschrieben wird. Hierzu fügen wir folgenden Code in unsere config.xml ein:

  1.       <blocks> /* Nein nicht das Model sondern die Blocks */
  2.  
  3.       <tag>/* Modul */
  4.    
  5.       <rewrite>
  6.    
  7.       <popular> /* Welcher Block soll überlagert werden */
  8.    
  9.       Mage_Mymodul_Block_Tag_Popular
  10.    
  11.       </popular>
  12.  
  13.       </rewrite>
  14.  
  15.       </tag>
  16.  
  17.       </blocks>

Unsere neue config.xml sieht nun folgendermaßen aus:

  1.       <?xml version="1.0"?>
  2.    
  3.       <config>
  4.  
  5.           <modules>
  6.    
  7.               /* Definiert mein Modul und dessen Version */
  8.    
  9.               <Mage_Mymodul>
  10.  
  11.                   <version>0.2.0</version>
  12.    
  13.               </Mage_Mymodul>
  14.    
  15.           </modules>
  16.  
  17.           <global>       
  18.  
  19.               <models>
  20.  
  21.                   /* Definiert mein Modul und das zugehörige Model */
  22.  
  23.                   <mymodul>
  24.  
  25.                       <class>Mage_Mymodul_Model</class>               
  26.  
  27.                   </mymodul>
  28.  
  29.                   <core> /* Modul Core */
  30.  
  31.                       <rewrite> /* überlagere/überschreibe */
  32.  
  33.                           <design_package> /* Welches Model soll überschrieben werden, Wert ist unser neues Model */
  34.  
  35.                           Mage_Mymodul_Model_Design_Package
  36.  
  37.                           </design_package>
  38.  
  39.                       </rewrite>
  40.  
  41.                   </core>
  42.  
  43.               </models>
  44.  
  45.               <blocks>           
  46.  
  47.                   <tag>
  48.  
  49.                        <rewrite>
  50.  
  51.                           <popular>Mage_Mymodul_Block_Tag_Popular</popular>
  52.  
  53.                       </rewrite>
  54.  
  55.                   </tag>           
  56.  
  57.               </blocks>
  58.  
  59.           </global>   
  60.  
  61.       </config>



 

Magento 2 GitHub Repository

Magento Job Board - Some sort of tag line goes here

Latest Posts| View all Jobs