Dans un module magento il y a 2 parties, le « code » et les « templates ».
/app/code/local/monNameSpace/monNomDeModule/
/app/design/frontend/monRepertoiredeTemplates/monTemplate //(pour la partie frontend)
/app/design/adminhtml/monRepertoiredeTemplates/monTemplate //(pour la partie backend)
Dans le dossier app/ vous retrouverez 3 dossiers (codePool) qui contiendront :
code : avec tous le code de l'aplication
. community : les plugins de la communauté (téléchargés sur magentoconnect par exemple).
. core : les modules par défaut de magento (A NE SURTOUT PAS MODIFIER)
. local : les modules que vous avez développés vous même
design : avec les vues de l'application
. adminhtml : les vues de l'admin
. frontend : les vues front
Block : la ou vous aller mettre la partie « controller » de votre block
controllers : les controllers de votre module
Model : les models de votre module
Helper : les helpers de votre module
etc : la configuration de votre module
sql : les requettes sql a executé pour créer votre module lors de l’instalation
Petit rappel sur les blocks
Dans Magento, un Block est un morceau de votre site qui marche « tout seul », vous pouvez l’insérer un peu n’importe où. Selon la page de votre site, vous pourrez lui assignez des templates différents en fonction de l'affichage que vous voulez lui donner.
- Créer le dossier dans
/app/code/local/NameSpace/NameModule/ - Activez le module dans magento : Ajoutez un fichier NameSpace_NameModule.xml dans
/app/etc/module/Et insérez dedans le code suivant
<config>
<modules>
<NameSpace_NameModule>
<active>true</active>
<codePool>local</codePool>
</NameSpace_Module>
</modules>
</config>Magento trouvera donc les fichiers de ce module dans le dossier /app/code/local/NameSpace/NameModule/
- Créez le dossier
/app/code/local/NameSpace/NameModule/controllers/ - A l’intérieur créer un fichier IndexController.php qui contiendra :
class NameSpace_NameModule_IndexController extends Mage_Core_Controller_Front_Action
{
public function indexAction()
{
echo 'test index' ;
}
public function mamethodeAction()
{
echo 'test mamethode';
}
}- Config.xml, le fichier pour configurer votre module :
il faut que dans le fichier config.xml de votre module, vous déclariez aussi votre controller . Mangento va ainsi trouver votre fichier NameSpace_NameModule.xml, il va aller dans votre dossier/app/code/local/NameSpace/NameModule/etc/et va lire le fichier config.xml pour savoir ou aller chercher votre controlleur et comment fonctionne votre module.
<config>
<modules>
<NameSpace_NameModule>
<version>1.0.0</version>
</NameSpace_NameModule>
</modules>
<frontend>
<routers>
<routeurfrontend>
<use>standard</use>
<args>
<module>NameSpace_NameModule</module>
<frontName>Rewriting</frontName>
</args>
</routeurfrontend>
</routers>
</frontend>
</config>Modifier le controller avec loadLayout() et renderLayout()
class NameSpace_NameMdule_IndexController extends Mage_Core_Controller_Front_Action
{
public function indexAction()
{
$this->loadLayout(); // Va chercher les elements à afficher
$this->renderLayout(); // Affiche les elements
}
public function mamethodeAction()
{
echo ‘test mamethode’;
}
}Avant de pouvoir utiliser le Layout on doit le déclarer. Pour cela allons dans notre fichier config.xml rajoutez dans et apres :
<layout>
<updates>
<nameSpace_moduleName>
<file>nameSpace_nameModule.xml</file>
</nameSpace_moduleName>
</updates>
</layout>Maintenant, déclarons le dossier ou vont se trouver les Blocks : Dans et âpres rajoutez
<global>
<blocks>
<nameSpace_moduleName>
<class>NameSpace_NameModule_Block</class>
</nameSpace_moduleName>
</blocks>
</global>Dans vous déclarez vos Blocks, c’est aussi ici que vous déclarerez par la suite vos Model et vos Helpers.
Le layout : nous avons déclaré dans le config.xml de notre module un layout nameSpace_nameModule.xml dans le repertoire layout de votre théme Magento /app/design/frontend/NameSpace/theme/layout/
Nous allons donc créer un Layout nameSpace_nameModule.xml dans le répertoire
<layout version="0.1.0">
<default>
<reference name="content">
</reference>
</default>
<routeurfrontend_index_index>
<reference name="content">
<block type="nameSpace_nameModule/monblock" name="monbloc" template="nameSpace_nameModule/afficher.phtml" />
</reference>
</routeurfrontend_index_index>
</layout>Maintenant, il faut créer le block « monblock», allez donc dans le dossier que vous avez défini dans le config.xml pour stocker vos blocks app/code/local/NameSpace/NameModule/Block et créer le fichier Monblock.php à l'intérieur.
class NameSpace_NameModule_Block_Monblock extends Mage_Core_Block_Template
{
public function methodblock()
{
return ‘informations de mon block !!’ ;
}
}###n Etape 4 : Créer le template
Allez maintenant dans le répertoire \app\design\frontend\pfay\theme\template\ Et créer un répertoire "nameSapce_nameModule" avec à l’intérieur un fichier afficher.phtml.
echo $this->methodblock();
déclarer le model dans le fichier config.xml dans :
<models>
<pfay_films>
<class>Pfay_Films_Model</class>
<resourceModel>pfay_films_resource</resourceModel>
</pfay_films>
<pfay_films_resource>
<class>Pfay_Films_Model_Resource</class>
<entities>
<film>
<table>pfay_films</table>
</film>
</entities>
</pfay_films_resource>
</models>
<resources>
<!-- connection pour ecrire -->
<pfay_films_write>
<connection>
<use>core_write</use>
</connection>
</pfay_films_write>
<!-- connection pour lire-->
<pfay_films_read>
<connection>
<use>core_read</use>
</connection>
</pfay_films_read>
</resources>Une fois votre Model déclaré, vous pouvez maintenant créer les fichiers.
Créez donc les 3 dossiers suivant :
- app/code/local/Pfay/Films/Model/
- app/code/local/Pfay/Films/Model/Mysql4/
- app/code/local/Pfay/Films/Model/Mysql4/Films/ Ensuite, dans app/code/local/Pfay/Films/Model/ créez un fichier Film.php qui contiendra le code suivant :
class Pfay_Films_Model_Film extends Mage_Core_Model_Abstract
{
public function _construct()
{
parent::_construct();
$this->_init('pfay_films/film');
}
}Ceci est votre model Film, vous lui indiquez que c’est une entitée film de votre module pfay_films. Allez ensuite dans le dossier app/code/local/Pfay/Films/Model/Resource/ et créez un fichier Film.php qui contiendra :
class Pfay_Films_Model_Resource_Film extends Mage_Core_Model_Resource_Db_Abstract
{
public function _construct()
{
$this->_init('pfay_films/film', 'id_pfay_films');
}
}C’est ici que vous indiquez à Magento que votre model pfay_films/film va utiliser comme clef primaire le champ id_pfay_films.
Allez ensuite dans le dossier app/code/local/Pfay/Films/Model/Resource/Film/ et créez un fichier Collection.php qui contiendra :
class Pfay_Films_Model_Resource_Film_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract
{
public function _construct()
{
parent::_construct();
$this->_init('pfay_films/film');
}
}Ce fichier sert à définir la collection pour votre model pfay_films/film
Une fois ces fichiers créés, vous pouvez utiliser votre Model pour interagir avec vos tables très facilement.
class Pfay_Films_Block_Monblock extends Mage_Core_Block_Template
{
public function methodblock()
{
//on initialize la variable
$retour='';
/* on fait une requette : aller chercher Tous les elements
de la table pfay_films (grace à notre model pfay_films/pfay_film
et les trier par id_pfay_films */
$collection = Mage::getModel('pfay_films/pfay_film')
->getCollection()
->setOrder('id_pfay_films','asc');
/* ensuite on parcours le resultat de la requette et
avec la fonction getData(), on stocke dans la variable retour
(pour l’affichage dans le template) les données voulues */
foreach($collection as $data)
{
$retour .= $data->getData('name.').'<br />';
}
//je renvoi un message de succes à l'utilisateur (juste pour que vous sachiez utiliser la fonction)
Mage::getSingleton('adminhtml/session')->addSuccess('Cool Ca marche !!');
return $retour;
}
} ->getIdFieldName() # return le nom de la colonne servant d'id
->getCollection() # retourne la collection
->save()
->load($key)
->getData()
->delete()
->addData(array $arr)
->setData($key, $value)
->unsetData($key)
->getData($key)
->toArray()->toString()->toXml()->toJson() ->getAllIds() # prendre tous les ids de la collection
->getItemById()
->setOrder('fieldName','asc'); # ajouter un order
->addFilter('fieldName', 'value'); # ajouter un filtre
->save() # sauver les items
->getItems() # sélectionner les items dans un arrat d'object item
->getIdFieldName() # return le nom de la colonne servant d'id
->getSize() # return la taille de la collection
->distinct($flag) # set le select sur distinct
->load()->resetData() # collection easy loaded, avec load je charge les items dans data
->getData() # load et sort les data en array
->getFirstItem()->getLastItem() # selectionner premiere et dernire item
->getColumnValues($columnName) # selectionne toutes les valeurs d'un field
->getItemsByColumnValue($columnName,$value) # selectionne les items qui ont une certaine valeur dans un field
->addItem($item)
->removeItemByKey($key)
->clear()
->walk($callback,$args)
->each($obj_method, $args)
->getNewEmptyItem()
->toArray()->toXml()
// Jointures -
->getSelect()
->join([alias => table], sql_on, [fieldToAdd])
->joinLeft()
->addAttributeToSelect('*')
->addFieldToFilter('field','value)
->addFieldToFilter('status', array('eq' => 1)) // egal à
->addFieldToFilter('visibility', array('neq' => 1)) // Différent de (neq)
->addFieldToFilter('price', array('lt' => 99.99)) // plus petit que (lt)
->addFieldToFilter('price', array('gt' => 3.99)); // Plus grand que (gt)
->addFieldToFilter('price', array('gteq' => 3.99)); // plus grand ou égale à (gteq)
->addFieldToFilter('price', array('lteq' => 99.99)); // plus petit ou égale à (lteq)
->addFieldToFilter('description', array('like' => '%toto%')); // contient (like)
->addFieldToFilter('description', array('nlike' => '%xxx%')); // ne contient pas
->addFieldToFilter('id', array('in' => array(10,30,102))); // dans le tableau (in)
->addFieldToFilter('id', array('nin' => array(12,60,102))); // N'est pas dans la liste
->addFieldToFilter('description', 'null'); // est NULL
->addFieldToFilter('description', 'notnull'); // n'est pas NULL