Reputation: 95
I try to create a custom ViewHelper to integrate that code of Dennis D.:
label = '<label ' . $this->_htmlAttribs($label_attribs) . ' for="' . $optId . '">'
. $opt_label
.'</label>';
// Wrap the radios in labels
$radio = '<input type="' . $this->_inputType . '"'
. ' name="' . $name . '"'
. ' id="' . $optId . '"'
. ' value="' . $this->view->escape($opt_value) . '"'
. $checked
. $disabled
. $this->_htmlAttribs($attribs)
. $endTag;
if ('prepend' == $labelPlacement) {
$radio = $label . $radio;
}
elseif ('append' == $labelPlacement) {
$radio .= $label;
}
The idea is, I want create radio button with that structure.
<input type="radio" />
<label>Yes</label>
So I create the file and I call it FormRadio. The path is: "Library/Application/View/Helper/FormRadio.php". The code:
class Application_View_Helper_FormRadio extends Zend_View_Helper_FormRadio{
protected $_inputType = 'radio';
protected $_isArray = false;
public function formRadio($name, $value = null, $attribs = null,
$options = null, $listsep = "<br />\n")
{
$info = $this->_getInfo($name, $value, $attribs, $options, $listsep);
extract($info); // name, value, attribs, options, listsep, disable
// retrieve attributes for labels (prefixed with 'label_' or 'label')
$label_attribs = array();
foreach ($attribs as $key => $val) {
$tmp = false;
$keyLen = strlen($key);
if ((6 < $keyLen) && (substr($key, 0, 6) == 'label_')) {
$tmp = substr($key, 6);
} elseif ((5 < $keyLen) && (substr($key, 0, 5) == 'label')) {
$tmp = substr($key, 5);
}
if ($tmp) {
// make sure first char is lowercase
$tmp[0] = strtolower($tmp[0]);
$label_attribs[$tmp] = $val;
unset($attribs[$key]);
}
}
$labelPlacement = 'append';
foreach ($label_attribs as $key => $val) {
switch (strtolower($key)) {
case 'placement':
unset($label_attribs[$key]);
$val = strtolower($val);
if (in_array($val, array('prepend', 'append'))) {
$labelPlacement = $val;
}
break;
}
}
// the radio button values and labels
$options = (array) $options;
// build the element
$xhtml = '';
$list = array();
// should the name affect an array collection?
$name = $this->view->escape($name);
if ($this->_isArray && ('[]' != substr($name, -2))) {
$name .= '[]';
}
// ensure value is an array to allow matching multiple times
$value = (array) $value;
// Set up the filter - Alnum + hyphen + underscore
require_once 'Zend/Filter/PregReplace.php';
$pattern = @preg_match('/\pL/u', 'a')
? '/[^\p{L}\p{N}\-\_]/u' // Unicode
: '/[^a-zA-Z0-9\-\_]/'; // No Unicode
$filter = new Zend_Filter_PregReplace($pattern, "");
// add radio buttons to the list.
foreach ($options as $opt_value => $opt_label) {
// Should the label be escaped?
if ($escape) {
$opt_label = $this->view->escape($opt_label);
}
// is it disabled?
$disabled = '';
if (true === $disable) {
$disabled = ' disabled="disabled"';
} elseif (is_array($disable) && in_array($opt_value, $disable)) {
$disabled = ' disabled="disabled"';
}
// is it checked?
$checked = '';
if (in_array($opt_value, $value)) {
$checked = ' checked="checked"';
}
// generate ID
$optId = $id . '-' . $filter->filter($opt_value);
$label = '<label'
. $this->_htmlAttribs($label_attribs) . ' for="' . $optId . '">'
. $opt_label
. '</label>';
$endTag = "/>";
// Create the radio button
$radio = '<input type="' . $this->_inputType . '"'
. ' name="' . $name . '"'
. ' id="' . $optId . '"'
. ' value="' . $this->view->escape($opt_value) . '"'
. $checked
. $disabled
. $this->_htmlAttribs($attribs)
. $endTag;
// Combine the label and the radio button
if ('prepend' == $labelPlacement) {
$radio = $label . $radio;
} else {
$radio = $radio . $label;
}
// add to the array of radio buttons
$list[] = $radio;
}
// XHTML or HTML for standard list separator?
if (!$this->_isXhtml() && false !== strpos($listsep, '<br />')) {
$listsep = str_replace('<br />', '<br>', $listsep);
}
// done!
$xhtml .= implode($listsep, $list);
return $xhtml;
}
}
In the form I call the new ViewHelper:
class Application_Form_Registration extends Zend_Form{
public function init()
{
$radio = new Zend_Form_Element_Radio('two');
$radio->setLabel('Two')->setRequired(true);
$radio->setMultiOptions(array('yes'=>'Yes', 'no'=>'No'))
->addDecorators(array(array('ViewHelper',array('helper' => 'formRadio'))));;
$submit = new Zend_Form_Element_Submit('submit');
$submit->setValue('Submit')
->setAttribs(array('class' => 'btn btn-success btn-lg'));
$this->addElements(array($radio,$submit));
$submit->setDecorators(array('ViewHelper',
array(array('data' => 'HtmlTag'), array('tag' =>'div', 'class'=> 'element')),
array(array('emptyrow' => 'HtmlTag'), array('tag' =>'div', 'class'=> 'element', 'placement' => 'PREPEND')),
array(array('row' => 'HtmlTag'), array('tag' => 'div'))
));
$this->setDecorators(array(
'FormElements',
array('HtmlTag', array('tag' => 'div', 'class' => 'myForm')),
'Form'
));
}
}
But nothing happened. Where am I wrong? Thanks in advance.
Upvotes: 1
Views: 364
Reputation: 1889
I do custom form types a bit differently. Instead of adding a decorator to the existing Zend_Form_Element_Radio
element, I typically extend the class and set the $_helper
as the new view helper I created.
So for your class it might be something like this:
class Application_Form_Element_NewRadios
extends Zend_Form_Element_Radio
{
$_helper = 'newRadios';
}
The root of your problem is that your view helper has the same ending as the Zend one and the framework is looking at the Zend one first. There are two options, either tell the form to look for your view helpers first, or give it a new name that won't conflict with the Zend view helpers.
So your view helper then becomes something like this:
class Application_View_Helper_NewRadios
extends Zend_View_Helper_FormRadio
{
// .......
}
You might need to tell your form where to look for the new form element class, so in your Application_Form_Registration::init
method you might need to add something like this:
$this->addPrefixPath(
'Application_Form_Element',
'Library/Application/Form/Element',
'element'
);
And in your application.ini
file, you might also need to tell the application where to look for the new view helper class.
resources.view.helperPath.Application_View_Helper = Library/Application/View/Helper
Upvotes: 2