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