Jump to content

Erreur multi-boutique id_shop n'est pas valide


Recommended Posts

Bonjour,

Je suis entrain de travailler sur un site en pré-production sous 1.7.6.
Sur cette pré-prod, le multi-boutique est activé : il y a 3 boutiques.

Je travaille sur une seule qui a son propre thème (les deux autres ont le thème par défaut).

Lorsque je veux une modification sur un module du thème et que je souhaite sauvegarder ma modif., j'ai un message d'erreur. 
J'ai l'impression que l'iD du shop ne se sélectionne pas.

Bien entendu, j'ai vidé le cache, j'ai bien vérifié que la boutique sur laquel je souhiate faire la modif. est bien sélectionné.

Capture d’écran 2021-04-21 à 17.41.53.png

Share this post


Link to post
Share on other sites


if (!defined('_PS_VERSION_')) {
    exit;
}

use PrestaShop\PrestaShop\Core\Module\WidgetInterface;

require_once _PS_MODULE_DIR_.'tm_navcmsblock/classes/NavCmsBlock.php';

class Tm_Navcmsblock extends Module implements WidgetInterface
{
    private $templateFile;

    public function __construct()
    {
        $this->name = 'tm_navcmsblock';
        $this->tab = 'front_office_features';
		$this->author = 'TemplateMela';
        $this->version = '1.0.0';
        $this->need_instance = 0;

        $this->bootstrap = true;
        parent::__construct();

        $this->displayName = $this->trans('TM - Nav CMS Block', array(), 'Modules.NavCmsBlock');
        $this->description = $this->trans('Adds custom information block in your store.', array(), 'Modules.NavCmsBlock');

        $this->ps_versions_compliancy = array('min' => '1.7.0.0', 'max' => _PS_VERSION_);

        $this->templateFile = 'module:tm_navcmsblock/views/templates/hook/tm_navcmsblock.tpl';
    }

    public function install()
    {
		 $this->_clearCache('*');
		 
        return  parent::install() &&
            $this->installDB() &&
         
			$this->registerHook('displayTmnavcmsblock');
    }

    public function uninstall()
    {
        return parent::uninstall() && $this->uninstallDB();
    }

    public function installDB()
    {
        $return = true;
        $return &= Db::getInstance()->execute('
                CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'tmnavcmsblockinfo` (
                `id_tmnavcmsblockinfo` INT UNSIGNED NOT NULL AUTO_INCREMENT,
                `id_shop` int(10) unsigned DEFAULT NULL,
                PRIMARY KEY (`id_tmnavcmsblockinfo`)
            ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'
        );

        $return &= Db::getInstance()->execute('
                CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'tmnavcmsblockinfo_lang` (
                `id_tmnavcmsblockinfo` INT UNSIGNED NOT NULL,
                `id_lang` int(10) unsigned NOT NULL ,
                `text` text NOT NULL,
                PRIMARY KEY (`id_tmnavcmsblockinfo`, `id_lang`)
            ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'
        );

        return $return;
    }

    public function uninstallDB($drop_table = true)
    {
        $ret = true;
        if ($drop_table) {
            $ret &=  Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'tmnavcmsblockinfo`') && Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'tmnavcmsblockinfo_lang`');
        }

        return $ret;
    }

    public function getContent()
    {
        $output = '';

        if (Tools::isSubmit('savetm_navcmsblock')) {
            if (!Tools::getValue('text_'.(int)Configuration::get('PS_LANG_DEFAULT'), false)) {
                $output = $this->displayError($this->trans('Please fill out all fields.', array(), 'Admin.Notifications.Error')) . $this->renderForm();
            } else {
                $update = $this->processSaveNavCmsblock();

                if (!$update) {
                    $output = '<div class="alert alert-danger conf error">'
                        .$this->trans('An error occurred on saving.', array(), 'Admin.Notifications.Error')
                        .'</div>';
                }

                $this->_clearCache($this->templateFile);
            }
        }

        return $output.$this->renderForm();
    }

   public function processSaveNavCmsblock()
    {
        $tmnavcmsblockinfo = new NavCmsBlock(Tools::getValue('id_tmnavcmsblockinfo', 1));

        $text = array();
        $languages = Language::getLanguages(false);
        foreach ($languages as $lang) {
            $text[$lang['id_lang']] = Tools::getValue('text_'.$lang['id_lang']);
        }

        $tmnavcmsblockinfo->text = $text;
        
		if (Shop::isFeatureActive() && !$tmnavcmsblockinfo->id_shop) {
            $saved = true;
            $shop_ids = Shop::getShops();
            foreach ($shop_ids as $id_shop) {
                $tmnavcmsblockinfo->id_shop = $id_shop;
                $saved &= $tmnavcmsblockinfo->add();
            }
        } else {
			$tmnavcmsblockinfo->id_shop = Shop::getContextShopID();
			$saved = $tmnavcmsblockinfo->save();
        }

        return $saved;
    }

    protected function renderForm()
    {
        $default_lang = (int)Configuration::get('PS_LANG_DEFAULT');

        $fields_form = array(
            'tinymce' => true,
            'legend' => array(
                'title' => $this->trans('CMS block', array(), 'Modules.CustomText'),
            ),
            'input' => array(
                'id_tmnavcmsblockinfo' => array(
                    'type' => 'hidden',
                    'name' => 'id_tmnavcmsblockinfo'
                ),
                'content' => array(
                    'type' => 'textarea',
                    'label' => $this->trans('Text block', array(), 'Modules.CustomText'),
                    'lang' => true,
                    'name' => 'text',
                    'cols' => 40,
                    'rows' => 10,
                    'class' => 'rte',
                    'autoload_rte' => true,
                ),
            ),
            'submit' => array(
                'title' => $this->trans('Save', array(), 'Admin.Actions'),
            ),
            'buttons' => array(
                array(
                    'href' => AdminController::$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules'),
                    'title' => $this->trans('Back to list', array(), 'Admin.Actions'),
                    'icon' => 'process-icon-back'
                )
            )
        );

        if (Shop::isFeatureActive() && Tools::getValue('id_tmnavcmsblockinfo') == false) {
            $fields_form['input'][] = array(
                'type' => 'shop',
                'label' => $this->trans('Shop association', array(), 'Admin.Global'),
                'name' => 'checkBoxShopAsso_theme'
            );
        }


        $helper = new HelperForm();
        $helper->module = $this;
        $helper->name_controller = 'tm_navcmsblock';
        $helper->identifier = $this->identifier;
        $helper->token = Tools::getAdminTokenLite('AdminModules');
        foreach (Language::getLanguages(false) as $lang) {
            $helper->languages[] = array(
                'id_lang' => $lang['id_lang'],
                'iso_code' => $lang['iso_code'],
                'name' => $lang['name'],
                'is_default' => ($default_lang == $lang['id_lang'] ? 1 : 0)
            );
        }

        $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name;
        $helper->default_form_language = $default_lang;
        $helper->allow_employee_form_lang = $default_lang;
        $helper->toolbar_scroll = true;
        $helper->title = $this->displayName;
        $helper->submit_action = 'savetm_navcmsblock';

        $helper->fields_value = $this->getFormValues();

        return $helper->generateForm(array(array('form' => $fields_form)));
    }

    public function getFormValues()
    {
        $fields_value = array();
        $id_tmnavcmsblockinfo = 1;

        foreach (Language::getLanguages(false) as $lang) {
            $tmnavcmsblockinfo = new NavCmsBlock((int)$id_tmnavcmsblockinfo);
            $fields_value['text'][(int)$lang['id_lang']] = $tmnavcmsblockinfo->text[(int)$lang['id_lang']];
        }

        $fields_value['id_tmnavcmsblockinfo'] = $id_tmnavcmsblockinfo;

        return $fields_value;
    }

    public function renderWidget($hookName = null, array $configuration = [])
    {
        if (!$this->isCached($this->templateFile, $this->getCacheId('tm_navcmsblock'))) {
            $this->smarty->assign($this->getWidgetVariables($hookName, $configuration));
        }

        return $this->fetch($this->templateFile, $this->getCacheId('tm_navcmsblock'));
    }
    public function getWidgetVariables($hookName = null, array $configuration = [])
    {
        $sql = 'SELECT r.`id_tmnavcmsblockinfo`, r.`id_shop`, rl.`text`
            FROM `'._DB_PREFIX_.'tmnavcmsblockinfo` r
            LEFT JOIN `'._DB_PREFIX_.'tmnavcmsblockinfo_lang` rl ON (r.`id_tmnavcmsblockinfo` = rl.`id_tmnavcmsblockinfo`)
            WHERE `id_lang` = '.(int)$this->context->language->id.' AND  `id_shop` = '.(int)$this->context->shop->id;

        return array(
            'tmnavcmsblockinfos' => Db::getInstance()->getRow($sql),
        );
    }
	
}

Oui biensur, voici le code.

Edited by MT Studio (see edit history)

Share this post


Link to post
Share on other sites

Les 3 boutiques sont visibles.
C'est bien la boutique 2 qui a été sélectionné pour faire la modif.

array(3) { [3]=> array(9) { ["id_shop"]=> string(1) "3" ["id_shop_group"]=> string(1) "1" ["name"]=> string(15) "Boutique1" ["id_category"]=> string(1) "2" ["theme_name"]=> string(7) "classic" ["domain"]=> string(17) "boutique1.com" ["domain_ssl"]=> string(17) "boutique1.com" ["uri"]=> string(1) "/" ["active"]=> string(1) "1" } [1]=> array(9) { ["id_shop"]=> string(1) "1" ["id_shop_group"]=> string(1) "1" ["name"]=> string(12) "Boutique2" ["id_category"]=> string(1) "2" ["theme_name"]=> string(10) "PRSADD0106" ["domain"]=> string(24) "boutique2.fr" ["domain_ssl"]=> string(24) "boutique2.fr" ["uri"]=> string(1) "/" ["active"]=> string(1) "1" } [2]=> array(9) { ["id_shop"]=> string(1) "2" ["id_shop_group"]=> string(1) "1" ["name"]=> string(16) "Boutique3" ["id_category"]=> string(1) "2" ["theme_name"]=> string(7) "classic" ["domain"]=> string(17) "boutique3.fr" ["domain_ssl"]=> string(17) "boutique3.fr" ["uri"]=> string(1) "/" ["active"]=> string(1) "1" } }

 

Share this post


Link to post
Share on other sites

essaye ca,

<?php
/**
* 2007-2016 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to [email protected] so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author    PrestaShop SA <[email protected]>
*  @copyright 2007-2016 PrestaShop SA
*  @license   http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
*  International Registred Trademark & Property of PrestaShop SA
*/

class NavCmsBlock extends ObjectModel
{
	public $id_tmnavcmsblockinfo;

	public $id_shop;

	public $text;

	/**
	 * @see ObjectModel::$definition
	 */
	public static $definition = array(
		'table' => 'tmnavcmsblockinfo',
		'primary' => 'id_tmnavcmsblockinfo',
		'multilang' => true,
		'multilang_shop' => true,	
		'fields' => array(
			'id_tmnavcmsblockinfo' =>			array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
			'id_shop' =>			array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
			// Lang fields
			'id_lang' =>			array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
			'text' =>				array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml', 'required' => true),
		)
	);

}

 

Share this post


Link to post
Share on other sites

creer une table ps_tmnavcmsblockinfo_shop

fait une requette via php my admin (onglet SQL)

 CREATE TABLE ps_tmnavcmsblockinfo_shop` (
                `id_tmnavcmsblockinfo` INT UNSIGNED NOT NULL,
                `id_shop` int(10) unsigned NOT NULL ,
                PRIMARY KEY (`id_tmnavcmsblockinfo`, `id_shop`));

et on modifie l'install

 public function installDB()
    {
        $return = true;
        $return &= Db::getInstance()->execute('
                CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'tmnavcmsblockinfo` (
                `id_tmnavcmsblockinfo` INT UNSIGNED NOT NULL AUTO_INCREMENT,
                `id_shop` int(10) unsigned DEFAULT NULL,
                PRIMARY KEY (`id_tmnavcmsblockinfo`)
            ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'
        );

        $return &= Db::getInstance()->execute('
                CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'tmnavcmsblockinfo_lang` (
                `id_tmnavcmsblockinfo` INT UNSIGNED NOT NULL,
                `id_lang` int(10) unsigned NOT NULL ,
                `id_shop` int(10) unsigned NOT NULL ,
                `text` text NOT NULL,
                PRIMARY KEY (`id_tmnavcmsblockinfo`, `id_lang`)
            ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'
        );
        $return &= Db::getInstance()->execute('
                CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'tmnavcmsblockinfo_shop` (
                `id_tmnavcmsblockinfo` INT UNSIGNED NOT NULL,
                `id_shop` int(10) unsigned NOT NULL ,
                PRIMARY KEY (`id_tmnavcmsblockinfo`, `id_shop`)
            ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'
        );

        return $return;
    }

 

Edited by Alexandre Carette (see edit history)

Share this post


Link to post
Share on other sites

Hello,

Après avoir échangé avec le développeur du thème, il s'avère qu'il y a une incompatibilité des modules avec le multi-boutique...
Je ne vais pas chercher plus loin, je désactive le mode multiboutique de la pré-prod.

Merci en tout cas Alexandre pour ton aide !

Edited by MT Studio (see edit history)

Share this post


Link to post
Share on other sites

il y a 50 minutes, MT Studio a dit :

Après avoir échangé avec le développeur du thème, il s'avère qu'il y a une incompatibilité des modules avec le multi-boutique...

Donc leur template n'est pas compatible avec Prestas£hop, car le multi boutique est une fonctionnalité de base de PrestaShop.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More