CakePHP-Fr.Org

Forum francophone du Framework CakePHP

Vous n'êtes pas identifié.

#1 28-07-2016 18:40:19

STUDIO-SFX
Pitivier
Date d'inscription: 25-06-2012
Messages: 16

[RESOLU] Cakephp 3 Charger données et sauv. dans autre table

Bonjour à tous,

Je planche sur un probleme et je ne sais pas quelle méthode adoptée.
Je souhaite que mes articles qui ont plus d'un an passe dans les archives soit sur une autre table.
Table 'Articles' -> Table 'Archives'
Ce que je cherche a faire c'est recuperer les données puis les enregistrer dans une autre table.
Cakephp 3
// je recupere les données (controller)

Code: php

  1. $article = $this->Articles->get($id);
  2. unset($article->id);
  3. unset($article->created);
  4. unset($article->modified);

// je charge mon model Archives pour enregister la article dans celui-ci

Code: php

  1. $this->loadModel('Archives');
  2. $archive = $this->Archives->newEntity();
  3. $archive = $this->Archives->patchEntity($archive, $article);
  4. $this->Archives->save($archive);

Mais cela ne fonctionne pas ! Quelqu'un aurait une idée !!!
Un grand merci !!

Hors ligne

 

#2 29-07-2016 10:12:30

cake17
Cooker
Date d'inscription: 29-03-2012
Messages: 381
Site web

Re: [RESOLU] Cakephp 3 Charger données et sauv. dans autre table

Bonjour,

Je pense que le meilleur à faire est de mettre un maximum de code dans les tables (c'est d'ailleurs une règle d'or avec CakePHP). Tu peux créer dans la table ArticlesTables 2 méthodes qui vont archiver soit un article, soit plusieurs, il faut aussi ajouter un use Cake\ORM\TableRegistry; en haut de ArticlesTables:

Code: php

  1.    /**
  2.      * Archive an article
  3.      *
  4.      * @param \App\Model\Entity\Article $article Article Entity.
  5.      * @return bool true on success, false on failure
  6.      */
  7.     public function archive(\App\Model\Entity\Article $article) {
  8.         $archives = TableRegistry::get('Archives');
  9.         $archiveToSave = $archives->newEntity($article->toArray());
  10.  
  11.         // sauvegarde dans la table archives
  12.         if (!$archives->save($archiveToSave)) {
  13.             return false;
  14.         }
  15.         // suppression de l'article
  16.         if (!$this->delete($article)) {
  17.             return false;
  18.         }
  19.  
  20.         return true;
  21.     }
  22.  
  23.     /**
  24.      * Archive all articles
  25.      *
  26.      * @param array $articles array of \App\Model\Entity\Article Entities.
  27.      * @return bool true on success, false on failure
  28.      */
  29.     public function archiveAll($articles) {
  30.         foreach ($articles as $article) {
  31.             if (!$article instanceof \App\Model\Entity\Article) {
  32.                return false;
  33.             }
  34.  
  35.             if (!$this->archive($article)) {
  36.                 return false;
  37.             }
  38.         }
  39.  
  40.         return true;
  41.     }

Et le code pour ton controller ArticlesController:

Code: php

  1.    /**
  2.      * Archive all method
  3.      *
  4.      * @return \Cake\Network\Response|null Redirects to index.
  5.      */
  6.     public function archiveAll()
  7.     {
  8.         $this->request->allowMethod(['post', 'delete']);
  9.  
  10.         $articles = $this->Articles->find()
  11.             ->where(['Articles.created <=' => new \DateTime('-1 year')]);
  12.  
  13.         if ($this->Articles->archiveAll($articles)) {
  14.             $this->Flash->success(__('The articles have been archived.'));
  15.         } else {
  16.             $this->Flash->error(__('The articles could not be archived. Please, try again.'));
  17.         }
  18.  
  19.         return $this->redirect(['action' => 'index']);
  20.     }
  21.  
  22.     /**
  23.      * Archive method
  24.      *
  25.      * @param string|null $id Article id.
  26.      * @return \Cake\Network\Response|null Redirects to index.
  27.      * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
  28.      */
  29.     public function archive($id = null)
  30.     {
  31.         $this->request->allowMethod(['post', 'delete']);
  32.  
  33.         $article = $this->Articles->get($id);
  34.         if ($this->Articles->archive($article)) {
  35.             $this->Flash->success(__('The article has been archived.'));
  36.         } else {
  37.             $this->Flash->error(__('The article could not be archived. Please, try again.'));
  38.         }
  39.  
  40.         return $this->redirect(['action' => 'index']);
  41.     }

Dans ta vue Articles/index.ctp:

Code: php

  1. <?= $this->Form->postLink(__("Archiver tous les articles de plus d'un an"), ['action' => 'archiveAll'], ['confirm' => __('Are you sure you want to archive all articles older than one year?')]) ?>
  2.  
  3. <?php foreach ($articles as $article): ?>
  4.     <?= $this->Form->postLink(__('Archive'), ['action' => 'archive', $article->id], ['confirm' => __('Are you sure you want to archive # {0}?', $article->id)]) ?>
  5. <?php endforeach; ?>

Et surtout ajouter des tests ! Bon code

Hors ligne

 

#3 29-07-2016 13:01:08

STUDIO-SFX
Pitivier
Date d'inscription: 25-06-2012
Messages: 16

Re: [RESOLU] Cakephp 3 Charger données et sauv. dans autre table

Bonjour cake17

Un grand grand merci !!! ca fonctionne c'est niquel !
Merci d'avoir pris du temps pour ca !!!! smilebig_smile

Hors ligne

 

#4 29-07-2016 14:01:15

cake17
Cooker
Date d'inscription: 29-03-2012
Messages: 381
Site web

Re: [RESOLU] Cakephp 3 Charger données et sauv. dans autre table

Avec plaisir smile, je mets ton sujet en RESOLU

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr