IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Formulaire edit permettant l'ajout(cakephp/view)


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4
    Par défaut Formulaire edit permettant l'ajout(cakephp/view)
    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.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ré-arrange ton tableau de données par jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($this->data['Accessibility'] as $accessibility) { 
    $tblData[$accessibility['day']] = $accessibility
    }
    Et ensuite quand tu construis ton tableau, tu n'as plus qu'a afficher les données si elles existent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for ($i = 1; $i < 6; $i++) {
    if (isset($tblData[$i])) {
       echo .....
    }
    else {
       echo .....
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4
    Par défaut
    Je ne pense pas que cette solution va fonctionner car étant donné que je ne peux pas modifier "$this->data", je dois garder les index des accessibilités à la bonne place.

    Par contre, tu m'as mis sur la voie, je crois qu'en ré-arrangeant le tableau dans "$tblData" tout en gardant les mêmes index pour chaque données et en ajoutant les accessibilités manquantes avec juste le jour pré-encodé en fin de tableau.
    Je pourrais afficher afficher les accessibilités dans l'ordre en fonction du jour, tout en gardant les index en bonne position sans risque d'écraser les données.

    Je testerai ça quand j'aurai le temps.

    Merci pour le conseil .

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Dans mon exemple, je ne modifie pas $this->data.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. Creation d'un formulaire permettant d'ajouter des information dans une autre fenêtre
    Par @rno0059 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 22/06/2007, 07h47
  2. Réponses: 4
    Dernier message: 12/12/2006, 12h30
  3. Applet Java permettant d'ajouter des fichiers
    Par skrime dans le forum Applets
    Réponses: 6
    Dernier message: 16/11/2006, 01h05
  4. Une fonction qui permette d'ajouter des séparateurs...
    Par Empty_body dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/04/2006, 13h23
  5. Réponses: 22
    Dernier message: 07/12/2005, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo