Question

peut Magento être configuré de manière, que plusieurs vues des magasins du même site peuvent partager la même pour plage de numéros de increment_id? Et si oui, comment?

Par exemple, avec une configuration de MultiStore comme celui-ci dans core_store:

store_id        code    website_id    group_id
       0       admin             0           0
       1       alpha             1           1
       2       bravo             2           2
       3     charlie             2           2

Maintenant, une nouvelle vue magasin delta est ajouté:

store_id        code    website_id    group_id
       4       delta             1           1

dernier id incrément de l'ordre de alpha En supposant actuellement 1.000.123, comment atteindre:

next sell    order number
    alpha         1000124
    delta         1000125
    delta         1000126
    alpha         1000127

La même question vaut pour plusieurs vues de magasin partageant la même facture plage de numéros de increment_id et / ou en partageant la même creditmemo plage de numéros de increment_id.

Est-ce que Magento supporte cette out-of-the-box?

Était-ce utile?

La solution

J'imagine que ce serait assez difficile. id de Incrémenter sont stockées dans la table de eav_entity_store et sans surprise chaque magasin a sa propre entrée qui est mis à jour lorsqu'une commande (et devis, facture, etc.) est créé. Pour obtenir tous les magasins d'utiliser le même incrémenteur vous auriez besoin de réécrire cette logique en quelque sorte il a utilisé la même ligne dans la DB. Tout à fait l'impact que cela peut avoir sur d'autres parties du site est quelque chose d'autre qui aurait besoin d'être pris en considération.

Autres conseils

Vous pouvez remplacer les commandes, les factures, et navigations notes de crédit modèle incrément en réécrivant la classe « EAV / entity_increment_numeric » fournissant une logique personnalisée dans un modèle de la vôtre.

Jetez un oeil à la classe ancêtre (Mage_Eav_Model_Entity_Increment_Numeric et Mage_Eav_Model_Entity_Increment_Abstract) afin de comprendre comment fournir votre propre logique.

Vous pouvez la logique Différencier entre les différentes entités en vérifiant le paramètre entityTypeCode de $ de la fonction getNextId () vous remplacer.

Une autre (plus invasive) façon est celle de la spécification d'un modèle d'incrément différent pour chaque type d'entité en réécrivant (via script d'installation) la valeur de la colonne « increment_model » de la table « eav_entity_type ». Personnellement, je préfère la solution « Transforme » mentionné ci-dessus.

Attention: ids incrément ont une contrainte d'unicité dans les dernières versions Magento vous ne pouvez pas stocker le même identifiant l'incrément pour deux entités différentes du même type. En d'autres termes, vous ne pouvez pas avoir deux factures différentes avec le même identifiant incrément.

it helps.

En creusant plus profond, j'ai réalisé que eav_entity_type.increment_per_store peut être utile.

Il est. Mais seulement pour le cas, quand vous voulez toutes les vues de magasin (globalement, quel que soit le site qu'ils sont définis dans) de votre installation Magento de partager la même plage de numéros ordre increment_id.

Cela ne résout pas mon problème spécifique, mais peut-être il est utile de quelques autres, donc on y va:

Pour activer le partage global de vos numéros d'ordre, ensemble eav_entity_type.increment_per_store de l'entité pour 0,

Cela conduit à l'aide Mage_Eav_Model_Entity_Type::fetchNewIncrementId() store_id = 0 lors du chargement de l'enregistrement eav_entity_store de l'entité de commande, quelle que soit la vue magasin il appartient vraiment.

Si un tel enregistrement existe, Magento crée un, en utilisant store_id et increment_prefix de 0.

public function fetchNewIncrementId($storeId = null)
{
    if (!$this->getIncrementModel()) {
        return false;
    }

    if (!$this->getIncrementPerStore() || ($storeId === null)) {
        /**
         * store_id null we can have for entity from removed store
         */
        $storeId = 0;
    }

    // Start transaction to run SELECT ... FOR UPDATE
    $this->_getResource()->beginTransaction();

    $entityStoreConfig = Mage::getModel('eav/entity_store')
        ->loadByEntityStore($this->getId(), $storeId);

    if (!$entityStoreConfig->getId()) {
        $entityStoreConfig
            ->setEntityTypeId($this->getId())
            ->setStoreId($storeId)
            ->setIncrementPrefix($storeId)
            ->save();
    }

    $incrementInstance = Mage::getModel($this->getIncrementModel())
        ->setPrefix($entityStoreConfig->getIncrementPrefix())
        ->setPadLength($this->getIncrementPadLength())
        ->setPadChar($this->getIncrementPadChar())
        ->setLastId($entityStoreConfig->getIncrementLastId())
        ->setEntityTypeId($entityStoreConfig->getEntityTypeId())
        ->setStoreId($entityStoreConfig->getStoreId());

    /**
     * do read lock on eav/entity_store to solve potential timing issues
     * (most probably already done by beginTransaction of entity save)
     */
    $incrementId = $incrementInstance->getNextId();
    $entityStoreConfig->setIncrementLastId($incrementId);
    $entityStoreConfig->save();

    // Commit increment_last_id changes
    $this->_getResource()->commit();

    return $incrementId;
}

Cela devrait fonctionner pour tout type d'entité à l'aide du modèle eav/entity_increment_numeric, comme order, invoice, shipment et creditmemo.

Sachez cependant, que je ne pouvais trouver aucune documentation officielle pour le moment de increment_per_store. Et qu'il n'y a pas d'option dans le backend Magento qui vous permet de configurer cela.

Cela peut ou veut pas dire que ce n'est pas pensé à utiliser officiellement.

Utilisez à vos propres risques. Si vos modifications font des ravages, ne me blâmez pas. Vous avez été averti ^^

Il est pas pris en charge hors de la boîte. Je voulais aussi faire une fois pour avoir une seconde Storeview pour une action de test A / B de la même increment_id du magasin d'origine.

J'ai essayé de faire correspondre ces 2 numéros de la façon simple quand checkout_submit_all_after est tiré, mais me sentais très mal à l'aise avec lui, donc je l'ai abandonné. Je suppose avec plus storeviews et beaucoup de trafic cela peut entraîner un véritable gâchis, donc vous devez creuser plus profondément dans la logique Magentos.

Solution:

Avoir un ordre différent / facture / creditmemo etc ... plage de numéros est assez agréable, pour les différents pays, ce qui signifie le plus souvent à un niveau de groupe de magasins.

Mais ayant des plages de numéros au niveau de vue magasin est une mauvaise chose si vous utilisez des vues de magasin pour des langues différentes, ce qui pourrait être fait dans 90% des cas.

Heureusement, il est pas si difficile que proposé dans ce fil:

Ce que nous allons faire est nous récupérons la vue magasin ID par défaut au lieu d'utiliser la vue magasin id la méthode est appelée avec . Nous faisons cela en résolvant le groupe de magasins pour la vue magasin actuel et récupérons son id vue magasin par défaut. Ensuite, chaque vue magasin d'un groupe de magasin spécifique utilise le même numéro format de gamme (celui de la vue du magasin par défaut).

Créer cette classe:

class Funky_Module_Model_Entity_Type extends Mage_Eav_Model_Entity_Type
{
    /**
     * Retreive new incrementId
     *
     * @param int $storeId
     * @return string
     * @throws Exception
     */
    public function fetchNewIncrementId($storeId = null)
    {
        if (!$this->getIncrementModel()) {
            return false;
        }

        if (!$this->getIncrementPerStore() || ($storeId === null)) {
            /**
             * store_id null we can have for entity from removed store
             */
            $storeId = 0;
        }

        //FIX START:
        $groupId = Mage::getModel('core/store')->load($storeId)->getGroupId();
        $group =  Mage::getModel('core/store_group')->load($groupId);
        $storeId = $group->getDefaultStoreId();
        //FIX END:

        // Start transaction to run SELECT ... FOR UPDATE
        $this->_getResource()->beginTransaction();

        try {

            $entityStoreConfig = Mage::getModel('eav/entity_store')
                ->loadByEntityStore($this->getId(), $storeId);

            if (!$entityStoreConfig->getId()) {
                $entityStoreConfig
                    ->setEntityTypeId($this->getId())
                    ->setStoreId($storeId)
                    ->setIncrementPrefix($storeId)
                    ->save();
            }

            $incrementInstance = Mage::getModel($this->getIncrementModel())
                ->setPrefix($entityStoreConfig->getIncrementPrefix())
                ->setPadLength($this->getIncrementPadLength())
                ->setPadChar($this->getIncrementPadChar())
                ->setLastId($entityStoreConfig->getIncrementLastId())
                ->setEntityTypeId($entityStoreConfig->getEntityTypeId())
                ->setStoreId($entityStoreConfig->getStoreId());

            /**
             * do read lock on eav/entity_store to solve potential timing issues
             * (most probably already done by beginTransaction of entity save)
             */
            $incrementId = $incrementInstance->getNextId();
            $entityStoreConfig->setIncrementLastId($incrementId);
            $entityStoreConfig->save();

            // Commit increment_last_id changes
            $this->_getResource()->commit();
        } catch (Exception $e) {
            $this->_getResource()->rollBack();
            throw $e;
        }

        return $incrementId;
    }

}

Ajoutez cette réécriture à config.xml de votre module:

<global>
   <models>
            <eav>
                <rewrite>
                     <entity_type>Gigaset_Core_Model_Entity_Type</entity_type>
                </rewrite>
            </eav> 
    ...

Si vous avez une façon plus agréable, sans avoir à réécrire la diffusion des connaissances. S'amuser. Dont pirater le noyau.

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