🌐 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.