Bonjour,

Pour faire simple, c'est le principe du tuto des tags.

Table des tags
<code><pre>CREATE TABLE IF NOT EXISTS attributs (
id int(11) NOT NULL,
name varchar(50) DEFAULT NULL,
series_id int(11) DEFAULT '0',
ordre int(11) NOT NULL DEFAULT '0',
parent int(11) NOT NULL DEFAULT '0',
created varchar(50) NOT NULL DEFAULT '0',
updated varchar(50) NOT NULL DEFAULT '0'
) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8;
</pre></code>

Table des posts
<code><pre>CREATE TABLE IF NOT EXISTS stes (
id int(11) NOT NULL,
name varchar(255) NOT NULL,
ad1 varchar(255) DEFAULT NULL,
ad2 varchar(255) DEFAULT NULL,
ad3 varchar(255) DEFAULT NULL,
.....
created datetime NOT NULL,
updated datetime NOT NULL,
structuremail varchar(255) DEFAULT NULL,
siren varchar(9) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
</pre></code>

Table de liaison
<code><pre>
CREATE TABLE IF NOT EXISTS attribut_relationships (
id bigint(20) NOT NULL,
ref varchar(50) NOT NULL,
ref_id int(11) NOT NULL,
attribut_id int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
</pre></code>
La fonction de détection de l'ajout ou existant
<code><pre>
if(!empty($this->data['Ste']['attributs'])){
$atts = explode(',',$this->data['Ste']['attributs']);
foreach ($atts as $att) {
$att = trim($att);
if(!empty($att)) {
//debug($this->Attribut->findByName($att));
$a = $this->Attribut->findByName($att);
if(!empty($a)) {
$this->Attribut->id = $a['Attribut']['id'];
}else{
$this->Attribut->create();
$result = $this->Attribut->save(array(
'name' => $att),true);
echo 'Après sauvegarde';
debug($result);
die();
}
debug($this->Attribut->id);
}
}
}
</pre></code>

 Le controller Ste
 <code><pre>
    public $hasAndBelongsToMany = array('Attribut' => array( 
        'associationForeignKey' => 'attribut_id',
        // 'with' => 'Taxonomy.AttributR',
        'foreignKey' => 'ref_id',
        'joinTable' => 'attribut_relationships'
        //,'conditions' => 'ref = "stes"'
        ));
public $recursive = 1;

</pre></code>
Le controleur Attribut
<code><pre>
public function beforeSave($options = array()) {
debug($this->data);
if (empty($this->data[$this->alias]['ordre'])) { $this->data[$this->alias]['ordre']=0 ; }
if (empty($this->data[$this->alias]['parent'])) { $this->data[$this->alias]['parent']=0 ; }
if (empty($this->data[$this->alias]['series_id'])) { $this->data[$this->alias]['series_id']=9 ; }
}
public function afterSave($created, $options = array()) {
debug($this->data);
debug($created);
debug($options);
}
</pre></code>

Le retour des debugs
<code><pre>
\app\Model\Attribut.php (line 22) "BeforeSave"
array(
'Attribut' => array(
'series_id' => '0',
'ordre' => '0',
'parent' => '0',
'created' => '0',
'updated' => '0',
'name' => 'test1'
)
)
\app\Model\Attribut.php (line 36) "AfterSave"
array(
'Attribut' => array(
'series_id' => (int) 9,
'ordre' => (int) 0,
'parent' => (int) 0,
'created' => '0',
'updated' => '0',
'name' => 'test1',
'id' => '49'
)
)
\app\Model\Attribut.php (line 37) "AfterSave($created)
true
\app\Model\Attribut.php (line 38) aftersave($options)
array(
'validate' => true,
'fieldList' => array(),
'callbacks' => true,
'counterCache' => true,
'atomic' => true
)
Après sauvegarde
\app\Model\Ste.php (line 40) return de $this->save
array(
'Attribut' => array(
'series_id' => (int) 9,
'ordre' => (int) 0,
'parent' => (int) 0,
'created' => '0',
'updated' => '0',
'name' => 'test1',
'id' => '49'
)
)
</pre></code>

Il fait comme s'il insérer les données en base, mais en fait la base, mais il n'inscrit rien dans la base de donnée.
Et en plus il incrément l'id à chaque fois !! Je ne sais même pas d'ou il interprète l'id. Normalement le numéro doit être 25 !

PS: Serie_id = 9 est présent dans la table series

Merci pour votre aide

Aucune réponse