When you would restrict the display of a field or fieldset group on user credential. you must do the following
1. open the action class and add
public function preExecute()
{
parent::preExecute();
$this->configuration->setUser($this->getUser());
}
2. open the *GeneratorConfiguration class and add
protected $user;
public function setUser($user)
{
$this->user = $user;
}
public function getUser()
{
return $this->user;
}
public function getEditDisplay()
{
$fieldsets = parent::getEditDisplay();
if (!$this->getUser()->hasCredential('admin'))
{
unset(
$fieldsets['Auth'][2], // field
$fieldsets['Rights'] // field group
);
}
return $fieldsets;
}
public function getNewDisplay()
{
... // see getEditDisplay
}
public function getFormOptions()
{
return array('user' => $this->getUser());
}
3. last remove the fields from the form, open the *Form class and add
public function configure()
{
...
if (!$this->getOption('user')->hasCredential('admin'))
{
unset($this['is_super_admin'], $this['groups_list'], $this['permissions_list']);
}
...
}
Create a function in your BaseForm class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public static function listenToPostConfigure($event)
{
$form = $event->getSubject();
$widgetSchema = $form->getWidgetSchema();
$validatorSchema = $form->getValidatorSchema();
$fields = $form->getFormFieldSchema()->getWidget()->getFields();
foreach ($fields as $key => $object)
{
$label = $form->getFormFieldSchema()->offsetGet($key)->renderLabelName();
if (isset($validatorSchema[$key]) and $validatorSchema[$key]->getOption('required') == true)
{
$title = $key . '_field_is_required';
$label .= '<sup>getFormFormatter()->translate($title) . '">*</sup>';
}
$widgetSchema->setLabel($key, $label);
}
} |
Add a listener to the form.post_configure event with your function
1
2
| $dispatcher = $this->getEventDispatcher();
$dispatcher->connect('form.post_configure', array('BaseForm', 'listenToPostConfigure')); |
You have a register form with a field account_type and two embed forms Company and Address.
You want remove the embed Company form, when the field account_type is sfGuardUserProfile::TYPE_PRIVATE otherwise you want remove the embed Address form.
The solution is to override the bind method in your form.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| public function bind(array $taintedValues = null, array $taintedFiles = null)
{
// unset request param and validator
if($taintedValues['account_type'] == sfGuardUserProfile::TYPE_PRIVATE)
{
unset(
$taintedValues['Company'],
$this->validatorSchema['Company']
);
}
else
{
unset(
$taintedValues['Address'],
$this->validatorSchema['Address']
);
}
parent::bind($taintedValues, $taintedFiles);
} |
create file lib/gfFormHerlp.class.php
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
| <?php
/**
* Some usefull form helper
*
* @package symfony
* @subpackage helper
* @author Gordon Franke <gfranke@nevalon.de>
* @link http://www.nevalon.de
*/
class gfFormHelper
{
/**
* Add * to required field labels
*
* @param sfForm $form
* @param string $symbol
* @param string $title
*
* @return void
*/
public static function addRequiredToLabel(sfForm $form, $symbol = '*', $title = 'This field is mandatory.')
{
$widgetSchema = $form->getWidgetSchema();
$validatorSchema = $form->getValidatorSchema();
foreach($form->getFormFieldSchema()->getWidget()->getFields() as $key => $object)
{
$label = $form->getFormFieldSchema()->offsetGet($key)->renderLabelName();
if(isset($validatorSchema[$key]) and $validatorSchema[$key]->getOption('required') == true) {
$label .= '<sup title="' . $widgetSchema->getFormFormatter()->translate($title) . '">' . $symbol . '</sup>';
}
$widgetSchema->setLabel($key, $label);
}
}
} |
add at the end of your form setup or better when you have subforms into the configure method this line
1
| gfFormHelper::addRequiredToLabel($this); |
i won’t to add the user id from the current logged in user to the form. I can add a hidden field, but this is not really secure. I simple call the updateObject($values) methode between isValid() and save().
1
2
3
4
5
6
7
8
9
10
11
| protected function processForm(sfWebRequest $request, sfForm $form)
{
$form->bind($request->getParameter($form->getName()));
if ($form->isValid())
{
$form->updateObject(array('user_id' => $this->getUser()->getAttribute('user_id', null, 'sfGuardSecurityUser')));
$article = $form->save();
$this->redirect($this->generateUrl('article_detail', $article));
}
} |
Recent Comments