2012-03-28 2 views
1

Im travaillant sur un module d'administration personnalisé pour magento, et en essayant d'apprendre l'approche de magento en même temps =). Im actuellement sur la version CE 1.6.Comment utiliser les objets de collection de Magento?

J'ai suivi quelques tutoriels et articles et j'ai réussi à installer une table db personnalisée et je pense que j'ai réussi à faire fonctionner la classe make collection. (Je devrais dire Im nouveau à Zend Framework/Magento et un débutant programmeur qualifié). Au moins le code suivant me obtenir est le bon résultat:

$department_collection = Mage::getModel('custom/systemconfig')->getCollection() 
          ->addFilter('name','departments'); 

Quand je var_dump cela avec $department_collection->getData() je reçois un tableau avec les lignes filtrées de mon DB.

Maintenant, lorsque je tente de le faire:

foreach ($department_collection as $department) { 
     $department->delete(); 
    } 

Je reçois une exception Magento:

-Attention: include (Mage \ Upperfield \ Model \ Systemconfig.php) [function.include ]: Impossible d'ouvrir le flux: Aucun fichier ou répertoire dans D: \ wamp \ www \ magento \ lib \ Varien \ Autoload.php sur la ligne 93

Le problème est que je suppose que j'ai mal configuré ma structure de répertoire, mais Je ne comprends pas ce que c'est. Et la trace n'est pas beaucoup d'aide car elle est concaténée et ne montre que des informations non pertinentes.

Ma structure de répertoire ressemble à ceci:

+app 
    +code 
    +local 
     +Namespace 
     +Module 
      +Model 
      +Mysql4 
       +Systemconfig 
        Collection.php 
       Systemconfig.php 
      Systemconfig.php 

J'ai chargé mes modèles avec:

//file: ../Mysql4/Systemconfig.php 
class Namespace_Module_Model_Mysql4_Systemconfig extends Mage_Core_Model_Mysql4_Abstract{ 
    protected function _construct() 
    { 
     $this->_init('module/systemconfig', 'systemconfig_id'); 
    } 
} 



// file: ../Mysql4/Systemconfig/Collection.php 
class Namespace_Module_Model_Mysql4_Systemconfig_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract { 
    protected function _construct() 
    { 
     $this->_init('namespace/systemconfig'); 
    } 
} 

Mon config.xml ressemble actuellement à ceci (extrait):

<models> 
    <module> 
     <class>Namespace_Module_Model</class> 
    <resourceModel>module_mysql4</resourceModel> 
</module> 

<module_mysql4> 
    <class>Namespace_Module_Model_Mysql4</class> 
    <entities> 
     <systemconfig> 
      <table>module_systemconfig</table> 
     </systemconfig> 
    </entities> 
</module_mysql4> 

Ma conjecture est soit: Je configure la classe de collection avec une structure incorrecte, ou Je ne comprends pas comment utiliser l'objet de collection.

Tout wiz là-bas qui pourrait m'expliquer ce qui se passe ici? Gratefull pour toute aide.

Meilleures salutations Adde

+0

Désolé, lors de la lecture à travers la question après le post que je viens de réaliser que je mis en place init avec espace de noms au lieu d'alias de module dans le modèle de collection. Problème résolu. J'adore comment passer une nuit entière à regarder le même code et ne pas réaliser une erreur évidente comme ça .. –

+0

Avez-vous trouvé ce tutoriel: http://alanstorm.com/magento_models_orm – Max

+0

Oui, merci beaucoup. J'ai vérifié cela et les articles d'Alan Storms sur magentocommerce.com dehors. C'est ce qui m'a permis d'arriver à ce point. Comme je l'ai dit dans le commentaire précédent, c'était une sorte de faute de frappe, j'ai essayé de lancer le modèle Collection avec ... init ('namespace/model') au lieu de ... init (module/model) Je me suis rendu compte après le post mais je ne peux pas répondre à ma propre question dans les 8 heures. Merci pour les commentaires et félicitations à Alan. –

Répondre

2

L'erreur que vous avez été des définitions xml incorrectes ou la dénomination de classe/structure de fichiers - qui doivent être identiques. Lorsque l'autochargeur a lu votre config.xml et a regardé où vous l'avez dit dans le fichier config.xml, il n'a pas trouvé le ou les fichiers qu'il cherchait.

Un peu d'informations sur les collections et leurs modèles de parents, si elle aide:

Si vous travaillez directement avec une collection, vous devez utiliser:

$_collection = Mage::getResourceModel('namespace/model_collection'); 

Si vous travaillez avec un modèle prend les données d'une collection et modifie les données (par exemple, résume les choses, ajoute des données supplémentaires, supprime des choses, etc.) Vous devez appeler le modèle comme ceci:

$_collection = Mage::getModel('namespace/model')->getCollection(); 

De toute façon, dans votre config.xml, vous devez définir que vous utilisez un modèle de ressources et les tables (si vous avez des tables personnalisées) il devrait travailler avec. Vous ne devriez jamais avoir à écrire une nouvelle collection pour interagir avec les tables Magento par défaut, car il existe déjà des collections que vous pouvez appeler OU étendre (non recommandé, vous devriez utiliser des observateurs).

Voici un exemple d'une définition de collection appropriée dans config.xml:

<models> 
    <modulename> 
     <resourceModel>modulename_mysql4</resourceModel> 
    </modulename> 
    <modulename_mysql4> 
     <class>Namespace_ModuleName_Model_Mysql4</class> 
     <entities> 
      <modulename> 
       <table>modulename_custom</table> 
      </modulename> 
     </entities> 
    </modulename_mysql4> 
</models> 
<resources> 
    <modulename_setup> 
     <setup> 
      <module>Namespace_ModuleName</module> 
     </setup> 
     <connection> 
      <use>core_setup</use> 
     </connection> 
    </modulename_setup> 
    <modulename_write> 
     <connection> 
      <use>core_write</use> 
     </connection> 
    </modulename_write> 
    <modulename_read> 
     <connection> 
      <use>core_read</use> 
     </connection> 
    </modulename_read> 
</resources> 

Dans ce fichier, les définitions inline et les nœuds que je l'ai écrit doit être écrit comme ça, vous ne peut pas avoir un retour, il doit être la même ligne. Ceci est un petit inconvénient à la façon dont fonctionne l'autoloader Magento.

Espérons que cela aide!

+0

Merci pour la bonne réponse! Vous économisez plusieurs heures;) –

Questions connexes