Call-back icon  Sales: Call 877.832.5289 (N America)|310.295.4144 (International)

Magento

eCommerce Software for Online Growth

Überschreiben von Models und Methoden

Last modified by [m] zentrale on Wed, May 21, 2008 08:02
Source|Old Revisions  |  Back To Group

Überschreiben von Models und Methoden

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>



 

Popular Wiki Tags  |  View all

 module   routes   list   data accessing   action   resource   api   backend   mysql4   controller   getModel   php   Mage API   eav   reference 

Professional Services from the Magento Team

Professional Installation from the Magento Team

Magento Job Board - Some sort of tag line goes here

Latest Posts| View all Jobs
Sales: Call 877.832.5289 (North America) 310.295.4144 (International)
© Copyright 2008 Varien. Magento, eCommerce software, is a trademark of Irubin Consulting Inc. DBA Varien
Privacy Policy|Terms of Service
Magento Community Count
50108 users|486 users currently online|102247 forum posts