summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <ludovic@pouzenc.fr>2016-05-29 22:17:21 +0200
committerLudovic Pouzenc <ludovic@pouzenc.fr>2016-05-29 22:17:21 +0200
commite7114fbf6efce4985ea9146e4664e12ee546c343 (patch)
tree3fe53236f490e1ef71b2cf9d71ef31bea359c314
parenta7889db127f8c15a6609ed2344e94d0a9f068a9e (diff)
downloadchd_gestion-e7114fbf6efce4985ea9146e4664e12ee546c343.zip
chd_gestion-e7114fbf6efce4985ea9146e4664e12ee546c343.tar.gz
chd_gestion-e7114fbf6efce4985ea9146e4664e12ee546c343.tar.bz2
Equipements : allow multiple Equipements to be added at once.Unfinished
Ipmgmt causes constraint violation if set for more than once Equipement.
-rw-r--r--generator/after-bake/src/Controller/EquipementsController.php47
-rw-r--r--generator/after-bake/src/Model/Table/EquipementsTable.php139
-rw-r--r--generator/after-bake/src/Template/Equipements/add.ctp39
3 files changed, 218 insertions, 7 deletions
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 @@
+<?php
+namespace App\Model\Table;
+
+use App\Model\Entity\Equipement;
+use Cake\ORM\Query;
+use Cake\ORM\RulesChecker;
+use Cake\ORM\Table;
+use Cake\Validation\Validator;
+use Search\Manager;
+
+/**
+ * Equipements Model
+ *
+ *
+ * @property \Cake\ORM\Association\BelongsTo $Equipements
+ * @property \Cake\ORM\Association\BelongsTo $Services
+ * @property \Cake\ORM\Association\BelongsTo $EquipementModeles
+ * @property \Cake\ORM\Association\BelongsTo $Ipmgmt
+ * @property \Cake\ORM\Association\BelongsTo $Relais
+ * @property \Cake\ORM\Association\BelongsTo $EquipementModes
+ */
+class EquipementsTable extends Table
+{
+
+ /**
+ * Initialize method
+ *
+ * @param array $config The configuration for the Table.
+ * @return void
+ */
+ public function initialize(array $config)
+ {
+ parent::initialize($config);
+
+ $this->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 @@
+<nav class="large-2 medium-3 columns" id="actions-sidebar">
+ <ul class="side-nav">
+ <li class="heading"><?= __('Actions') ?></li>
+ <li><?= $this->Html->link(__('List Equipements'), ['action' => 'index']) ?></li>
+ <li><?= $this->Html->link(__('List Equipements'), ['controller' => 'Equipements', 'action' => 'index']) ?></li>
+ <li><?= $this->Html->link(__('New Equipement'), ['controller' => 'Equipements', 'action' => 'add']) ?></li>
+ <li><?= $this->Html->link(__('List Services'), ['controller' => 'Services', 'action' => 'index']) ?></li>
+ <li><?= $this->Html->link(__('New Service'), ['controller' => 'Services', 'action' => 'add']) ?></li>
+ <li><?= $this->Html->link(__('List Equipement Modeles'), ['controller' => 'EquipementModeles', 'action' => 'index']) ?></li>
+ <li><?= $this->Html->link(__('New Equipement Modele'), ['controller' => 'EquipementModeles', 'action' => 'add']) ?></li>
+ <li><?= $this->Html->link(__('List Ipmgmt'), ['controller' => 'Ipmgmt', 'action' => 'index']) ?></li>
+ <li><?= $this->Html->link(__('New Ipmgmt'), ['controller' => 'Ipmgmt', 'action' => 'add']) ?></li>
+ <li><?= $this->Html->link(__('List Relais'), ['controller' => 'Relais', 'action' => 'index']) ?></li>
+ <li><?= $this->Html->link(__('New Relais'), ['controller' => 'Relais', 'action' => 'add']) ?></li>
+ </ul>
+</nav>
+<div class="equipements form large-10 medium-9 columns content">
+ <?= $this->Form->create($equipement) ?>
+ <fieldset>
+ <legend><?= __('Add Equipement') ?></legend>
+ <?php
+ //echo $this->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');
+ ?>
+ </fieldset>
+ <?= $this->Form->button(__('Submit')) ?>
+ <?= $this->Form->end() ?>
+</div>