Bonjour à tous,

Je viens prendre conseil auprès de la communauté pour un problème de logique qui me fait avoir des cheveux blanc.

Je vous met dans le contexte:

Framework Cakephp(débutant).
Je suis entrain de développer un site dont une partie permet au client d'encoder des adresses associées à des disponibilités(heures d'ouvertures).

J'ai donc une table adresse pouvant avoir plusieurs disponibilités(0 à 5, les 5 jours ouvrables) et chaque disponibilité ne peut avoir qu'une adresse.
Pour ajouter une adresse, je fournis un formulaire "Addresses/add.ctp" qui est composé de tous les inputs liés à Addresses + cinq lignes d'inputs liés à Accessibilities.
Lorsque le client encode ses disponibilités, je souhaite enregistrer uniquement celles qu'il a remplies.
Jusque là, pas de problèmes...

Ensuite, ça se corse.
Supposons que le client remplit les lignes de disponibilités "Lundi, Mardi, Jeudi, Vendredi" lors de l'ajout et souhaite éditer l'adresse par après.
Pour éditer une adresse, je fournis un formulaire "Addresses/edit.ctp" qui est composé de tous les inputs liés à Addresses pré remplis avec les données de la DB
et cinq lignes d'inputs liés à Accessibilities.

Il me faut alors pré remplir et les lignes Accessibilities avec les données déjà enregistrées et fournir une ligne vierge pour les disponibilités de Mercredi qu'il avait laissé vide.


Je récupère les données venant de mon AddressesController via $this->data['Accessibility'] qui contient:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
array(
   (int) 0 => array(
      'id' => '80',
      'day' => '1',
      'from' => '10h00',
      'until' => '12h00',
      'from2' => '13h00',
      'until2' => '17h00',
      'remark' => '',
      'address_id' => '31'
   ),
   (int) 1 => array(
      'id' => '81',
      'day' => '2',
      'from' => '10h00',
      'until' => '12h00',
      'from2' => '13h00',
      'until2' => '17h00',
      'remark' => '',
      'address_id' => '31'
   ),
   (int) 2 => array(
      'id' => '83',
      'day' => '4',
      'from' => '10h00',
      'until' => '12h00',
      'from2' => '13h00',
      'until2' => '17h00',
      'remark' => '',
      'address_id' => '31'
   ),
   (int) 3 => array(
      'id' => '84',
      'day' => '5',
      'from' => '10h00',
      'until' => '12h00',
      'from2' => '13h00',
      'until2' => '17h00',
      'remark' => '',
      'address_id' => '31'
   )
)
Et voici ma tentative de générer un formulaire correcte(partie disponibilités du formulaire adresse):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
<?php
echo '<TABLE>';
for ($i = 0; $i <= 4; $i++) {
	$day = false;
	switch ($i) {
		case 0:
			$dayName = "Lundi";
			break;
		case 1:
			$dayName = "Mardi";
			break;
		case 2:
			$dayName = "Mercredi";
			break;
		case 3:
			$dayName = "Jeudi";
			break;
		case 4:
			$dayName = "Vendredi";
			break;
	}
	foreach ($this->data['Accessibility'] as $accessibility) {
		if ($accessibility['day'] == ($i + 1)) {
			$day = true;
			echo $this->Form->hidden('Accessibility.' . $i . '.day', array('default' => $accessibility['day']));
			echo $this->Form->hidden('Accessibility.' . $i . '.id', array('default' => $accessibility['id']));
			echo $this->Html->tableCells(array(
			    array($this->Form->Label($dayName),
				  $this->Form->input('Accessibility.' . $i . '.from', array('label' => false, 'default' => $accessibility['from'])),
				  $this->Form->input('Accessibility.' . $i . '.until', array('label' => false, 'default' => $accessibility['until'])),
				  $this->Form->input('Accessibility.' . $i . '.from2', array('label' => false, 'default' => $accessibility['from2'])),
				  $this->Form->input('Accessibility.' . $i . '.until2', array('label' => false, 'default' => $accessibility['until2'])),
				  $this->Form->input('Accessibility.' . $i . '.remark', array('label' => false, 'default' => $accessibility['remark']))
			    )
				  )
			);
		}
	}
	if (!$day) {
		echo $this->Form->hidden('Accessibility.' . $i . '.day', array('default' => $i + 1,));
		echo $this->Html->tableCells(array(
		    array($this->Form->Label($dayName),
			  $this->Form->input('Accessibility.' . $i . '.from', array('label' => false)),
			  $this->Form->input('Accessibility.' . $i . '.until', array('label' => false)),
			  $this->Form->input('Accessibility.' . $i . '.from2', array('label' => false)),
			  $this->Form->input('Accessibility.' . $i . '.until2', array('label' => false)),
			  $this->Form->input('Accessibility.' . $i . '.remark', array('label' => false))
		    )
			  )
		);
	}
}
echo '</TABLE>';
?>
Evidemment vu que mon tableau $this->data['Accessibility'] ne contient que 4 index, ca ne fonctionne pas.
Et il n'est pas possible de modifier ce tableau sinon erreur "Indirect modification of overloaded property View::$data has no effect".

Ca fait quelques heures que je tourne en rond et je ne vois toujours pas le bout du tunnel.
Temporairement je me suis résigné à enregistrer les disponibilités vide lors de l'ajout afin de ne pas être bloqué par ce problème mais ca me reste en travers de la gorge.

Je laisse la résolution de ce puzzle diabolique entre vos mains expertes.

A toutes.