[symfony] 1 champ : formulaire soumis, 2 champs : formulaire pas soumis...

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 sept. 2008, 20:23

Salut

voici un problème vraiment bizarre, qui doit tenir à une broutille mais que je ne localise décidément pas...

J'ai un petit formulaire généré par symfony :
	<!-- formulaire -->
<?php echo form_tag('apprenants/search', array(
  'id'        => 'sf_admin_edit_form',
  'name'      => 'sf_admin_edit_form',
  'multipart' => true,
  'onsubmit'  => 'double_list_submit(); return true;'
));

echo input_hidden_tag('executerRecherche', 1);
?>
	<fieldset id="sf_fieldset_identit__" class="">
		<h2><?php echo __('Critères de recherche') ?></h2>
		<div class="form-row">
		  Nom :
		  <div class="content<?php if ($sf_request->hasError('alpha_apprenants{nom_apprenant}')): ?> form-error<?php endif; ?>">
		  <?php if ($sf_request->hasError('alpha_apprenants{nom_apprenant}')): ?>
		    <?php echo form_error('alpha_apprenants{nom_apprenant}', array('class' => 'form-error-msg')) ?>
		  <?php endif; ?>
		
		  <?php $value = object_input_tag($alpha_apprenants, 'getNomApprenant', array (
		  'size' => 50,
		  'control_name' => 'alpha_apprenants[nom_apprenant]',
		)); echo $value ? $value : '&nbsp;' ?>
		    </div>
		</div>  
	</fieldset>
    <div>
    	<ul class="sf_admin_actions">
	    <li>
	    <?php echo button_to(__('Lancer la recherche'), 'apprenants/search', array (
	  'class' => 'sf_admin_action_search',)) ?>
	  	</li>
	 </ul>
	</div>
</form>
HTML généré :
<!-- formulaire -->
<form id="sf_admin_edit_form" name="sf_admin_edit_form" onsubmit="double_list_submit(); return true;" method="post" enctype="multipart/form-data" action="/croixrouge/web/backend_dev.php/apprenants/search"><input type="hidden" name="executerRecherche" id="executerRecherche" value="1" />	<fieldset id="sf_fieldset_identit__" class="">
		<h2>Critères de recherche</h2>

		<div class="form-row">
		  Nom :
		  <div class="content">
		  		
		  <input type="text" name="alpha_apprenants[nom_apprenant]" id="alpha_apprenants_nom_apprenant" value="" size="50" />		    </div>
		</div>
	</fieldset>
    <div>
    	<ul class="sf_admin_actions">
	    <li>

	    <input class="sf_admin_action_search" value="Lancer la recherche" type="button" onclick="document.location.href='/croixrouge/web/backend_dev.php/apprenants/search';" />	  	</li>
	 </ul>
	</div>
</form>
On a donc un champ texte "Nom", pour rechercher une personne suivant son nom, et un champ caché qui passe la variable "executerRecherche" à true, puisque l'affichage du formulaire et le traitement de la recherche sont pris en charge par la même méthode :
public function executeSearch() {
		$executerRecherche = $this->getRequest()->getParameter('executerRecherche');
		if ($executerRecherche) {
			$alpha_apprenant = $this->getRequest()->getParameter('alpha_apprenants');
			$nomApprenant = $alpha_apprenant['nom_apprenant'];
			
			[...]
			
		}
}
Là, tout va bien, je récupère ma variable "executerRecherche", elle est à true, je rentre dans la condition, je récupère le nom, je fais la recherche, c'est top, ça marche.
parameterHolder:
action: search
alpha_apprenants: { nom_apprenant: toto }
executerRecherche: '1'
module: apprenants
Maintenant je veux chercher aussi sur le prénom. Je rajoute donc un champ "Prénom", qui est le c/c de mon champ "Nom", sauf que je rajoute "Pre" partout où il le faut :
	<!-- formulaire -->
<?php echo form_tag('apprenants/search', array(
  'id'        => 'sf_admin_edit_form',
  'name'      => 'sf_admin_edit_form',
  'multipart' => true,
  'onsubmit'  => 'double_list_submit(); return true;'
));

echo input_hidden_tag('executerRecherche', 1);
?>
	<fieldset id="sf_fieldset_identit__" class="">
		<h2><?php echo __('Critères de recherche') ?></h2>
		<div class="form-row">
		  Nom :
		  <div class="content<?php if ($sf_request->hasError('alpha_apprenants{nom_apprenant}')): ?> form-error<?php endif; ?>">
		  <?php if ($sf_request->hasError('alpha_apprenants{nom_apprenant}')): ?>
		    <?php echo form_error('alpha_apprenants{nom_apprenant}', array('class' => 'form-error-msg')) ?>
		  <?php endif; ?>
		
		  <?php $value = object_input_tag($alpha_apprenants, 'getNomApprenant', array (
		  'size' => 50,
		  'control_name' => 'alpha_apprenants[nom_apprenant]',
		)); echo $value ? $value : '&nbsp;' ?>
		    </div>
		</div>		
		<div class="form-row">
		  Prénom :
		  <div class="content<?php if ($sf_request->hasError('alpha_apprenants{prenom_apprenant}')): ?> form-error<?php endif; ?>">
		  <?php if ($sf_request->hasError('alpha_apprenants{prenom_apprenant}')): ?>
		    <?php echo form_error('alpha_apprenants{prenom_apprenant}', array('class' => 'form-error-msg')) ?>
		  <?php endif; ?>
		
		  <?php $value = object_input_tag($alpha_apprenants, 'getPrenomApprenant', array (
		  'size' => 50,
		  'control_name' => 'alpha_apprenants[prenom_apprenant]',
		)); echo $value ? $value : '&nbsp;' ?>
		    </div>
		</div>	    
	</fieldset>
    <div>
    	<ul class="sf_admin_actions">
	    <li>
	    <?php echo button_to(__('Lancer la recherche'), 'apprenants/search', array (
	  'class' => 'sf_admin_action_search',)) ?>
	  	</li>
	 </ul>
	</div>
</form>
Ce code génère ça :
<!-- formulaire -->
<form id="sf_admin_edit_form" name="sf_admin_edit_form" onsubmit="double_list_submit(); return true;" method="post" enctype="multipart/form-data" action="/croixrouge/web/backend_dev.php/apprenants/search"><input type="hidden" name="executerRecherche" id="executerRecherche" value="1" />	<fieldset id="sf_fieldset_identit__" class="">
		<h2>Critères de recherche</h2>

		<div class="form-row">
		  Nom :
		  <div class="content">
		  		
		  <input type="text" name="alpha_apprenants[nom_apprenant]" id="alpha_apprenants_nom_apprenant" value="" size="50" />		    </div>
		</div>		
		<!-- CHAMP PRENOM RAJOUTE ET QUI CASSE TOUT -->
		<div class="form-row">
		  Prénom :
		  <div class="content">
		  		
		  <input type="text" name="alpha_apprenants[prenom_apprenant]" id="alpha_apprenants_prenom_apprenant" value="" size="50" />		    </div>

		</div>
		<!-- FIN CHAMP PRENOM RAJOUTE ET QUI CASSE TOUT -->
	</fieldset>
    <div>
    	<ul class="sf_admin_actions">
	    <li>
	    <input class="sf_admin_action_search" value="Lancer la recherche" type="button" onclick="document.location.href='/croixrouge/web/backend_dev.php/apprenants/search';" />	  	</li>
	 </ul>
	</div>
</form>
Et bien là, si je fais "Entrée" quand je suis dans le champ "Nom", ça ne soumet plus le formulaire, je dois cliquer sur le bouton. Quand je clique sur le bouton, ça ne soumet plus le formulaire, si je regarde dans la barre de debug SF je n'ai rien dans request, je comprends pas...
parameterHolder:
action: search
module: apprenants
Si quelqu'un a une idée, ou si j'ai fait une débilité qui vous saute aux yeux répondez moi vite je n'en peux plus :P

Je mets dans la rubrique HTML car le problème semble être côté formulaire, on déplacera éventuellement quand quelqu'un aura trouvé la solution 8-)

Merci bien d'avance

ViPHP
ViPHP | 2287 Messages

29 sept. 2008, 03:47

C'est normal si tu jettes un oeil du côté du bouton de recherche (qui est donc censée être l'action de validation par défaut de ton formulaire) :
<input class="sf_admin_action_search" value="Lancer la recherche" type="button" onclick="document.location.href='/croixrouge/web/backend_dev.php/apprenants/search';" />
Remarque qu'il est de type button (c'est normal pour le helper button_to()) et non de type submit.

Pour une raison qui m'échappe le browser arrive à soumettre automatiquement lors de l'appui de la touche ENTER un formulaire (form.submit() hein) qui a un seul champ et aucun bouton submit. Par contre il n'y arrive plus quand le formulaire contient plusieurs champs "actifs".

La solution est toute simple : transforme le bouton en type="submit"... Pour la redirection vers l'url choisie, laisse faire l'attribut action du <form>. Et le tour est joué, la touche enter joue bien son rôle ;-)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

29 sept. 2008, 07:19

Exact Calimero. La touche Enter déclenche le submit du formulaire si on est sur la dernière zone entrée en l'absence d'un bouton submit cliquable. Ce qui est le cas car il n'y a pas de bouton submit dans le script de notre ami.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

29 sept. 2008, 14:25

C'était bien ça... je n'étais pas au courant de ce truc :roll:

Un très grand merci :P