Bonjour à tous,

Voila je commence à me familiariser avec ce framework qui à franchement l'air bien sympa mais j'ai un soucis sur mon test. C'est une gestion d'article ultra basique pour l'instant que je vais compléter au fur et à mesure de mon apprentissage.

Au lieu de faire une longue explication je vais vous donner mon code et après le résultat que je ne comprends pas.

Mon contrôleur ContenuArticlesController.php:

<?php
class ContenuArticlesController extends AppController {
    public $helpers = array('Html', 'Form', 'Session');
    public $components = array('Session');
    public function index() {
        $this->set('contenuarticles', $this->ContenuArticle->find('all'));
    }
    ....
    public function edit($id = null) {
        if (!$id) {
            throw new NotFoundException(__('Invalid post'));
        }
        $article = $this->ContenuArticle->findById($id);
        if (!$article) {
            throw new NotFoundException(__('Invalid post'));
        }
        if ($this->request->is('article') || $this->request->is('put')) {
            $this->ContenuArticle->id = $id;
            if ($this->ContenuArticle->saveAssociated($this->request->data)) {
                $this->Session->setFlash(__('Your post has been updated.'));
                return $this->redirect(array('action' => 'index'));
            }
            $this->Session->setFlash(__('Unable to update your post.'));
        }
        if (!$this->request->data) {
            $this->request->data = $article;
        }
    }
     ...
}
?>

Mon modèle ContenuArticle.php:

<?php
class ContenuArticle extends AppModel {
    public $validate = array(
        'trad_article_titre' => array(
            'rule' => 'notEmpty'
        ),
        'trad_article_texte' => array(
            'rule' => 'notEmpty'
        )
    );
    public $hasOne = array(
        'ContenuTradArticle' => array(
            'className' => 'ContenuTradArticle',
            'foreignKey' => 'trad_article_article_id',
            'conditions' => array('trad_article_langue_id' => '1'),
            'dependent' => true
        )
    );
}
?>

la vue qui liste les articles, index.ctp:

<!-- File: /app/View/ContenuArticles/index.ctp -->
<h1>Articles</h1>
<?php echo $this->Html->link(
    'Ajouter un Article',
    array('controller' => 'contenuarticles', 'action' => 'add')
); ?>
<table>
    <tr>
        <th>Id</th>
        <th>Title</th>
        <th>Action</th>
        <th>Created</th>
    </tr>
    <!-- Here is where we loop through our $posts array, printing out post info -->
    <?php foreach ($contenuarticles as $contenuarticle): ?>
    <tr>
        <td><?php echo $contenuarticle'ContenuArticle']'id']; ?></td>
        <td>
            <?php echo $this->Html->link($contenuarticle'ContenuTradArticle']'trad_article_titre'], array('action' => 'view', $contenuarticle'ContenuArticle']'id'])); ?>
        </td>
        <td>
            <?php echo $this->Form->postLink(
                'Delete',
                array('action' => 'delete', $contenuarticle'ContenuArticle']'id']),
                array('confirm' => 'Etes-vous sûr ?'));
            ?>
            <?php echo $this->Html->link('Edit', array('action' => 'edit', $contenuarticle'ContenuArticle']'id'])); ?>
        </td>
        <td>
            <?php echo $contenuarticle'ContenuArticle']'created']; ?>
        </td>
    </tr>
    <?php endforeach; ?>
    <?php unset($contenuarticle); ?>
</table>

La vue qui sert à éditer un article, edit.ctp:

<!-- Fichier: /app/View/ContenuArticles/edit.ctp -->
<h1>Editer le post</h1>
<?php
    echo $this->Form->create('ContenuArticle', array('action' => 'edit'));
    echo $this->Form->input('ContenuTradArticle.trad_article_titre', array('label' => 'Titre'));
    echo $this->Form->input('ContenuTradArticle.trad_article_texte', array('label' => 'Texte','type' => 'textarea','rows' => '3'));
    echo $this->Form->input('ContenuArticle.id', array('type' => 'hidden'));
     echo $this->Form->input('ContenuTradArticle.id', array('type' => 'hidden'));
   echo $this->Form->input('ContenuTradArticle.trad_article_langue_id', array('type' => 'hidden','value' => 1));
    echo $this->Form->end('Sauvegarder le post');
?>

J'ai donc deux tables, contenu_articles et contenu_trad_articles:
contenu_articles
id
article_publie
created
modified

contenu_trad_articles
id
trad_article_titre
trad_article_texte
trad_article_article_id (liaison avec la table contenu_articles)
trad_article_langue_id
created
modified

L'affichage de la liste ce passe bien mais quand j'édite un article et que je valide le formulaire ça me redirige sur "/contenu_articles/edit/1" au lieu de "/contenuarticles/edit/1" (et ça n'enregistre pas les modifs non plus) et c'est là où je vois pas ce que je fais de mal pour avoir ce résultat.
J'espère avoir donné assez de détails pour que vous puissiez m'éclairer.

D'avance Merci.

3 réponses


Bonjour.
C'est tout à fait normal, étant donné que le nom de ton controller est en Camel Case, il considère tout simplement que ta vue est avec des uderscores.
Ce qui veut dire, que pour CakePHP, ton controller ContenuArticles renvoie sur les vues contenu_articles.

Par contre, ta fonction "edit" ne te permet que de modifier des articles et non d'en créer.

Pec
Auteur

Bonjour,
Merci pour ta réponse, j'ai normalement respecté (enfin il me semble) la convention de nommage de CakePHP.
Ce que je ne comprends pas c'est que quand je clique sur un lien de ma liste pour arriver sur le formulaire d'édition j'ai bien l'adresse /contenuarticles/edit/1 et quand je valide le formulaire l'action de celui-ci est /contenu_articles/edit/1 mais je ne vois pas ou je me suis trompé... c'est con, tu pourrais m'aiguiller s'il te plait?

J'essaie d'apprendre et comprendre ce framework, je sais que cette partie ne me permet que de modifier et pas de créer mais merci de l'avoir souligné :)

Pec
Auteur

Bon apparemment c'est moi qui aurait mal compris à la base il faut que toutes les urls soient en /contenu_articles/...
Erreur de noob...
et à la ligne 22 de mon contrôleur j'ai remplacé

if ($this->request->is('article') || $this->request->is('put')) {

par

if ($this->request->is('post')) {