Avere più viste negozio condividono lo stesso ordine gamma numero increment_id
-
16-10-2019 - |
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?
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.