Jump to content

Porbleme avec la classe ObjectModel au niveau de la methode add pour le multishop


Recommended Posts

Bonjour,

 

je suis entrain de réaliser un module qui géré les devis pour une application multishop.

 

le probleme c'est que j'arrive pas à inserer les données dans ma table "ps_devis_shop" alors que ça marche pour "ps_devis_lang". et quand je met un die() apres l'insertion sur la table shop. voici un bout de code que j'ai modifier dans la methode add.

// Database insertion for multishop fields related to the object
		if (Shop::isTableAssociated($this->def['table']))
		{
			$fields = $this->getFieldsShop();
			$fields[$this->def['primary']] = (int)$this->id;

			foreach ($id_shop_list as $id_shop)
			{
				$fields['id_shop'] = (int)$id_shop;
				$result &= Db::getInstance()->insert($this->def['table'].'_shop', $fields, $null_values);
			}
		}
		die();
		if (!$result)
			return false;

		// Database insertion for multilingual fields related to the object
		if (!empty($this->def['multilang']))
		{
			$fields = $this->getFieldsLang();
			if ($fields && is_array($fields))
			{
				$shops = Shop::getCompleteListOfShopsID();
				$asso = Shop::getAssoTable($this->def['table'].'_lang');
				foreach ($fields as $field)
.....

j'ai fait un test sur l'insertion et j'ai recu le msg

Duplicate entry '9-2' for key 'PRIMARY'

INSERT INTO `ps_devis_shop` (`id_devis`, `montant`, `id_product`, `id_country`, `date_debut`, `date_fin`, `date_creation`, `id_shop`) VALUES ('9', '53.914412', '5', '45', '2015-07-11 10:34:00', '2015-08-21', '2015-07-11 10:34:00', '2')

merci pour votre aide

Link to comment
Share on other sites

Je n'en sais rien, je n'ai pas tout votre code, je ne sais pas pourquoi vous utilisez $result par référence (&=), si l'insertion c'est bien passée après le die() et que vous n'avez pas effacé les données en table, vous vous retrouvez avec des doublons...

Ca fait pas mal d'éléments inconnus.

 

Un tuto chez Prestashop c'est 1 400€ :)  ( https://www.prestashop.com/fr/formation-developpeur-prestashop ) pour le reste il faut décortiquer le code existant, pas d'autre solution

  • Like 1
Link to comment
Share on other sites

Bonsoir Zouheir/PrestaMO (?!),

 

Ce qu'Eolia essaie de vous dire, c'est que vous avez un soucis éventuellement avec la structure de vos tables et les clés qui y sont définies.

 

Il faudrait commencer par voir cette structure de votre table. Est-il possible pour vous d'exporter la structure (le script de création de la table) et nous le montrer, afin de pouvoir affirmer ou non si le problème survient de là ?

Link to comment
Share on other sites

Bonjour

 

Merci de ne pas utiliser plusieurs pseudos, vous choisissez un pseudo et nous supprimons les autres. Merci de vous conformer aux règles du forum, l'usage de pseudo multiple peux vous valoir un bannissement.

 

 

Bonjour,

 

je suis entrain de réaliser un module qui géré les devis pour une application multishop.

 

le probleme c'est que j'arrive pas à inserer les données dans ma table "ps_devis_shop" alors que ça marche pour "ps_devis_lang". et quand je met un die() apres l'insertion sur la table shop. voici un bout de code que j'ai modifier dans la methode add.

// Database insertion for multishop fields related to the object
		if (Shop::isTableAssociated($this->def['table']))
		{
			$fields = $this->getFieldsShop();
			$fields[$this->def['primary']] = (int)$this->id;

			foreach ($id_shop_list as $id_shop)
			{
				$fields['id_shop'] = (int)$id_shop;
				$result &= Db::getInstance()->insert($this->def['table'].'_shop', $fields, $null_values);
			}
		}
		die();
		if (!$result)
			return false;

		// Database insertion for multilingual fields related to the object
		if (!empty($this->def['multilang']))
		{
			$fields = $this->getFieldsLang();
			if ($fields && is_array($fields))
			{
				$shops = Shop::getCompleteListOfShopsID();
				$asso = Shop::getAssoTable($this->def['table'].'_lang');
				foreach ($fields as $field)
.....

j'ai fait un test sur l'insertion et j'ai recu le msg

Duplicate entry '9-2' for key 'PRIMARY'

INSERT INTO `ps_devis_shop` (`id_devis`, `montant`, `id_product`, `id_country`, `date_debut`, `date_fin`, `date_creation`, `id_shop`) VALUES ('9', '53.914412', '5', '45', '2015-07-11 10:34:00', '2015-08-21', '2015-07-11 10:34:00', '2')

merci pour votre aide

 

 

j'ai le même probleme ma version est 1.6.1.0

 

 

 

j'ai verifié mais c'est pas la cause, quand je met un die() apres la condition sur le multishop je recoi les insertion avec la duplication des id, c'est le principe de multishop. le probleme peut etre est du à autre chose

 

 

 

et pourquoi ça a marché quand j'ai mi un die() après la condition "if (Shop::isTableAssociated($this->def['table']))". vous avez un tuto qui décrit cette configuration?

 

Merci

 

 

j'ai rien changer dans la methode add() j'ai juste mettre un die() après la condition qui inséré dans la table ps_devis_shop et ça a marche mais sans faire cela il n’insère rien ou bien il fait un rollback

Edited by Oron (see edit history)
Link to comment
Share on other sites

No c'est juste que je me connecte sur deux postes.

Voici mon code:

 

Schema de la base pour les trois tables

CREATE TABLE IF NOT EXISTS `ps_devis` (
  `id_devis` int(10) unsigned NOT NULL,
  `id_shop_default` int(10) NOT NULL DEFAULT '1',
  `montant` decimal(20,6) NOT NULL DEFAULT '0.000000',
  `id_product` int(11) unsigned NOT NULL,
  `id_country` int(11) unsigned NOT NULL,
  `date_creation` datetime NOT NULL,
  `date_debut` datetime NOT NULL,
  `date_fin` datetime NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

--
-- Structure de la table `ps_devis_lang`
--

CREATE TABLE IF NOT EXISTS `ps_devis_lang` (
  `id_devis` int(10) unsigned NOT NULL,
  `id_lang` int(10) unsigned NOT NULL,
  `id_shop` int(10) unsigned NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Structure de la table `ps_devis_shop`
--

CREATE TABLE IF NOT EXISTS `ps_devis_shop` (
  `id_devis` int(10) NOT NULL,
  `id_shop` int(10) NOT NULL,
  `montant` decimal(20,6) NOT NULL DEFAULT '0.000000',
  `id_product` int(11) NOT NULL,
  `id_country` int(11) NOT NULL,
  `date_creation` datetime NOT NULL,
  `date_debut` datetime NOT NULL,
  `date_fin` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


-- Index pour la table `ps_devis`
--
ALTER TABLE `ps_devis`
  ADD PRIMARY KEY (`id_devis`);

--
-- Index pour la table `ps_devis_lang`
--
ALTER TABLE `ps_devis_lang`
  ADD PRIMARY KEY (`id_devis`,`id_lang`,`id_shop`);


--
-- AUTO_INCREMENT pour la table `ps_devis`
--
ALTER TABLE `ps_devis`
  MODIFY `id_devis` int(10) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=6;

Et pour la classe DevisManage.php

<?php



class DevisManage extends ObjectModel
{
	/** @var string Name */
	public $montant;
    /** @var int default Shop id */
    public $id_shop_default;
	public $id_product;
    public $id_country;
	public $date_debut;
	public $date_fin;
    public $date_creation;
    public $destination;
   

	/**
	 * @see ObjectModel::$definition
	 */
	public static $definition = array(
		'table' => 'devis',
		'primary' => 'id_devis',
		'multilang' => true,
        'multilang_shop' => true,
		'fields' => array(
			/* classic fields */
            'id_shop_default' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
            'montant' => array('type' => self::TYPE_FLOAT, 'shop' => true, 'validate' => 'isPrice', 'required' => false),
			'id_product' => array('type' => self::TYPE_INT, 'shop' => true,'validate' => 'isInt', 'required' => true),            
            'id_country' => array('type' => self::TYPE_INT, 'shop' => true,'validate' => 'isInt', 'required' => true),
			'date_debut' => array('type' => self::TYPE_DATE, 'shop' => true, 'validate' => 'isDate', 'required' => true),
			'date_fin' => array('type' => self::TYPE_DATE, 'shop' => true, 'validate' => 'isDate', 'required' => true),
            'date_creation' => array('type' => self::TYPE_DATE, 'shop' => true, 'validate' => 'isDate', 'required' => true),
		),
	);
....

et enfin pour la classe controller

class AdminDevisManageController extends ModuleAdminController
{
/** @var array profiles list */
protected $products_array = array();
    protected $destinations_array = array();

public function __construct()
{


$this->bootstrap = true;
$this->table = 'devis';
$this->className = 'DevisManage';
$this->explicitSelect = true;
        $this->lang = true;
$this->context = Context::getContext();
$this->addRowAction('edit');
$this->addRowAction('delete');
$this->addRowActionSkipList('delete', array(1));

$this->bulk_actions = array(
'delete' => array(
'text' => $this->l('Delete selected'),
'confirm' => $this->l('Delete selected items?'),
'icon' => 'icon-trash'
)
);
if (!Tools::getValue('id_devis'))
$this->multishop_context_group = false;

parent::__construct();
....

 

j'ai voulu vous montré ces trois codes car je pense que l'erreur vient soit apartir des tables ou bien des déclaration qui manques dans mon code.

 

Merci

Edited by Zouheir (see edit history)
Link to comment
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
×
×
  • Create New...