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

Symfony PHP Discussion :

Affichage de données dans un form embarqué


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut Affichage de données dans un form embarqué
    Voila j'ai un module admin avec un form embarqué.
    Hors je ne désire pas que l'utilisateur puisse modifier tout les champs mais seulement certains d'entre eux dans le sous formulaire.
    La methode read-only dans le configure du form embarqué ne me plait pas trop, mais la solution $form->getObject()->getValue() ne fonctionne pas dans un embed form.

    Y a t il une autre solution ?

    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 use_stylesheets_for_form($form) ?>
    <?php use_javascripts_for_form($form) ?>
     
    <div class="sf_admin_form">
      <?php echo form_tag_for($form, '@groupasset') ?>
        <?php echo $form->renderHiddenFields(false) ?>
     
        <?php if ($form->hasGlobalErrors()): ?>
          <?php echo $form->renderGlobalErrors() ?>
        <?php endif; ?>
     
    <?php 
    	$infoGal='<table>';
    	foreach($form as $key=>$widget)
    	{
    		if($key=='listAsset'){
    			$listAsset = '<table>';            			              
    			foreach($widget as $subKey=>$subForm){				
    				//echo '<tr><td>'.$subKey.'</td>';				
    				$listAsset.='<tr>';
    $ob=$subForm->getObject()	//********* cette ligne ne fonctionne pas *********/			
    if($subKey==1)
    				{
    					$listAsset.= '<td>&nbsp;</td>';
    					foreach($subForm as $field)
    					{
    						if(!$field->isHidden()) $listAsset.= '<td>'.$field->renderLabel().'</td>';
    					}
    					$listAsset.= '</tr>';
    				}
    				foreach($subForm as $field){
     
    					$listAsset.= '<td>'.$field->render().'<br>'.$field->renderError().'</td>';
    				}
    				$listAsset.= '</tr>';
    			}
    			$listAsset.= '</table>';
    		}
    		elseif(!$widget->isHidden())
    		{
    			$infoGal.= $widget->renderRow();
    		}
    	}
    	$infoGal.='</table>';	
    ?>
    	<table>
    		<tr>
    			<td><?php echo $infoGal ?> </td>
    			<td><?php echo $listAsset ?></td>
    		</tr>
    	</table>
        <?php include_partial('groupasset/form_actions', array('groupasset' => $groupasset, 'form' => $form, 'configuration' => $configuration, 'helper' => $helper)) ?>
      </form>
    </div>

  2. #2
    Membre éprouvé

    Homme Profil pro
    Software Engineer
    Inscrit en
    Août 2004
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 173
    Par défaut
    Si on suppose que ton embedForm est imbriqué dans le form principal via le nom "listAsset"

    Si relation 1-1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    <?php echo $form['listAsset']['widget1'] ?>
    <?php echo $form['listAsset']['widget2'] ?>
     
    <?php // affichage d'une valeur ?>
    <?php echo $form->getObject()->getListAsset()->getXXX() ?>
    Si relation 1-n

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    <?php foreach($form['listAssets'] as $key => $fieldSchema ?>
     
      <?php echo $fieldSchema['widget1'] ?>
      <?php echo $fieldSchema['widget2'] ?>
     
      <?php // affichage d'une valeur ?>
      <?php echo $form->getObject()->getListAssets()->get($key)->getXXX()?>
     
    <?php endforeach; ?>
    Version rapide, pour expliquer le principe.

  3. #3
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    ATTENTION !

    Le readonly en HTML utilisé de cette manière n'empêche pas que les données soient modifiée par un utilisateur un tant soit peux averti. En effet, elles partent chez l'utilisateur et revienne et son validée par un validateur (essaye de le retirer pour voir !). Donc, si une personne intercepte le paquet POST avant qu'il ne quitte le poste et le modifie, ta valeur en readonly, est est en writeaussi

    Il faut faire le formulaire à la main et afficher les valeurs plutôt qu'un champ. Ensuite, il faut retirer le validateur du form pour éviter toute entrée d'information. (et si non, il va crier vu que la donnée, elle ne revient plus).

    Voir ici un petit article.

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    tout a fait Michel, j'ai lu ton article.
    Sauf que la c'est un embed Form dans un admin form, donc un poil plus complexe et je trouvais intelligent d'afficher juste les valeurs, et de unset les champs ciblés puisque de toute façon ce sont des champs qui ne seront jamais à mettre a jour via l'interface.

    Si vivian ne s'est pas trompé j'appelai l'object un niveau hiérarchique un poil en dessous. Je teste et je reviens

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    bon j'ai un comportement bizarre, quand j'ai plusieurs "sous enregistrement" ici 2;
    Il m'affiche les valeurs de la ligne 2 mais les champs de la ligne 1 et à la ligne 2 je n'ai pas de valeur affiché mais bien les champs du deuxième enregistrement .
    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
    56
     
    <?php use_stylesheets_for_form($form) ?>
    <?php use_javascripts_for_form($form) ?>
     
    <div class="sf_admin_form">
      <?php echo form_tag_for($form, '@groupasset') ?>
        <?php echo $form->renderHiddenFields(false) ?>
     
        <?php if ($form->hasGlobalErrors()): ?>
          <?php echo $form->renderGlobalErrors() ?>
        <?php endif; ?>
     
    <?php 
    	$infoGal='<table>';
    	$listAsset='<table>';
    	foreach($form as $widgetName=>$widgetschema)
    	{
    		if ($widgetName!='listasset')
    		{
    			if(!$widgetschema->isHidden()) $infoGal.= $widgetschema->renderRow();
    		}
    		else
    		{	
    			$listAsset.= '<tr><td>&nbsp;</td><td>Type</td><td>value</td>';		
    			foreach($form['listasset'][1] as $field)
    			{
    				if(!$field->isHidden()) $listAsset.= '<td>'.$field->renderLabel().'</td>';
    			}
    			$listAsset.= "</tr>\n";
    			foreach($widgetschema as $assetNum=>$subForm){												
    				$asset = $form->getObject()->getListGroupAsset()->get($assetNum);
     
    				$listAsset.='<tr>
    								<td>'.$assetNum.'</td><td>'.$asset->getType().'</td><td>'.$asset->getValue().'</td>';				
     
    				foreach($subForm as $field){
     
    					$listAsset.= '<td>'.$field->render().'<br>'.$field->renderError().'</td>';
    				}
    				$listAsset.= "</tr>\n";
    			}
    			$listAsset.= '</table>';
    		}
     
    	}
    	$infoGal.='</table>';	
    ?>
    	<table>
    		<tr>
    			<td><?php echo $infoGal ?> </td>
    			<td><?php echo $listAsset ?></td>
    		</tr>
    	</table>
        <?php include_partial('groupasset/form_actions', array('groupasset' => $groupasset, 'form' => $form, 'configuration' => $configuration, 'helper' => $helper)) ?>
      </form>
    </div>
    le getListGroupAsset() vient de mon schema, c'est mon ForeignAlias, un getListasset qui irait récuperer les différents embed form ne marche pas.
    mon configure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $wrapperForm=new sfForm();
     
        $listasset = $this->getObject()->getListActiveGroupAsset();
        $i=0;
        foreach($listasset as $asset)
        {
        	$i++;
        	$assetForm = new AssetForm($asset);
        	unset($assetForm['groupasset_id']);
        	$wrapperForm->embedForm($asset->getId(),$assetForm);
     
    	}
    	$this->embedForm('listasset',$wrapperForm);

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Je passe vite et j'espère ne pas répondre à côté.

    Dans un form, il faut utiliser les nom des sous objets déclarés dans le form (le embed) et non les objets du modèle. Je ne sais pas pourquoi j'ai l'impression d'y être, à côté.

    Tu peux aussi faire un nouveau widget qui hérite de sfWidget et pour lequel tu redéfini la méthode render. Méthode qui retournera de quoi afficher et non pas un champ. Un peu plus lourd (quoique) mais très réutilisable.

Discussions similaires

  1. [AC-2010] Mise en forme de l'affichage des données dans une liste de choix déroulante
    Par Nephi dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 17/09/2010, 13h40
  2. Affichage des données dans un état
    Par puppusse79 dans le forum Access
    Réponses: 8
    Dernier message: 07/04/2006, 16h36
  3. [VB.NET] affichage de données dans un combobox
    Par lou87 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/02/2006, 10h25
  4. Affichage de donnée dans une page
    Par leloup84 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 21/02/2006, 17h54
  5. Réponses: 3
    Dernier message: 11/01/2006, 17h44

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