🌐 Context en multitienda — Shop::getContext()

Actualizado: 2024-12-01

Cuando la multitienda esta activa, el administrador puede estar trabajando en el contexto 'Todas las tiendas', en un grupo o en una tienda especifica. Los modulos deben detectar este contexto para guardar y mostrar los datos correctos.

#Shop::getContext() — los tres estados

Detectar y manejar los tres contextos multitienda
php
<?php

// Solo relevante si la multitienda esta activa
if (!Shop::isFeatureActive()) {
    $idShop = (int) Context::getContext()->shop->id;
    // Instalacion simple — usar id_shop directamente
    return;
}

$shopContext = Shop::getContext();

if ($shopContext === Shop::CONTEXT_SHOP) {
    // ── TIENDA ESPECIFICA ──
    $idShop = Shop::getContextShopID();
    // Mostrar/guardar datos solo para esta tienda

} elseif ($shopContext === Shop::CONTEXT_GROUP) {
    // ── GRUPO DE TIENDAS ──
    $idGroup = Shop::getContextShopGroupID();
    $shops   = Shop::getShops(true, $idGroup);  // todas las tiendas del grupo
    // Mostrar/guardar datos para todas las tiendas del grupo

} elseif ($shopContext === Shop::CONTEXT_ALL) {
    // ── TODAS LAS TIENDAS ──
    $shops = Shop::getShops(true);  // todas las tiendas activas
    // Mostrar/guardar datos para TODAS las tiendas
}

#Obtener IDs de tiendas del contexto

Metodos para obtener los IDs del contexto actual
php
<?php

// ID de la tienda actual (solo en CONTEXT_SHOP)
$idShop  = Shop::getContextShopID();

// ID del grupo actual (en CONTEXT_GROUP o CONTEXT_SHOP)
$idGroup = Shop::getContextShopGroupID();

// Lista de IDs de todas las tiendas del contexto actual
$shopIds = Shop::getContextListShopID();
// En CONTEXT_SHOP:  [3]
// En CONTEXT_GROUP: [2, 3, 4]
// En CONTEXT_ALL:   [1, 2, 3, 4, 5]

// Todas las tiendas activas (independiente del contexto)
$allShops = Shop::getShops(true);  // array de arrays con datos de cada tienda

// Ejemplo: guardar configuracion para todas las tiendas del contexto
foreach (Shop::getContextListShopID() as $shopId) {
    Configuration::updateValue('MY_KEY', $value, false, null, (int) $shopId);
}

#Filtrar queries por tienda

Añadir filtro de tienda en queries SQL propias
php
<?php

/**
 * Para tablas propias con id_shop, el filtrado es manual.
 * Usar Shop::addSqlAssociation() para tablas del core que usan
 * el sistema de asociacion de tiendas.
 */

// ── QUERY SIMPLE CON FILTRO DE TIENDA ──
if (Shop::isFeatureActive() && Shop::getContext() === Shop::CONTEXT_SHOP) {
    $shopFilter = ' AND id_shop = ' . Shop::getContextShopID();
} else {
    $shopFilter = '';  // Mostrar de todas las tiendas
}

$items = Db::getInstance()->executeS(
    'SELECT * FROM `' . _DB_PREFIX_ . 'mymodule_items`
     WHERE active = 1' . $shopFilter
);

// ── PARA OBJETOS ObjectModel con id_shop ──
// Si tu ObjectModel tiene id_shop en su definicion,
// PrestaShop maneja el filtrado automaticamente si activas:
// 'multishop_fields' => ['id_shop' => []]
// en el array $definition['fields']

#Checkboxes de multitienda en el BO

Mostrar checkboxes de aplicar-a-tiendas en HelperForm
php
<?php

// En HelperForm, activar los checkboxes de multitienda:
$helper = new HelperForm();
// ...

// Para que aparezcan los checkboxes de 'Aplicar a todas las tiendas'
// en los campos, añadir en cada campo:
$fields_form = [[
    'form' => [
        'input' => [
            [
                'type'    => 'text',
                'name'    => 'MY_KEY',
                'label'   => 'Mi ajuste',
                // Este flag activa el checkbox de multitienda para este campo
                'multistore_override' => ['MY_KEY'],  // claves de Configuration
            ],
        ],
    ],
]];

// En getContent(): leer el checkbox de aplicar a todas las tiendas
if (Tools::isSubmit('submitMymodule')) {
    $value  = Tools::getValue('MY_KEY');
    $applyAll = (bool) Tools::getValue('multishop_override_MY_KEY');

    if ($applyAll) {
        // Guardar para todas las tiendas
        foreach (Shop::getShops(true) as $shop) {
            Configuration::updateValue('MY_KEY', $value, false, null, (int) $shop['id_shop']);
        }
    } else {
        // Solo la tienda activa
        Configuration::updateValue('MY_KEY', $value);
    }
}
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.