Pregunta

Can Magento puede configurar de una manera, que las múltiples vistas tienda de la misma página web pueden compartir el mismo para increment_id rango de números? Y si es así, ¿cómo?

Por ejemplo, con una configuración de multistore como este en 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

Ahora se añade una nueva tienda vista delta:

store_id        code    website_id    group_id
       4       delta             1           1

última orden de incremento de Identificación del Suponiendo alpha actualmente es 1000123, cómo lograr:

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

La misma pregunta se aplica a varias vistas de tiendas que comparten el rango de números misma factura increment_id, y / o compartir el mismo rango de números Nota de crédito increment_id.

¿El Magento soporta esta fuera de la caja?

¿Fue útil?

Solución

Me imagino que esto sería bastante difícil. identificadores de incremento se almacena en la tabla eav_entity_store y como era de esperar cada tienda tiene su propia entrada que se actualiza cuando se crea una orden (y presupuesto, facturas, etc.). Para obtener todas las tiendas de utilizar el mismo incrementador que tendría que volver a escribir alguna manera esta lógica por lo que utiliza la misma fila en la base de datos. Muy a lo impacto que esto puede tener en otras áreas del sitio es otra cosa que habría que tener en cuenta.

Otros consejos

Puede anular pedidos, envíos, facturas y notas de crédito modelo de la subasta por la reescritura de la clase "EAV / entity_increment_numeric" proveer lógica en un modelo de la suya.

Tome un vistazo a las clases de los antepasados ??(Mage_Eav_Model_Entity_Increment_Numeric y Mage_Eav_Model_Entity_Increment_Abstract) con el fin de entender cómo proporcionar su propia lógica.

Puede la lógica Diferenciar entre diferentes entidades marcando el parámetro $ entityTypeCode de la función getNextId () va a anular.

Otra manera (más invasivo) es el de la especificación de un modelo de incremento diferente para cada tipo de entidad sobrescribiendo (a través de instalar script) el valor de la columna "increment_model" de la tabla "eav_entity_type". Personalmente prefiero el "reescribir" solución mencionada anteriormente.

Tener en cuenta: los identificadores de incremento tienen una restricción de unicidad en las últimas versiones de Magento lo que no puede almacenar el mismo ID de incremento para dos entidades diferentes del mismo tipo. En otras palabras, no se puede tener dos facturas diferentes con el mismo ID de la subasta.

Espero que ayuda.

Mientras que cavar más profundo, me di cuenta que eav_entity_type.increment_per_store puede ser útil.

Es. Pero sólo para el caso, cuando se desea todos los puntos de vista de tienda (en todo el mundo, sin importar el sitio web que están definidos en) de la instalación de Magento que comparten el mismo rango de números de orden increment_id.

Esto no resuelve mi problema específico, pero tal vez es útil para algunas otras personas, así que aquí vamos:

Para activar el intercambio mundial de sus números de orden, eav_entity_type.increment_per_store conjunto de la entidad con el fin de 0

Esto lleva a Mage_Eav_Model_Entity_Type::fetchNewIncrementId() utilizando store_id = 0 al cargar el registro de la entidad eav_entity_store orden, no importa cual de la tienda que realmente pertenece.

Si no existe tal registro, Magento crea una, usando store_id y 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;
}

Esto debería funcionar para cualquier tipo de entidad utilizando el modelo eav/entity_increment_numeric, como order, invoice, shipment y creditmemo.

BE aunque conscientes, que no pude encontrar ninguna documentación oficial de increment_per_store todavía. Y que no hay ninguna opción en el backend de Magento que le permite configurar esto.

Esto puede o no quiere decir, que no está pensado para ser utilizado oficialmente.

Utilice a su propio riesgo. Si los cambios causan estragos, no me culpes. Usted ha sido advertido ^^

No es apoyada fuera de la caja. También quería hacer esto una vez para tener una segunda storeview una proporción B Test A / increment_id el mismo desde la tienda original.

He intentado hacer coincidir esos 2 números de la forma más sencilla cuando se dispara checkout_submit_all_after, pero sentía muy incómodo con él, así que lo dejé. Supongo que con más storeviews y una gran cantidad de tráfico que esto puede resultar en un desastre real, de modo que hay que profundizar en la lógica Magentos.

Solución:

Tener un diferente orden / factura / Nota de crédito, etc ... rango de números es bastante agradable, para diferentes países, lo que significa por lo general en un nivel de grupo de tiendas.

Sin embargo, tener diferentes rangos numéricos del nivel de tienda vista es una mala cosa si utiliza vistas de almacén para diferentes idiomas, lo que podría hacerse en el 90% de todos los casos.

Afortunadamente no es tan difícil como se propone en este hilo:

Lo que vamos a hacer es buscamos a la almacén predeterminado vista de ID en lugar de utilizar el almacén de vista de ID se llama al método con . Estamos haciendo esto por resolver el grupo de tiendas para la vista tienda actual a buscar a su juicio almacén predeterminado ID. A continuación, todas las vistas tienda de un grupo específico de la tienda utiliza el formato de gama mismo número (el de la vista de almacenamiento por defecto).

Crear esta clase:

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

}

Añadir esta reescritura de config.xml de su módulo:

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

Si usted tiene una manera más agradable, sin tener que volver a escribir la difusión del conocimiento. Que te diviertas. Dont hackear el núcleo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top