我正在使用Phalcon创建一个表单,其上有一个复选框。我使用此代码在PagesForm.php
文件
$this->add(new Check('usesLayout'));
然后在我看来我有
{{ form.render("usesLayout") }}
但是,如果未选中该复选框,则Phalcon会抱怨usesLayout is required
。
视图生成的html
代码是
<input type="checkbox" id="usesLayout" name="usesLayout" value="1" checked="checked" />
使用复选框创建Phalcon表单的正确方法是什么,以便它既可以选中也可以取消选中?
期望的结果
在回顾使用CakePHP时制作的表单后,html输出是
<input type="hidden" name="usesLayout" id="usesLayout_" value="0" />
<input type="checkbox" name="usesLayout" id="usesLayout" value="1" checked="checked" />
这很好用,所以我正在寻找类似的东西。
当前解决方法
在对this question的最终回复中修改代码后,我目前有此解决方法(我使用此代替Phalcon\Forms\Element\Check
)
namespace Armaware\InBrowserDev\Forms\Element;
use Phalcon\Forms\Element\Check as PhalconCheck;
class Check extends PhalconCheck
{
/**
* Renders the element widget returning html
*
* @param array|null $attributes Element attributes
*
* @return string
*/
public function render($attributes = null)
{
$attrs = array();
if (!is_null($attributes)) {
foreach ($attributes as $attrName => $attrVal) {
if (is_numeric($attrName) || in_array($attrName, array('id', 'name', 'placeholder'))) {
continue;
}
$attrs[] = $attrName .'="'. $attrVal .'"';
}
}
$attrs = ' '. implode(' ', $attrs);
$id = $this->getAttribute('id', $this->getName());
$name = $this->getName();
$checked = '';
if ($this->getValue()) {
$checked = ' checked';
}
return <<<HTML
<input type="hidden" id="{$id}_" name="{$name}" value="0" />
<input type="checkbox" id="{$id}" name="{$name}" value="1"{$attrs}{$checked} />
HTML;
}
}
答案 0 :(得分:1)
从Phalcon \ Forms \ Element继承的公共Phalcon \ Forms \ ElementInterface setDefault(unknown $ value)
如果表单不使用实体或者_POST中没有可用于该元素的值,则设置默认值
您的表单声明看起来像这样:
$controls[] = (new Check('usesLayout', ['value' => '1']))
->setLabel('Should I use layout?')
->setDefault('0') // or `false` in case it's not filtered
->addFilter('bool'); // filtering to boolean value
未经测试,但可能会做。您总是可以尝试使用beforeValidation()
形式的方法来处理此问题,但现在没有空间对其进行测试,并且不会冒这个可失效解决方案的风险。