From e7114fbf6efce4985ea9146e4664e12ee546c343 Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Sun, 29 May 2016 22:17:21 +0200 Subject: Equipements : allow multiple Equipements to be added at once.Unfinished Ipmgmt causes constraint violation if set for more than once Equipement. --- .../src/Controller/EquipementsController.php | 47 +++++-- .../src/Model/Table/EquipementsTable.php | 139 +++++++++++++++++++++ .../after-bake/src/Template/Equipements/add.ctp | 39 ++++++ 3 files changed, 218 insertions(+), 7 deletions(-) create mode 100644 generator/after-bake/src/Model/Table/EquipementsTable.php create mode 100644 generator/after-bake/src/Template/Equipements/add.ctp diff --git a/generator/after-bake/src/Controller/EquipementsController.php b/generator/after-bake/src/Controller/EquipementsController.php index 216fe64..a17a724 100644 --- a/generator/after-bake/src/Controller/EquipementsController.php +++ b/generator/after-bake/src/Controller/EquipementsController.php @@ -85,14 +85,46 @@ class EquipementsController extends AppController public function add() { $equipement = $this->Equipements->newEntity(); + if ($this->request->is('post')) { - $equipement = $this->Equipements->patchEntity($equipement, $this->request->data); - if ($this->Equipements->save($equipement)) { - $this->Flash->success(__('The equipement has been saved.')); - return $this->redirect(['action' => 'index']); - } else { - $this->Flash->error(__('The equipement could not be saved. Please, try again.')); - } + // Expand the form data into an array of items for each MAC + $data = array(); + $mac_list = explode("\n", $this->request->data['mac']); + $mac_list = array_map('trim', $mac_list); + //debug($mac_list); + foreach ( $mac_list as $mac ) { + $item = $this->request->data; + $item['mac'] = $mac; + $data[] = $item; + } + //debug($data); + + // Save all in one transaction + // http://book.cakephp.org/3.0/en/orm/saving-data.html#converting-multiple-records + $entities = $this->Equipements->newEntities($data); + //debug($entities); + $all_ok = true; + $this->Equipements->connection()->transactional( function () use ($entities, &$all_ok) { + foreach ($entities as $entity) { + if ( ! $this->Equipements->save($entity, ['atomic' => false]) ) { + $all_ok = false; + } + } + return $all_ok; + }); + //debug($all_ok); + + if ( $all_ok ) { + $this->Flash->success(__('Equipements has been all saved.')); + //return $this->redirect(['action' => 'index']); + } else { + // Merge entities.N.[errors] in equipement.[errors] + foreach( $entities as $entity ) { + $equipement->errors( $entity->errors() ); + } + //debug($equipement); + $this->Flash->error(__('At least one Equipement is invalid. None Saved.')); + } } $equipements = $this->Equipements->Equipements->find('list')->order('mac'); $services = $this->Equipements->Services->find('list')->order(['service_type_id', 'adherent_id', 'id']); @@ -102,6 +134,7 @@ class EquipementsController extends AppController $equipementModes = $this->Equipements->EquipementModes->find('list'); $relais = $this->Equipements->Relais->find('list'); $this->set(compact('equipement', 'equipements', 'services', 'ipmgmt', 'equipementModeles', 'equipementModes', 'relais')); + //$this->set(compact('entities')); $this->set('_serialize', ['equipement']); } diff --git a/generator/after-bake/src/Model/Table/EquipementsTable.php b/generator/after-bake/src/Model/Table/EquipementsTable.php new file mode 100644 index 0000000..f5e2f05 --- /dev/null +++ b/generator/after-bake/src/Model/Table/EquipementsTable.php @@ -0,0 +1,139 @@ +table('equipements'); + $this->displayField('title'); + $this->primaryKey('id'); + + $this->addBehavior('Search.Search'); + + $this->belongsTo('Equipements', [ + 'foreignKey' => 'uplink_id' + ]); + $this->belongsTo('Services', [ + 'foreignKey' => 'service_id' + ]); + $this->belongsTo('EquipementModeles', [ + 'foreignKey' => 'equipement_modele_id', + 'joinType' => 'INNER' + ]); + $this->belongsTo('Ipmgmt', [ + 'foreignKey' => 'ipmgmt_id' + ]); + $this->belongsTo('Relais', [ + 'foreignKey' => 'relais_id' + ]); + $this->belongsTo('EquipementModes', [ + 'foreignKey' => 'equipement_mode_id', + 'joinType' => 'INNER' + ]); + } + /** + * Search plugin queries configuration + */ + public function searchConfiguration() + { + $search = new Manager($this); + $search + ->like('q', [ + 'before' => true, + 'after' => true, + 'field' => [$this->aliasField('mac'), $this->aliasField('ipmgmt_id'), $this->aliasField('hostname')] + ]) + ->value('equipement_modele_id', [ 'field' => $this->aliasField('equipement_modele_id')]) + ->value('relais_id', [ 'field' => $this->aliasField('relais_id')]); + return $search; + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->add('id', 'valid', ['rule' => 'numeric']) + ->allowEmpty('id', 'create'); + + $validator + ->requirePresence('mac', 'create') + ->notEmpty('mac') + ->add('mac', 'validFormat',[ + 'rule' => array('custom', '/^[0-9A-F]{2}(:[0-9A-F]{2}){5}$/'), + 'message' => 'Please use XX:XX:XX:XX:XX:XX MAC format.' + ]) + ->add('mac', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']); + + $validator + ->requirePresence('hostname', 'create') + ->notEmpty('hostname'); + + $validator + ->allowEmpty('description'); + + $validator + ->add('date_achat', 'valid', ['rule' => 'date']) + ->allowEmpty('date_achat'); + + $validator + ->add('date_hs', 'valid', ['rule' => 'date']) + ->allowEmpty('date_hs'); + + $validator + ->allowEmpty('notes'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->isUnique(['mac'])); + $rules->add($rules->existsIn(['ipmgmt_id'], 'Ipmgmt')); + $rules->add($rules->existsIn(['uplink_id'], 'Equipements')); + $rules->add($rules->existsIn(['service_id'], 'Services')); + $rules->add($rules->existsIn(['equipement_modele_id'], 'EquipementModeles')); + $rules->add($rules->existsIn(['relais_id'], 'Relais')); + $rules->add($rules->existsIn(['equipement_mode_id'], 'EquipementModes')); + return $rules; + } +} diff --git a/generator/after-bake/src/Template/Equipements/add.ctp b/generator/after-bake/src/Template/Equipements/add.ctp new file mode 100644 index 0000000..c2516cd --- /dev/null +++ b/generator/after-bake/src/Template/Equipements/add.ctp @@ -0,0 +1,39 @@ + +
+ Form->create($equipement) ?> +
+ + Form->input('uplink_id', ['options' => $equipements, 'empty' => true]); + //echo $this->Form->input('service_id', ['options' => $services, 'empty' => true]); + //echo $this->Form->input('mac'); + echo $this->Form->input('mac', ['type'=>'textarea', 'rows'=>10, 'maxlength'=>2000]); + echo $this->Form->input('hostname'); + echo $this->Form->input('equipement_modele_id', ['options' => $equipementModeles]); + echo $this->Form->input('ipmgmt_id', ['options' => $ipmgmt, 'empty' => true]); + //echo $this->Form->input('relais_id', ['options' => $relais, 'empty' => true]); + echo $this->Form->input('equipement_mode_id', ['options' => $equipementModes]); + //echo $this->Form->input('description'); + echo $this->Form->input('date_achat', ['empty' => true, 'default' => '']); + //echo $this->Form->input('date_hs', ['empty' => true, 'default' => '']); + echo $this->Form->input('notes'); + ?> +
+ Form->button(__('Submit')) ?> + Form->end() ?> +
-- cgit v1.1