2015-10-07 2 views
0

Je souhaite créer un comportement CakePHP qui gérera les données avant leur stockage dans la base de données.CakePHP 3: Comment le comportement gère-t-il plusieurs données?

Par exemple, j'ai ajouter les messages sous forme comme:

// Post title 
echo $this->Form->input('title',['value'=>'aaa']); 
// Post has many Photos (names) 
echo $this->Form->input('photos.0.name',['value'=>'zzz']); 
echo $this->Form->input('photos.1.name',['value'=>'hhh']); 
echo $this->Form->input('photos.2.name',['value'=>'fff']); 

PostsController:

public function add() 
{ 
    $post = $this->Posts->newEntity(); 
    if ($this->request->is('post')) { 
     $post = $this->Posts->patchEntity($post, $this->request->data); 

     if ($this->Posts->save($post)) { 
      $this->Flash->success(__('The post has been saved.')); 
      return $this->redirect(['action' => 'index']); 
     } else { 
      $this->Flash->error(__('The post could not be saved. Please, try again.')); 
     } 
    } 
    $this->set(compact('post')); 
    $this->set('_serialize', ['post']); 
} 

données du formulaire est correctement stocké dans une base de données.

Ensuite, je crée un nouveau comportement (par exemple, MyBehavoir) et l'attache à PhotosTable. Je veux récupérer tous les trois "nom" domaine, les traiter par exemple. convertir via la méthode ucfirst, et le renvoyer pour être stocké dans la base de données.

public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options) 
{ 
    $data['name'] = ucfirst($data['name']); 
    debug($data); 
} 
// debug return three outputs for every field 

object(ArrayObject) { 
    name => 'Zzz' // Hhh, Fff 
} 

Mais seul le premier résultat (Zzz) est sauvegardé.

Que dois-je faire pour enregistrer tous les champs après traitement dans Behavior?

En outre,

public function beforeSave(Event $event, Entity $entity) 
{ 
    debug($entity); 
    return true; 
} 

show de débogage uniquement les données à partir des premiers champs

object(App\Model\Entity\Photo) { 

    'name' => 'Zzz', 
    'post_id' => (int) 486, 
    ... 

Répondre

1

C'est un abus de la fonction beforeMarshall. Ce que vous devez faire est d'utiliser une méthode Entity Mutator pour définir la propriété comme vous le souhaitez avant qu'elle ne soit persistante. En créant une méthode telle que protected function _setName() dans votre PhotoEntity, vous pouvez modifier le nom avant la persistance de l'entité.

You can find out more about Entity Mutators in the book.

+0

Modification des données de demande avant la création d'entités Si vous devez modifier les données de demande avant qu'elles ne soient converties en entités, vous pouvez utiliser l'événement Model.beforeMarshal. Cet événement vous permet de manipuler les données de requête juste avant la création des entités: http://book.cakephp.org/3.0/fr/orm/saving-data.html#before-marshal – Salines

+1

Le regroupement est la conversion des données de requête en entités, vous vouloir changer les données d'entité. Peut-être que je n'ai pas expliqué, mais vous n'avez pas besoin de changer les données avant que les entités sont créées. Vous pouvez le faire à l'intérieur de l'entité. –

+0

Merci pour votre réponse, ma faute, je mets en afterSave méthode de sortie, et arrêter de stocker plusieurs données. J'ai l'habitude de mettre die ou de sortir après une fonction de débogage. Je ne connaissais pas le modèle et le comportement utilisé à plusieurs reprises lors du stockage de plusieurs données. – Salines