如何使用Phalcon表格的复选框?

时间:2015-09-02 18:17:47

标签: forms checkbox phalcon

我正在使用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;
    }
}

1 个答案:

答案 0 :(得分:1)

  

从Phalcon \ Forms \ Element继承的公共Phalcon \ Forms \ ElementInterface setDefault(unknown $ value)

     

如果表单不使用实体或者_POST中没有可用于该元素的值,则设置默认值

Source

您的表单声明看起来像这样:

$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()形式的方法来处理此问题,但现在没有空间对其进行测试,并且不会冒这个可失效解决方案的风险。

相关问题