Allow to remove all fields of a form except a given list:
public function unsetAllExcept($fields = array()) { foreach($this->getObject()->toArray(BasePeer::TYPE_FIELDNAME) as $key => $val) { $tmp[] = strtolower($key); } $tmp = array_diff($tmp, $fields); foreach($tmp as $value) { unset($this[$value]); } }
Remove created_at, updated_at ...
$this->unsetAllExcept(array('comment'));
public function allowExtraFields() { $this->validatorSchema->setOption('allow_extra_fields', true); }
public function getFields() { return array_keys($this->widgetSchema->getFields()); }
Ici on est dans un cas ou:
- On a 2 radio-box par ligne (et seulement 2)
- Au moins l'une des 2 radio-box doit être sélectionnée
- Si erreur on met le focus sur la 1ère radio du champ
- Si erreur on affiche un message d'erreur à partir du texte d'un div caché
function control_questionnaire() { checked = false; jQuery(":radio:even", form).each ( function(intIndex) { radio = jQuery(this); checked = jQuery(":radio[@name='" + radio.attr('name') + "']:checked", form).size(); if (checked == false) { radio.focus(); showFocus(jQuery("#anim_" + radio.attr('id'))); alert(jQuery("#control_" + radio.attr('id')).html()); return false; } } ); if (checked) { jQuery('#loading-indicator').show(); jQuery('#diag-form').submit(); } }
Cette fois ci on est dans un cas ou:
- On a un nombre de questions quelconque
- On a un nombre de réponses quelconque, chaque réponse étant représentée par une checkbox
- On peut cocher plusieurs réponses par question
- Au moins l'une des checkbox doit être sélectionnée
- Si erreur on met le focus sur la 1ère checkbox du champ
- Si erreur on affiche un message d'erreur à partir du texte d'un div caché
function control_questionnaire_complexe() { checked = false; name = ''; jQuery(":checkbox", form).each ( function(intIndex) { checkbox = jQuery(this); // Controle si seulement on a pas deja controle le groupe de checkbox if (name != checkbox.attr('name')) { checked = jQuery(":checkbox[@name='" + checkbox.attr('name') + "']:checked", form).size(); if (checked == false) { checkbox.focus(); answer_id = checkbox.attr('id').split('_'); showFocus(jQuery("#anim_" + answer_id[0])); alert(jQuery("#control_" + answer_id[0]).html()); return false; } name = checkbox.attr('name'); } } ); if (checked) { jQuery('#loading-indicator').show(); jQuery('#diag-form').submit(); } }
Tiré de l'article http://www.miximum.fr/methodes-et-outils/104-mixons-des-formulaires-avec-symfony
public function updateObject() { parent::updateObject(); $address = $this->getObject()->getAddress(); $values = $this->getValues(); $address->fromArray($values['address'], BasePeer::TYPE_FIELDNAME); $address->save(); return $this->object; }
<?php /** * Form to add a classified ad. * * @author loic.vernet * @since 7 august 08 * * @package form */ class qbNewThreadForm extends qbThreadForm { // Default mask to create fields names public static $main_fields_name = 'qb_thread'; // Default labels protected $labels = array( // Thread 'title' => 'Sujet', 'category_id' => 'Forum', // Contact form 'qb_post' => 'Post', ); // Default fields to keep protected $fields_to_keep = array( // Thread 'id', 'category_id', // Post 'qb_post', ); // Liste of field that can't be modified by direct input values protected static $protected_fields = array( ); /** * Configuration of form. */ public function configure() { // Build widgets $this->setWidgetOptions(); // Set wdigets $this->processWidgets(); // Set validators $this->processValidators(); // Embed other forms $this->embedForms(); } /** * Set generic options for widgets. * * @author loic.vernet * @since */ protected function setWidgetOptions() { // name format $this->widgetSchema->setNameFormat(self::$main_fields_name. '[%s]'); // Set labels $this->setLabels($this->labels); // Allow extra fields for all forms $this->allowExtraFields(); } /** * set all widgets. * * @author loic.vernet * @since */ public function processWidgets() { $this->removeAllFieldsExcept($this->fields_to_keep); $this->widgetSchema['category_id'] = new sfWidgetFormPropelSelect( array( 'model' => 'qbCategory', 'add_empty' => false, //'criteria' => ipAdBasePeer::getCategoriesCriteria() )); $this->widgetSchema['title'] = new sfWidgetFormInput(); } /** * Set all validators. * * @author loic.vernet * @since */ public function processValidators() { $this->validatorSchema['category_id'] = new sfValidatorString( array('required' => true), array('required' => 'Veuillez choisir un forum') ); $this->validatorSchema['title'] = new sfValidatorString( array('required' => true), array('required' => 'Veuillez choisir un titre pour le sujet') ); } /** * Embed other forms to the current form. * * @author loic.vernet * @since */ protected function embedForms() { } }
[Edit 20081017: Ajout affichage des erreurs globales]
<?php /*@var $form qbNewThreadForm */ ?> <?php qb_forum_add_style(); echo qb_include_resources(); ?> <h1><?php echo $forum->getTitle(); ?></h1> <h2>Création d'une nouvelle discussion</h2> <?php include_partial('forum/breadcrumb', array('forum_root' => $forum)); ?> <?php if ($form->hasGlobalErrors()): ?> <?php echo $form->renderGlobalErrors(); ?> <?php endif; ?> <div class="thread-edit"> <div id="thread-edit-bb-tools" class="cadre"> Outils de mise en page </div> <div id="thread-edit-title" class="cadre"> <?php echo $form['title']->renderLabel(); ?> <?php echo $form['title']->renderError(); ?> <?php echo $form['title']->render(); ?> </div> <div id="thread-edit-forum" class="cadre"> <?php echo $form['category_id']->renderLabel(); ?> <?php echo $form['category_id']->renderError(); ?> <?php echo $form['category_id']->render(); ?> </div> <div id="thread-edit-bb-code" class="cadre"> </div> <div id="thread-edit-files" class="cadre"> Fichiers joints </div> <div id="thread-edit-options" class="cadre"> Options </div> <div id="thread-edit-tone" class="cadre"> Ton du message </div> </div> <?php // echo $form; ?>
/** * Ad publication form for the users. * * @todo : Eventually save posted datas in session to be able to retrieve * values even when changer the main category of the ad. */ public function executePost($request) { // Default ad_base object $ad_base = $this->getAdBaseOrCreate($request); // Secure edition if (!$ad_base->isNew()) { $this->forward404Unless($ad_base && ($ad_base->getIpAdContact()->getCreatedBy() == $this->getUser()->getId())); } // Form and params $ip_ad_base_post = $request->getParameter('ip_ad_base'); $form = new ipAdPostForm($ad_base, $ip_ad_base_post); $category_refresh = isset($ip_ad_base_post['category_refresh']) ? $ip_ad_base_post['category_refresh'] : 0; // Refresh category and save submitted form values (without input validation) if ($category_refresh) { $ip_ad_base_post['category_refresh'] = 0; $form->setDefaults($ip_ad_base_post); } // Post and save form if (!$category_refresh && $this->isPost() && $ip_ad_base_post) { $form->bind($ip_ad_base_post, $request->getFiles('ip_ad_base')); if ($form->isValid()) { $form->save(); // Photo deletion if ($delete_flag = $form->hasDeletePhotoFlag() && !$ad_base->isNew()) { $ad_base->deletePhoto(); } // Photo upload if (!$delete_flag && $form->hasPhoto()) { $form->saveAndUploadPhoto($request); } // Send email to administrator if it is a new ad to validate //if ($form->getObject()->isNew()) //{ //ipTools::dump('send email', 'send email', 1); $form->getObject()->notifyWebmasterForNewAd(); //} // Redirect $this->getUser()->addNotice('Votre annonce a été sauvegardée, elle sera visible dès qu\'elle aura été validée par un administrateur'); $this->redirect('iposte_user/adsList'); } } // Pass form to template $this->form = $form; }
// Check category or query $v = new sfValidatorCallback(array( 'callback' => array($this, 'checkCategoryOrQuery') ,) , array( 'invalid' => 'Veuillez choisir une rubrique ou un mot clé' )); $this->validatorSchema->setPostValidator($v);
et le callback qui va bien:
/** * Check if a category or a keyword has been set. * * @param sfValidator $validator * @param Array $value Form values * @param Array $arguments Validation arguments * * @return mixed */ public function checkCategoryOrQuery($validator, $value, $arguments) { if (empty($value['category_id']) && empty($value['nature_id'])) { throw new sfValidatorError($validator, 'invalid'); } return $value; }
$form_ajax_options = $sf_data->get('form_ajax_options', ESC_RAW);
methods:
post:
- "user_profile{login}"
- "user_profile{password}"
- "user_profile{check_password}"
- "user_profile{email}"
- "user_profile{civility}"
- "user_profile{first_name}"
- "user_profile{last_name}"
- "user_profile{birth_date}"
- "user_profile{address}"
- "user_profile{postal_code}"
- "user_profile{town}"
- "captcha"
- "user_profile{is_newsletter_subscribed}"
- "user_profile{is_partners_subscribed}"
- "user_profile{photo}"
- "user_profile{personal_url}"
fillin:
enabled: true
param:
name: form_register_member
names:
user_profile{login}:
required: Yes
required_msg: le login est obligatoire
validators: [usernameValidator, loginValidator]
user_profile{password}:
required: Yes
required_msg: le mot de passe est requis
validators: passwordValidator
user_profile{check_password}:
required: Yes
required_msg: La confirmation du mot de passe est obligatoire
validators: passwordValidator
user_profile{email}:
required: Yes
required_msg: l'email est obligatoire
validators: [emailValidator, mailuniqValidator]
user_profile{civility}:
required: Yes
required_msg: veuillez choisir votre civilité
user_profile{first_name}:
required: Yes
required_msg: le prénom est obligatoire
validators: usernameValidator
user_profile{last_name}:
required: Yes
required_msg: le nom est obligatoire
validators: usernameValidator
user_profile{birth_date}:
required: Yes
required_msg: le nom est obligatoire
validators: usernameValidator
user_profile{address}:
required: Yes
required_msg: l'adresse est obligatoire
user_profile{postal_code}:
required: Yes
required_msg: le code postal est obligatoire
validators: zipcodeValidator
user_profile{town}:
required: Yes
required_msg: la ville est obligatoire
captcha:
required: Yes
required_msg: vous devez recopier le code
validators: captchaValidator
user_profile{is_newsletter_subscribed}:
required: no
user_profile{is_partners_subscribed}:
required: no
user_profile{photo}:
required: no
user_profile{personal_url}:
required: no
passwordValidator:
class: sfCompareValidator
param:
check: passconf
compare_error: les mots de passe ne correspondent pas
loginValidator:
class: sfPropelUniqueValidator
param:
class: sfGuardUser
column: username
unique_error: ce login est déjà enregistré, choisissez en un autre.
mailuniqValidator:
class: sfPropelUniqueValidator
param:
class: UserProfile
column: email
unique_error: cet email est déjà enregistré, choisissez en un autre.
zipcodeValidator:
class: sfNumberValidator
nan_error: Veuillez n'entrer que des chiffres
min: 5
min_error: le code postal est au minimum composé de 5 chiffres
usernameValidator:
class: sfStringValidator
param:
min: 3
min_error: ce login doit être plus long
emailValidator:
class: sfEmailValidator
param:
email_error: l'adresse email n'est pas valide
captchaValidator:
class: captchaValidator
param:
error: vous devez recopier correctement le code de validation
methods: [post] # This is the default setting
fillin:
enabled: true
param:
name: send_page_to_friend_form
#skip_fields: [email] # Do not repopulate these fields
#exclude_types: [hidden, password] # Do not repopulate these field types
#check_types: [text, checkbox, radio, password, hidden] # Do repopulate these
validators:
myStringValidator:
class: sfStringValidator
param:
min: 2
min_error: This field is too short (2 characters minimum)
max: 100
max_error: This field is too long (100 characters maximum)
fields:
name:
required:
msg: The name field cannot be left blank
myStringValidator:
email:
required:
msg: The email field cannot be left blank
myStringValidator:
sfEmailValidator:
email_error: This email address is invalid
age:
sfNumberValidator
nan_error: Please enter an integer
min: 0
min_error: "You're not even born. How do you want to send a message?"
max: 120
max_error: "Hey, grandma, aren't you too old to surf on the Internet?"
message:
required:
msg: The message field cannot be left blank
Pour eviter les problemes de type MIME, notemment sous MAC.
/** * Fonction de validation manuelle de l'importation * * @internal Pour bug Mac type mime * * @author Vernet Loic * @since 6 mars 2007 */ public function validateImport() { $fieldName = 'importfile'; $fileName = $this->getRequest()->getFileName($fieldName); $validExts = array('.CSV'); if ($this->getRequest()->getMethod() == sfRequest::POST) { if ($fileName) { foreach($validExts as $validExt) { if (strpos(strtoupper($fileName), $validExt)) { return true; } } $this->getRequest()->setError($fieldName , 'Extension invalide, l\'extension doît être .csv'); return false; } else { $this->getRequest()->setError($fieldName , 'Fichier invalide'); return false; } } return true; }
$request = $this->getRequest()->getParameterHolder();
<?php if ($sf_request->hasErrors()) { foreach($sf_request->getErrors() as $key => $error) { echo '<li>'. $key. ' => '. $error. '</li>'; } } ?>
Version synthaxe alternative
<?php if ($sf_request->hasErrors()): ?> <ul> <?php foreach($sf_request->getErrors() as $key => $error): ?> <li><?php echo $key; ?> => <?php echo $error; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
if ($this->getRequest()->getMethod() == sfRequest::POST) { // $this->actionWhenPosted() }
logs
8449.9 KB