Domanda

Can Magento essere configurato in un certo senso, che più visualizzazioni negozio dello stesso sito possono condividere lo stesso ordine increment_id serie di numeri? E se sì, come?

Per esempio, con una messa a punto multistore come questo in 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

Ora si aggiunge una nuova visualizzazione negozio delta:

store_id        code    website_id    group_id
       4       delta             1           1

Supponendo di alpha ultimo ordine incremento id attualmente è 1.000.123, come ottenere:

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

Stessa domanda va per più viste negozio che condividono la gamma di numero di stessa fattura increment_id, e / o condividere lo stesso di accredito intervallo numerico increment_id.

non Magento supporta questo out-of-the-box?

È stato utile?

Soluzione

Mi piacerebbe immaginare che questo sarebbe molto difficile. Incremento di ID sono memorizzati nella tabella eav_entity_store e non sorprende ogni negozio ha il proprio ingresso che viene aggiornato quando viene creato un ordine (e citazione, fattura, ecc). Per raggiungere tutti i negozi di utilizzare la stessa incrementatore si avrebbe bisogno di riscrivere in qualche modo questa logica in modo che utilizza la stessa riga nel DB. Piuttosto quale impatto potrebbe avere su altre aree del sito è un'altra cosa che avrebbe bisogno di essere considerati.

Altri suggerimenti

È possibile ignorare gli ordini, spedizioni, fatture e note di credito modello di incremento riscrivendo la "EAV / entity_increment_numeric" class che fornisce la logica personalizzata in un modello del tuo.

Date un'occhiata alle classi antenato (Mage_Eav_Model_Entity_Increment_Numeric e Mage_Eav_Model_Entity_Increment_Abstract) al fine di capire come fornire la propria logica.

E 'possibile la logica differenziare tra entità diverse, controllando il parametro $ entityTypeCode della funzione getNextId () si ignorare.

Un altro modo (più invasiva) è quella di specificare un modello incremento diverso per ogni tipo di entità sovrascrivendo (tramite script di installazione) il valore della colonna "increment_model" della tabella "eav_entity_type". Personalmente preferisco il "riscrivere" la soluzione di cui sopra.

Attenzione: ids incremento hanno un vincolo di unicità nelle ultime versioni di Magento quindi non è possibile memorizzare lo stesso incremento di id per due diverse entità dello stesso tipo. In altre parole non è possibile avere due fatture diverse con lo stesso incremento id.

La speranza aiuta.

Mentre scavare più in profondità, mi resi conto che eav_entity_type.increment_per_store può essere utile.

E '. Ma solo per il caso, quando si desidera tutte le viste negozio (a livello globale, non importa quale sito che stanno definiti) della vostra installazione di Magento di condividere lo stesso numero d'ordine gamma increment_id.

Questo non risolve il problema specifico, ma forse è utile ad alcuni altri, così qui andiamo:

Per attivare la condivisione globale dei vostri numeri d'ordine, insieme eav_entity_type.increment_per_store del soggetto al fine di 0,

Questo porta a Mage_Eav_Model_Entity_Type::fetchNewIncrementId() utilizzando store_id = 0 quando si carica il record eav_entity_store dell'entità dell'ordine, non importa quale vista negozio davvero appartiene.

Se non esiste alcun tale record, Magento crea uno, utilizzando store_id e increment_prefix di 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;
}

Questo dovrebbe funzionare per qualsiasi tipo di entità utilizzando il modello eav/entity_increment_numeric, come order, invoice, shipment e creditmemo.

Essere consapevoli però, che non riuscivo a trovare alcuna documentazione ufficiale della increment_per_store ancora. E che non c'è alcuna opzione nel Magento backend che ti permette di configurare questo.

Questo può o non può dire, che non è pensato per essere utilizzato ufficialmente.

Utilizzare a proprio rischio e pericolo. Se le modifiche devastare, non prendetevela con me. Siete stati avvertiti ^^

Non è supportato out-of-the-box. Ho anche voluto fare questo una volta di avere un secondo storeview una quota A / B test stesso increment_id dal negozio originale.

Ho cercato di abbinare questi 2 numeri il modo semplice quando checkout_submit_all_after viene licenziato, ma sentivo molto a disagio con esso, così ho lasciato cadere. Credo che con più storeviews e un sacco di traffico questo può portare a un vero e proprio caos quindi bisogna scavare più a fondo nella logica Magentos.

Soluzione:

Avere un diverso ordine / fattura / di accredito ecc ... intervallo di numeri è molto bello, per i diversi paesi, che il più delle volte i mezzi a livello gruppo di negozi.

Ma avere diversi intervalli numerici sul livello di visualizzazione negozio è una brutta cosa, se si utilizza una vista negozio per lingue diverse, che potrebbero essere fatte nel 90% dei casi.

Per fortuna non è così difficile come proposto in questa discussione:

Quello che ci accingiamo a fare è che prendere la archivio predefinito vista id invece di utilizzare l'id vista negozio il metodo viene chiamato con . Stiamo facendo questo per risolvere il gruppo di negozi per la vista attuale del serbatoio a prendere la sua vista negozio di default id. Poi ogni vista vendite di un gruppo specifico negozio utilizza lo stesso numero di formato gamma (quello dalla visualizzazione archivio predefinito).

Creare questa 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;
    }

}

Aggiungi questa riscrittura al config.xml del modulo:

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

Se si dispone di un modo migliore, senza dover riscrivere diffondere la conoscenza. Divertiti. Non incidere il nucleo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top