You are here

Omschrijf de magento module structuur

Wat is een magento module

Een magento module is een verzameling van PHP en XML bestanden die de functionaliteit van de webshop uitbreidt. Om een module te maken moeten we ons houden aan een structuur die magento gedefinieerd heeft. Zo zal magento de "module/etc" map raadplegen voor configuratie bestanden van de module. Een standaard module zal de volgende structuur moeten aanhouden.

Magento module structuur

-------- Namespace
------------ Modulenaam
---------------- Block
---------------- controllers
---------------- data
---------------- etc
---------------- Helper
---------------- Model
---------------- sql

Namespace

Een namespace is een unieke naam waaronder de modules vallen, vaak de naam van het bedrijf. Als ik een module maak dan gebruik ik de namespace "Khoekman" en als ik het voor me werk maak dan gebruik ik Aquait. Let erop dat de Namespace begint met een Hoofdletter en daarna alleen maar kleine letters heeft.

Modulenaam

Net als bij de namespace begint deze met een hoofdletter en worden daarna alleen kleine letters gebruikt. Als we een Hallo Wereld module zullen maken dan noemen we deze bijvoorbeeld. "Helloworld". Met de namespace erbij krijgen we dan bijvoorbeeld de "Khoekman_Helloworld" module.

etc

Zoals ik in de inleiding al aangaf zal deze folder geraadpleegd worden om de configuratie van de module uit te lezen. Magento doet dit doormiddel van XML bestanden. Je omschijft in zo`n XML bestand eigenlijk de module. Je zet er bijvoorbeeld in hoe de module heet, of er afhankelijkheden zijn, welke helpers en models er zijn, extra routes, menu uitbreidingen. Kortom zowat alles wordt aangegeven in de XML. Deze folder bevat in ieder geval een [b]config.xml[/b] maar kan ook andere xml configuratie bestanden bevatten.

[b]Deze code leest de configuratie uit:[/b]

    /**
     * Iterate all active modules "etc" folders and combine data from
     * specidied xml file name to one object
     *
     * @param   string $fileName
     * @param   null|Mage_Core_Model_Config_Base $mergeToObject
     * @return  Mage_Core_Model_Config_Base
     */
    public function loadModulesConfiguration($fileName, 
        $mergeToObject = null, $mergeModel=null)
    {
        $disableLocalModules = !$this->_canUseLocalModules();

        if ($mergeToObject === null) {
            $mergeToObject = clone $this->_prototype;
            $mergeToObject->loadString('');
        }
        if ($mergeModel === null) {
            $mergeModel = clone $this->_prototype;
        }
        $modules = $this->getNode('modules')->children();
        foreach ($modules as $modName=>$module) {
            if ($module->is('active')) {
                if ($disableLocalModules 
                    && ('local' === (string)$module->codePool)) {
                    continue;
                }
                if (!is_array($fileName)) {
                    $fileName = array($fileName);
                }

                foreach ($fileName as $configFile) {
                    $configFile = $this->getModuleDir('etc', $modName)
                    . DS . $configFile;
                    if ($mergeModel->loadFile($configFile)) {
                        $mergeToObject->extend($mergeModel, true);
                    }
                }
            }
        }
        return $mergeToObject;
    }

De functie krijgt een XML bestand en geeft je een PHP class met configuratie terug. Omdat magento zo flexibel is en bijna alles geconfigreerd kan worden zullen we veel te maken hebben met deze XML bestanden.

Controllers

Een controller ontvangt de request en haalt hier de eventuele parameters uit. Vervolgens zorgt de controller ervoor dat de juiste helpers, models , forms worden aangeroepen met de desbetreffende parameters De controllers sturen vooral aan, ze zijn vaak niet erg uitgebreid omdat de meeste logica plaats vind in de models en helpers. Een controller is enkel verantwoordelijk voor de aansturing.

Block

Een block vertegenwoordigt een view in het MVC model. Dit onderdeel zorgt ervoor dat de layout wordt voorbereid en aan de hand van models de juiste data mee geeft. Deze kunnen we later stijlen aan de hand van de layout en templates.

Helper

Een helper bevat functies die aan de hand van een duidelijke benaming data ophalen uit de modellen. Je kunt bijvoorbeeld een helper hebben die de definitieve prijs ophaald. De helper zorgt ervoor dat de functies worden aangeroepen die de prijs opbouwt. Standaard wordt de volgende helper ingeladen bij een module [b]"Modulename/Helper/Data.php"[/b] Deze kunnen we dan als volgt aanroepen:

Mage::helper('modulename')->methodName();

Helpers kunnen in elk block, model, controller en template bestand worden gebruikt.

Model

Magento heeft twee types modellen. EAV modellen en Standaard modellen. Beide type modellen hebben een resource. Als de resource extend van de abstracte EAV class is het een EAV model anders een standaard model. De resource maakt gebruikt van een lees en schrijf adapter. Via deze adapters lezen we uit de database en schrijven we ernaartoe.

Naast deze adapters heeft de resource ook een collection class. Dit is een object dat je kunt zien als een geavanceerde array met methodes.

De resource kan installatie en upgrade scripts bevatten. Bij het laden van een pagina wordt er gekeken of de module voorkomt in de core_resource tabel. Als deze niet voorkomt of de versie komt niet overeen wordt er gekeken of er een installatie script beschikbaar is. Als de versie hoger is wordt er gekeken welke upgrade scripts er uitgevoerd dienen te worden.

Mage::getModel(‘catalog/product’)->getCollection();

De bovenstaande code haalt dus het product model op. En zorgt dat via de resource, database adapters de data wordt ingelezen en aan de hand van een collection wordt terug gegeven. Nu kunnen wij door de collectie heen gaan en de catalog/product modellen aanspreken.

Data

Deze folder bevat PHP scripts die kunnen worden uitgevoerd nadat er een installatie script wordt uitgevoerd, of wanneer er een upgrade gedaan is. Dit zorgt er dus voor dat de initiele data in de database tercht komt. Bij de Poll module zorgt een PHP script in deze folder er bijvoorbeeld voor dat er een poll beschikbaar is na installatie.

$installer = $this;
   
  $pollModel = Mage::getModel('poll/poll');
  
  $pollModel  ->setDatePosted(now())
              ->setPollTitle('What is your favorite color')
              ->setStoreIds(array(1));
  
  $answers  = array(
                  array('Green', 4),
                  array('Red', 1),
                  array('Black', 0),
                  array('Magenta', 2)
                  );
  
  foreach( $answers as $key => $answer ) {
      $answerModel = Mage::getModel('poll/poll_answer');
      $answerModel->setAnswerTitle($answer[0])
                  ->setVotesCount($answer[1]);
  
      $pollModel->addAnswer($answerModel);
  }
  
  $pollModel->save();

Sql

Deze folder bevat scripts die worden uitgevoerd bij de installatie van de module. Wanneer er een script wordt toegevoegd met een nieuwere versie dan in de core_resource tabel bekend is zal het script worden uitgevoerd. Omdat de core_resource wordt bijgewerkt zal dit eenmalig gebeuren. Onderstaande code zorgt ervoor dat het tijdens de installatie een tabel wordt aangemaakt voor de poll antwoorden.

/**
  * Create table 'poll_answer'
*/
  $table = $installer->getConnection()
      ->newTable($installer->getTable('poll/poll_answer'))
      ->addColumn('answer_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
          'identity'  => true,
          'unsigned'  => true,
          'nullable'  => false,
          'primary'   => true,
          ), 'Answer Id')
      ->addColumn('poll_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
          'unsigned'  => true,
          'nullable'  => false,
          'default'   => '0',
          ), 'Poll Id')
      ->addColumn('answer_title', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
          ), 'Answer title')
      ->addColumn('votes_count', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
          'unsigned'  => true,
          'nullable'  => false,
          'default'   => '0',
          ), 'Votes Count')
      ->addColumn('answer_order', Varien_Db_Ddl_Table::TYPE_SMALLINT, null, array(
          'nullable'  => false,
          'default'   => '0',
          ), 'Answers display')
      ->addIndex($installer->getIdxName('poll/poll_answer', array('poll_id')),
          array('poll_id'))
      ->addForeignKey($installer->getFkName('poll/poll_answer', 'poll_id', 
          'poll/poll', 'poll_id'),'poll_id', $installer->getTable('poll/poll'), 
          'poll_id',
          Varien_Db_Ddl_Table::ACTION_CASCADE, Varien_Db_Ddl_Table::ACTION_CASCADE)
      ->setComment('Poll Answers');
  $installer->getConnection()->createTable($table);

Ik zal in andere artikelen verder ingaan op de verschillende onderdelen van de module.

Comments

test

Feedback

Ik schrijf deze artikelen om mijn magento kennis te verbeteren. Graag ontvang ik feedback op de artikelen. Ik heb de mogelijkheid om commentaar achter te laten daarom ingeschakeld maar zal de feedback wel filteren zodat het overzichtelijk blijft. Ik zal de artikelen  blijven bijwerken om de informatie zo compleet mogelijk te maken.