⚙️ Configuration multitienda — por tienda y por grupo

Actualizado: 2024-12-01

La API Configuration de PrestaShop soporta multitienda de forma nativa. Puedes guardar valores diferentes para cada tienda y leer el valor de la tienda activa con la misma llamada Configuration::get(). Los valores se heredan del nivel superior si no se han sobreescrito.

#Configuration::get() en multitienda

Leer configuracion con soporte multitienda
php
<?php

// Lee el valor del contexto actual (tienda activa)
// Si la tienda no tiene valor propio, hereda del grupo/global
$value = Configuration::get('MY_MODULE_KEY');

// Leer valor de una tienda especifica
$value = Configuration::get(
    'MY_MODULE_KEY',
    null,  // id_lang (null = sin idioma)
    null,  // id_shop_group (null = ignorar)
    5      // id_shop = 5
);

// Leer valor de un grupo de tiendas
$value = Configuration::get(
    'MY_MODULE_KEY',
    null,
    2,     // id_shop_group = 2
    null
);

// Con valor por defecto
$value = Configuration::get('MY_MODULE_KEY') ?: 'valor_default';

// Obtener todos los valores por tienda (array id_shop => valor)
$allValues = Configuration::getMultiShopValues('MY_MODULE_KEY');

#Configuration::updateValue() por tienda

Guardar configuracion para una tienda especifica
php
<?php

// Guardar globalmente (para todas las tiendas / herencia)
Configuration::updateValue('MY_MODULE_KEY', 'valor_global');

// Guardar para una tienda especifica
Configuration::updateValue(
    'MY_MODULE_KEY',
    'valor_tienda_1',
    false,  // html (false = sin HTML)
    null,   // id_shop_group
    1       // id_shop = 1
);

// Guardar para un grupo de tiendas
Configuration::updateValue(
    'MY_MODULE_KEY',
    'valor_grupo_2',
    false,
    2,      // id_shop_group = 2
    null
);

// Guardar para todas las tiendas activas
foreach (Shop::getShops(true) as $shop) {
    Configuration::updateValue(
        'MY_MODULE_KEY',
        'valor_' . $shop['id_shop'],
        false, null,
        (int) $shop['id_shop']
    );
}

#Herencia de valores entre contextos

Nivel donde se guardaQuien lo hereda
Global (sin id_shop, sin id_group)Todas las tiendas que no tienen valor propio
Grupo (id_shop_group)Tiendas del grupo que no tienen valor propio
Tienda (id_shop)Solo esa tienda (maxima especificidad)

#Patron: guardar para el contexto actual

Guardar configuracion segun el contexto activo del BO
php
<?php

/**
 * Guardar configuracion respetando el contexto multitienda activo.
 * Llamar en postProcess() o processConfigForm().
 */
private function saveConfiguration(string $key, $value): void
{
    if (!Shop::isFeatureActive()) {
        // Tienda simple — guardar globalmente
        Configuration::updateValue($key, $value);
        return;
    }

    $context = Shop::getContext();

    if ($context === Shop::CONTEXT_ALL) {
        // Modo 'Todas las tiendas' — guardar globalmente
        Configuration::updateValue($key, $value);

    } elseif ($context === Shop::CONTEXT_GROUP) {
        // Por grupo
        Configuration::updateValue($key, $value, false, Shop::getContextShopGroupID(), null);

    } elseif ($context === Shop::CONTEXT_SHOP) {
        // Por tienda especifica
        Configuration::updateValue($key, $value, false, null, Shop::getContextShopID());
    }
}

#ObjectModel con campos multitienda

Definir un ObjectModel con soporte multitienda
php
<?php

class MyModuleItem extends ObjectModel
{
    public $id_shop;
    public $name;
    public $active;

    public static $definition = [
        'table'   => 'mymodule_item',
        'primary' => 'id_mymodule_item',
        'multishop' => true,  // Activa el soporte multitienda
        'fields'  => [
            'id_shop' => ['type' => self::TYPE_INT],
            'name'    => [
                'type'     => self::TYPE_STRING,
                'required' => true,
                'size'     => 255,
            ],
            'active'  => ['type' => self::TYPE_BOOL],
        ],
        // Campos que se almacenan separados por tienda (en tabla _shop)
        'multilang_shop' => false,
    ];
}
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.