Bonjour à tous !
Tout d'abord, je tiens à vous remercier d'avance pour l'attention que vous porterez à ce poste.
Je viens de m'inscrire à ce forum parce que je fais face à un problème sur la version 3 de CakePHP.
Au sein de ma base de données, figurent les 3 tables suivantes :
- <strong>posts</strong> : table dans laquelle je stocke tous les articles (ou posts).
- <strong>posts_authors</strong> : Table dans laquelle je stocke les auteurs des articles.
- <strong>users</strong> : Table dans laquelle je stocke tous les utilisateurs.
<strong>FONCTIONNEMENT DE MA PARTIE POSTS :</strong>
J'ai ajouté une fonctionnalité qui permet d'ajouter un ou plusieurs auteurs supplémentaires aux articles. Il suffit de sélectionner un auteur dans une liste déroulante, puis un input caché avec ses informations est ajouté dans le code en utilisant du JavaScript (son nom est également ajouté dans un table HTML de la page qui liste les auteurs de l'article en question). Lorsque j'enregistre, le ou leurs auteur(s) sont ajoutés dans une table associée : <strong>posts_authors</strong>. Lors de l'édition d'un article, il est possible de supprimer un auteur de l'article en cliquant sur une icône (Ajax).
<strong>MON PROBLEME :</strong>
<strong>Scénario numéro 1 :</strong> Lorsque j'ajoute un article en sélectionnant un auteur, CakePHP enregistre bien l'auteur dans la table associée posts_authors, mais n'enregistre pas la valeur des champs du modèle courant posts (par exemple title, slug, content).
<strong>Scénario numéro 2 :</strong> Si j'ajoute un article sans sélectionner d'auteur, les champs titre, slug et content du modèle courant sont bels et bien ajoutés en base.
<strong>Scénario numéro 3 :</strong> Lorsque j'édite un article existant, tout fonctionne correctement.
<strong>MON CODE :</strong>
<strong>PostsController.php (Contrôleur)</strong>
<pre><code>
public function add()
{
$post = $this->Posts->newEntity();
$authors = $this->Posts->Users->find('list')->order(['Users.name' => 'ASC']);
$categories = $this->Posts->Categories->find('list')->order(['Categories.name' => 'ASC']);
if ($this->request->is('post'))
{
$post = $this->Posts->patchEntity($post, $this->request->data);
if ($this->Posts->save($post)) {
$this->Flash->success($this->record_saved);
return $this->redirect(['action' => 'index']);
}
$this->Flash->error($this->unable_add_record);
}
else
{
$post->id = $this->Posts->getDraftId($this->Posts, ['user_id' => $this->Auth->user('id')]);
}
$this->set(compact(
['post', $post],
['authors', $authors],
['categories', $categories]
));
$this->render('edit');
}
</code></pre>
<strong>PostsTable.php (Modèle)</strong>
<pre><code>class PostsTable extends Table
{
public function initialize(array $config)
{
$this->addBehavior('Timestamp');
$this->addBehavior('Romano83/Cakephp3Draft.Draft');
$this->addBehavior(
'Media.Media', [
'path' => 'img/upload/%y/%m/%f',
'extensions' => ['jpg', 'png'],
'limit' => 0,
'max_width' => 0,
'max_height' => 0,
'size' => 0
]
);
$this->hasMany('Users', ['foreignKey' => 'user_id']);
$this->hasMany('Categories', ['foreignKey' => 'category_id']);
$this->belongsTo('Users', [
'className' => 'Users',
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);
}
}</code></pre>
<strong>PostsAuthorsTable.php (Modèle)</strong>
<pre><code> class PostsAuthorsTable extends Table
{
public function initialize(array $config)
{
$this->addBehavior('Timestamp');
$this->belongsTo('Users', [
'className' => 'Users',
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);
}
}</code></pre>
Dans tous les cas, si je fais un debug de <strong>$this->request->data</strong>, j'obtiens pourtant tous mes champs...
<pre><code> /src/Controller/Backoffice/PostsController.php (line 55)
[
'name' => 'title example',
'slug' => 'slug-example',
'content' => '<p>content example</p> ',
'publication' => '2015-11-23',
'publication_time' => '09:08:23',
'authors' => '',
'Posts' => [
'posts_authors' => [
(int) 3 => [
'user_id' => '32'
]
],
'posts_categories' => [
(int) 4 => [
'category_id' => '4'
]
]
],
'categories' => '',
'online' => '1'
]</code></pre>
Merci d'avance pour votre aide ! :)