Zend表单 - 如何创建这些自定义表单元素?

时间:2010-06-08 14:45:00

标签: zend-form decorator

这是一个非常具体的例子,我很难让Zend Form产生正确的输出并提供正确的验证。我可能要创建一个复合元素,但我想先问一下这里。这是我试图让Zend Form生成的HTML。我希望能够在验证未通过的情况下工作,错误消息仍然与产生错误的字段一起显示。

<tr>
    <td>Budget</td>
    <td>
        <input type="radio" name="budget" value="unlimited" /> unlimited
        <br />
        <input type="radio" name="budget" value="limited" /> $ <input type="text" name="budget_amount" /> every <select name="budget_period">
            <option value="day">day</option>
            <option value="week">week</option>
            <option value="month">month</option>
            <option value="year">year</option>
        </select>
    </td>
</tr>
<tr>
    <td></td>
    <td><input type="checkbox" name="include_weekends" value="yes" /> include weekends?</td>
</tr>

用户可以选择无限制或限制预算值,但是,如果他们选择有限,则需要输入预算金额字段的值,然后从预算期间字段的选择中选择一个值。 / p>

1 个答案:

答案 0 :(得分:0)

经过大量调整后想出来,但希望答案可以帮助其他人。只是发布装饰器的东西,因为我还在处理预算值的验证(通过覆盖表单的isValid()函数使其工作,但现在尝试将其放入自定义验证器中。)

    $this->setElementDecorators(array(
        'ViewHelper',
        array(array('data' => 'HtmlTag'), array('tag' => 'td')),
        array('Label', array('tag' => 'td')),
        array(array('row' => 'HtmlTag'), array('tag' => 'tr'))
    ));

    $budget->setDecorators(array(
        'ViewHelper',
        array(array('openData' => 'HtmlTag'), array('tag' => 'td', 'openOnly' => true)),
        array('Label', array('tag' => 'td')),
        array(array('openRow' => 'HtmlTag'), array('tag' => 'tr', 'openOnly' => true))
    ));

    $budgetAmount->setDecorators(array(
        'ViewHelper'
    ));

    $budgetPeriod->setDecorators(array(
        'ViewHelper',
        array('AnyMarkup', array('markup' => 'every', 'placement' => 'PREPEND')),
        array(array('closeData' => 'HtmlTag'), array('tag' => 'td', 'closeOnly' => true)),
        array(array('closeRow' => 'HtmlTag'), array('tag' => 'tr', 'closeOnly' => true))
    ));

    $includeWeekends->setDecorators(array(  
        'ViewHelper',
        array('Label', array('placement' => 'APPEND')),
        array(array('data' => 'HtmlTag'), array('tag' => 'td')),
        array(array('emptyRow' => 'HtmlTag'), array('tag' => 'td', 'placement' => 'PREPEND')),
        array(array('row' => 'HtmlTag'), array('tag' => 'tr'))
    ));

    $this->setDecorators(array(
        'FormElements',
        array('HtmlTag', array('tag' => 'table')),
        'Form',
        array('FormErrors', array('placement' => 'PREPEND', 'class' => 'error')),
        array('Description', array('placement' => 'PREPEND'))
    ));