public function sign($form = null)
{
$state =& $this->_state;
$classes = $this->_classes;
$form = $form ?: $this->_context->form;
$id = spl_object_hash($form);
$hasBound = isset($state[$id]);
if ($hasBound) {
return;
}
$form->applyFilter('create', function ($self, $params, $chain) use($form, &$state) {
$id = spl_object_hash($form);
$state[$id] = array('fields' => array(), 'locked' => array(), 'excluded' => array());
return $chain->next($self, $params, $chain);
});
$form->applyFilter('end', function ($self, $params, $chain) use($form, &$state, $classes) {
$id = spl_object_hash($form);
if (!$state[$id]) {
return $chain->next($self, $params, $chain);
}
$value = $classes['formSignature']::key($state[$id]);
echo $form->hidden('security.signature', compact('value'));
$state[$id] = array();
return $chain->next($self, $params, $chain);
});
$form->applyFilter('_defaults', function ($self, $params, $chain) use($form, &$state) {
$defaults = array('locked' => $params['method'] === 'hidden' && $params['name'] !== '_method', 'exclude' => $params['name'] === '_method');
$options = $params['options'];
$options += $defaults;
$params['options'] = array_diff_key($options, $defaults);
$result = $chain->next($self, $params, $chain);
if ($params['method'] === 'label') {
return $result;
}
$value = isset($params['options']['value']) ? $params['options']['value'] : "";
$type = array($options['exclude'] => 'excluded', !$options['exclude'] => 'fields', $options['locked'] => 'locked');
if (!($name = preg_replace('/(\\.\\d+)+$/', '', $params['name']))) {
return $result;
}
$state[spl_object_hash($form)][$type[true]][$name] = $value;
return $result;
});
}