Question

Je tente d'injecter fonctionnalité dans l'événement catalog_model_product_duplicate. Une partie de ce module sera de faire en sorte que l'état du stock du produit dupliquée est également reproduit; actuellement il n'est pas.

Je vois que CatalogInventory observe cet événement et met en place des informations de stock standard. Puis-je être assuré que les événements principaux sont résolus avant mes locaux? Y at-il pour des opérations ici que je peux compter sur?

Était-ce utile?

La solution

L'ordre dans lequel les événements sont distribués dans dépend de l'ordre dans lequel les modules sont chargés. Puisque vous besoin d'être sûr que les observateurs du module CatalogInventory feu avant le vôtre, ce que vous devez faire est de configurer simplement votre module dépend du module Mage_CatalogInventory. Vous pouvez le faire en ajoutant un noeud dépend du code dans votre fichier app/etc/modules/My_Module.xml:

<config>
    <modules>
        <My_Module>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_CatalogInventory />
            </depends>
        </My_Module>
    </modules>
</config>

Le nœud depends dans le fichier XML ci-dessus est l'élément crucial de la configuration ici, car il force le module de base Magento à la charge avant le vôtre.

Autres conseils

L'ordre dans lequel les événements sont distribués ne peut pas être facilement garantie. Ils sont dépendants de l'ordre dans lequel les modules sont chargés. En règle générale, tous les observateurs d'événements de base seront appelés avant observateurs de la piscine communautaire et de code local.

Il existe une méthode pour les observateurs de force magento au feu après un personnalisé par « truquer » une dépendance d'un module de base à un local ou communautaire. Jetez un coup d'oeil à la réponse de Lee ici: Faire un observateur personnalisé feu avant un observateur Magento existant .

/app/etc/modules/Groupname_Page.xml

<config>
    <modules>
        <Groupname_Page>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <!-- Your dependencies go here -->
            </depends>
        </Groupname_Page>
        <Enterprise_PageCache>
            <depends>
                <Groupname_Page />
            </depends>
        </Enterprise_PageCache>
    </modules>
</config>

Personnellement, je ne aime pas cette approche que je ne sais pas quelles sont les conséquences que la dépendance forçant auraient.

Pour votre cas d'utilisation, il semble que vous devriez faire une sorte de détection pour les données / état de savoir si elle a été tiré ou non. Vérification d'un données / état sur un modèle serait préférable que d'essayer de forcer un ordre d'événement.

Une réponse générale

Les observateurs sont exécutées par Région , puis par ordre de chargement le module

Cela signifie que, tous les observateurs inscrits à <global> sont exécutées avant tous les observateurs inscrits à <frontend> ou <adminhtml>.

Dans une zone, les observateurs sont exécutés dans l'ordre où ils apparaissent dans l'arborescence XML de configuration fusionnée, qui techniquement des moyens dans l'ordre des modules ont été chargés.

ordre de chargement du module est déterminée comme suit:

  1. Un graphe de dépendance est construit à partir des définitions de <depends> dans app/etc/modules/*.xml. Si X dépend de Y, Y est chargé avant X.

  2. Après la commande par la dépendance, des modules de base ont la priorité sur la communauté et des modules locaux

  3. Tout le reste est chargé par ordre alphabétique. Notez que le nom du fichier dans app/etc/modules est utilisé à titre de comparaison, et non le nom du module réel.

Vous avez deux options pour module d'influence ordre de chargement:

  1. dépendent d'un autre module d'avoir vos observateurs exécuté après avoir (ou faire l'autre module dépend de vous de les avoir exécutés avant)
  2. Renommer le fichier de définition du module. Vous n'avez pas besoin de renommer le module lui-même, car le nom n'a pas d'importance pour toute autre chose que l'ordre de chargement.

( "3. Ajouter votre module à la piscine de code de base" ne compte pas)

Voir aussi:

Juste une suggestion, à la fois observer catalog_model_product_duplicate et catalog_model_product_save_after avec observateur singleton. En catalog_model_product_duplicate les données d'inventaire de jeu en tant que données d'observation, et l'utilisation de catalog_model_product_save_after que les données à l'inventaire Populate pour le produit dupliqués.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top