symfony1 - Outputting required field indicator for symfony forms -
i have few forms configured in symfony. 1 things need have asterisk (*) or other indicator next fields required. fields set required int form framework, , return "this field required" error when form submitted, want indicator before form submitted.
if there way without overriding labels each field manually?
here's automatic solution found in kris wallsmith's blog:
lib/formatter/requiredlabelsformattertable.class.php, add 'required' class labels of required fields
<?php class requiredlabelsformattertable extends sfwidgetformschemaformattertable { protected $requiredlabelclass = 'required'; public function generatelabel($name, $attributes = array()) { // loop find "required_fields" option $widget = $this->widgetschema; { $requiredfields = (array) $widget->getoption('required_fields'); } while ($widget = $widget->getparent()); // add class (non-destructively) if field required if (in_array($this->widgetschema->generatename($name), $requiredfields)) { $attributes['class'] = isset($attributes['class']) ? $attributes['class'].' '.$this->requiredlabelclass : $this->requiredlabelclass; } return parent::generatelabel($name, $attributes); } }
lib/form/baseform.class.php, common base class forms in project:
protected function getrequiredfields(sfvalidatorschema $validatorschema = null, $format = null) { if (is_null($validatorschema)) { $validatorschema = $this->validatorschema; } if (is_null($format)) { $format = $this->widgetschema->getnameformat(); } $fields = array(); foreach ($validatorschema->getfields() $name => $validator) { $field = sprintf($format, $name); if ($validator instanceof sfvalidatorschema) { // recur $fields = array_merge( $fields, $this->getrequiredfields($validator, $field.'[%s]') ); } else if ($validator->getoption('required')) { // field required $fields[] = $field; } } return $fields; }
add following few lines baseform well, in __construct()
method:
$this->widgetschema->addoption("required_fields", $this->getrequiredfields()); $this->widgetschema->addformformatter('table', new requiredlabelsformattertable($this->widgetschema) );
after this, labels have required
class, use whatever css need mark user.
Comments
Post a Comment