Mehrere Store -Ansichten teilen dieselbe Bestellung inkrement_id zahlreicher Bereich
-
16-10-2019 - |
Frage
Kann Magento so konfiguriert werden, dass mehrere Store -Ansichten derselben Website können teile das gleiche bestellen increment_id
Zahlenbereich? Und wenn ja, wie?
Zum Beispiel mit einem multistore -Setup wie diesem 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
Jetzt eine neue Ladenansicht delta
hinzugefügt:
store_id code website_id group_id
4 delta 1 1
Annahme alpha
Die letzte Auftrags -Inkrement -ID der letzten Bestellung beträgt derzeit 1000123, wie man erreicht:
next sell order number
alpha 1000124
delta 1000125
delta 1000126
alpha 1000127
Die gleiche Frage gilt für mehrere Store -Ansichten, die dieselbe Rechnung teilen increment_id
Zahlenbereich und/oder das gleiche Kreditmemo teilen increment_id
Zahlenbereich.
Unterstützt Magento diese Out-of-the-Box?
Lösung
Ich würde mir vorstellen, dass dies ziemlich schwierig wäre. Inkrement -IDs werden in der gespeichert eav_entity_store
Tabelle und nicht überraschend, dass in jedem Geschäft ein eigener Eintrag verfügt, der aktualisiert wird, wenn eine Bestellung (und das Zitat, Rechnung usw.) erstellt wird. Damit alle Geschäfte denselben Inkrementierer verwenden müssen, müssen Sie diese Logik irgendwie neu schreiben, damit die gleiche Zeile im DB verwendet wurde. Ganz, welche Auswirkungen dies auf andere Bereiche der Website haben kann, ist etwas anderes, das berücksichtigt werden müsste.
Andere Tipps
Sie können Bestellungen, Versender, Rechnungen und Kredit -Memos -Inkrementmodell überschreiben, indem Sie die Klasse "EAV/Entity_increment_numeric" umschreiben, die eine benutzerdefinierte Logik in einem von Ihnen bereitgestellten Modell bietet.
Schauen Sie sich die Ancestor -Klassen (mage_eav_model_entity_increment_numeric und mage_eav_model_entity_increment_abstract) an, um zu verstehen, wie Sie Ihre eigene Logik bereitstellen.
Sie können die Logik zwischen verschiedenen Entitäten differenzieren, indem Sie den Parameter $ entityTypecode der Funktion getNextId () überprüft, die Sie überschreiben.
Ein weiterer (invasiverer) Weg ist die Angabe eines anderen Inkrementmodells für jeden Entitätstyp durch Überschreiben (über das Installieren von Skript) den Wert der Spalte "Increment_Model" der Tabelle "EAV_ENTITY_TYPE". Persönlich bevorzuge ich die oben erwähnte "Umschreiben" -Lösung.
Achtung: Inkrement -IDs haben eine Einzigartigkeit in den neuesten Magento -Versionen, sodass Sie dieselbe Inkrement -ID für zwei verschiedene Entitäten desselben Typs nicht speichern können. Mit anderen Worten, Sie können nicht zwei verschiedene Rechnungen mit derselben Inkrement -ID haben.
Ich hoffe es hilft.
Während ich tiefer graben konnte, wurde mir klar eav_entity_type.increment_per_store
kann hilfreich sein.
Es ist. Aber nur für den Fall, wenn Sie wollen Alle Store -Ansichten (Global, egal auf welcher Website sie definiert sind) Ihrer Magento -Installation, um dieselbe Bestellung zu teilen increment_id
Zahlenbereich.
Dies löst mein spezifisches Problem nicht, aber vielleicht ist es für einige andere hilfreich, also gehen wir hier:
Um die globale Freigabe Ihrer Bestellnummern zu aktivieren, setzen Sie eav_entity_type.increment_per_store
der Ordenentität zu 0
,
Dies führt zu Mage_Eav_Model_Entity_Type::fetchNewIncrementId()
Verwendung store_id = 0
Beim Laden des eav_entity_store
Aufzeichnung der Orderentität, unabhängig davon, zu welcher Speicheransicht sie wirklich gehört.
Wenn keine solche Aufzeichnung vorliegt, erstellt Magento einen mithilfe eines mit store_id
und increment_prefix
von 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;
}
Dies sollte für jeden Entitätstyp mit dem funktionieren eav/entity_increment_numeric
Modell wie order
, invoice
, shipment
und creditmemo
.
Beachten Sie jedoch, dass ich keine offizielle Dokumentation von finden konnte increment_per_store
noch. Und dass es im Magento -Backend keine Option gibt, in dem Sie dies konfigurieren können.
Dies kann bedeuten oder auch nicht, dass es nicht als offiziell verwendet wird.
Benutzung auf eigene Gefahr. Wenn Ihre Änderungen Chaos anrichten, beschuldigen Sie mich nicht. Du bist gewarnt ^^
Es wird nicht außerhalb des Boxs unterstützt. Ich wollte dies auch einmal tun, um ein zweites Storeview für einen A/B -Test zu haben.
Ich habe versucht, diese 2 Zahlen auf einfache Weise zu entsprechen, wenn checkout_submit_all_after
ist gefeuert, fühlte sich aber sehr unwohl damit, also habe ich es fallen lassen. Ich denke, mit mehr Storeviews und viel Verkehr kann dies zu einem echten Chaos führen, sodass Sie die Magentos -Logik tiefer ausgraben müssen.
Lösung:
Eine unterschiedliche Bestellung/Rechnung/Kreditmemo usw. ist für verschiedene Länder sehr schön, was am häufigsten auf einer Geschäftsgruppenebene bedeutet.
Es ist jedoch eine schlechte Sache, unterschiedliche Zahlenbereiche in der Store -View -Ebene zu haben, wenn Sie Store -Ansichten für verschiedene Sprachen verwenden, was möglicherweise in 90% aller Fälle erfolgt.
Zum Glück ist es nicht so schwierig, wie in diesem Thread vorgeschlagen:
Was wir tun werden, ist, wir holen die Standardspeicher -Ansichts -ID anstatt die Store -Ansicht -ID zu verwenden, die die Methode aufgerufen wird. Wir tun dies, indem wir die Store -Gruppe für die aktuelle Store -Ansicht beheben und ihre Standard -Store -Ansicht -ID abrufen. Anschließend verwendet jede Speicheransicht einer bestimmten Speichergruppe das gleiche Nummernbereichsformat (das aus der Standard -Store -Ansicht).
Erstellen Sie diese Klasse:
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;
}
}
Fügen Sie dieses Umschreiben in config.xml Ihres Moduls hinzu:
<global>
<models>
<eav>
<rewrite>
<entity_type>Gigaset_Core_Model_Entity_Type</entity_type>
</rewrite>
</eav>
...
Wenn Sie einen schöneren Weg haben, ohne das Wissen neu schreiben zu müssen. Habe Spaß. Hacken Sie den Kern nicht.