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 alphaDie 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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top