【问题标题】:Add HTML placeholder into Zend_Form在 Zend_Form 中添加 HTML 占位符
【发布时间】:2011-01-04 15:09:27
【问题描述】:

我正在使用Zend_Form 申请使用此代码的申请表:

class Form_ApplicationForm extends Zend_Form
{
    public function init()
    {
        $this->setAction('/application/new')
             ->setMethod('post')
             ->setAttrib('id','application');

        $name = new Zend_Form_Element_Text('name');
        $name->setLabel('Your Name')
             ->setRequired(TRUE)
             ->addValidator('alpha', FALSE, array('allowWhiteSpace' => true));

        $email = new Zend_Form_Element_Text('email');
        $email->setLabel('Email Address')
              ->setRequired(TRUE)
              ->addValidator('EmailAddress');

        $this->addElements(array($name,$email));
    }
}

我正在向此表单添加一个 Flash 文件上传器 (swfupload),它需要一个 HTML sn-p 才能工作,sn-p 如下所示:

<div id="swfupload-control">
    <p>Upload upto 5 image files(jpg, png, gif), each having maximum size of 1MB(Use Ctrl/Shift to select multiple files)</p>
    <input type="button" id="button" />
    <p id="queuestatus" ></p>
    <ol id="log"></ol>
</div>

插入它的最佳方法是什么,使其位于&lt;form&gt; 中的某个位置,我将其插入到我的控制器中,如下所示:

public function newAction()
{
    $form = new Form_ApplicationForm();
    if($this->_request->isPost()){
        $data = $_POST;
        if($form->isValid($data)){
            /// handle data here
        }else{
            $form->populate($data);
        }
    }
    $this->view->form = $form;
}

有没有办法在Zend_Form 中添加占位符或类似的东西,或者应该使用装饰器或类似的东西来完成?

谢谢。

【问题讨论】:

    标签: php zend-framework zend-form


    【解决方案1】:

    您必须为此编写自己的元素,例如My_Form_Element_SwfUpload 以及渲染器。请参阅这些教程:

    【讨论】:

    • 这看起来是一个很好的解决方案,将不得不阅读更多关于它的信息
    • 这似乎是我正在寻找的解决方案,但这些示例没有提供新文件应该放置在哪里的上下文。我应该在这里遵循一个原则,即与 ZF 本身在同一目录中的一个新文件夹吗?
    • 好吧,类名遵循 PEAR 命名约定,因此您可以将上述元素放在 My/Form/Element/SwfUpload 中,而 My_Decorator_Something 将放在 My/Decorator/Something 中
    • 我明白了,我没有意识到这一点。在您的 My/Form/Element/SwfUpload 示例中,将添加“My”的根是什么?这会与应用程序/公共/库等平行吗?
    • 您的库文件夹或模型中。但基本上,与您定义的包含路径相关的任何内容。
    【解决方案2】:

    最简单的方法是在视图中做:

    通过echoing 每个元素,您可以打印其 html。这是一种方法:

    <form id="<?= $this->form->getId() ?>" action="<?= $this->form->getAction() ?>">
    
    <? foreach ($this->form as $element): ?>
    <?= $element ?>
    <? if ($element->getName() == 'email'): ?>
    <div id="swfupload-control">
        <p>Upload upto 5 image files(jpg, png, gif), each having maximum size of 1MB(Use Ctrl/Shift to select multiple files)</p>
        <input type="button" id="button" />
        <p id="queuestatus" ></p>
        <ol id="log"></ol>
    </div>
    <? endif ?>
    <? endforeach ?>
    
    </form>
    

    它的作用是打印所有元素,并将您需要的任何内容放在email 字段之后。如果您在表单中添加或删除字段,此代码将继续工作(当然,如果您删除 email 字段,它将失败)。

    【讨论】:

    • 同意。它可能“感觉”很老套,但另一种解决方案,即实现装饰器,要花费更多时间。
    • 当需要占位符而不是自定义元素时,我也会这样做。
    猜你喜欢
    • 2015-01-23
    • 2012-01-12
    • 1970-01-01
    • 2015-08-31
    • 2019-07-04
    • 2011-01-05
    • 2016-05-15
    • 2021-09-18
    • 1970-01-01
    相关资源
    最近更新 更多