我读过手册了很多次,我走遍了员额由谷歌提供关于这个问题,我们甚至还买了几本书,处理与苏.现在,为什么我仍然困惑?

我可以使用改变,使一种形式,验证功能的罚款。什么我不能这样做使的一种形式,看起来完全一样我想让它看起来的错误消息,我希望它有。我想定义按钮,我想时髦的布局,我要插入的文本中的形式,等等。

没有任何人有一个简单的方式实现这些各种各样的事情呢?一些让我感觉像框架是救我的时间,而不是成本计算?我可以放弃Zend形式...让我自己的形式,其行动打了一个网页,以验证和处理所发布的数据和我可以做它以最快的速度,我可以的类型但是我真的想要"获得",这并能够使用它,因为它显然意图。

任何建议?任何简单的"如何"的定义按钮,时髦的布局和基础(或相当先进,因为有大量的基本教程,跳过困难的问题)"做事情"与zend的形式?

有帮助吗?

解决方案

巴雷特康拉德的建议是什么,我会建议。另外,请记住,你不需要使用表单对象来渲染表单。

有一件事情你可以做的是在具有相同名称的窗体类元素视图脚本创建表单。

您HTML形式:

<form action="/login/" method="post">
<fieldset>
    <label for="username">Username:</label>
    <input type="text" size="10" name="username" />
    <label for="password">Password:</label>
    <input type="password" size="10" name="password" />
    <input type="submit" />
</fieldset>
</form>

您类:

class LoginForm extends Zend_Form
{
    public function init()
    {
        $username = $this->createElement('text','username');
        $username->setRequired(true);
        $this->addElement($username);

        $password = $this->createElement('password','password');
        $password->setRequired(true);
        $this->addElement($password);        
    }
}

您的窗体类反映了你的HTML表单,在你的类中的每个元素都有自己的验证和要求。回到你的行动,你可以创建窗体类的实例和验证后/获得打击这一形式瓦尔:

$form = new LoginForm();
if ($this->_request->isPost()) {
    if ($form->isValid($this->_request->getParams())) {
        // do whatever you need to do
    } else {
        $this->view->errors = $form->getMessages();
    }
}

可以在一个组中的形式的顶部显示该错误消息,使用这种方法。

这是一个基本的例子,但它可以让你有在你的形式呈现总量控制,无需花费学习使用装饰的时间。大部分的Zend_Form的实力是在其验证和过滤性能,在我看来。这给你力量。主要的缺点,以像这样的解决方案是,视图脚本的HTML表格可以成为外的同步与您的形式的类。

其他提示

在视图单独地渲染每个元素 - 例如

<!-- view script here -->
<form method="POST">
Name: <?php echo $this->myForm->getElement('name')->render(); ?>
some other text between the fields
Birthdate: <?php echo $this->myForm->getElement('birthdate')->render(); ?>
<input type="submit" />
</form>

此保持使用Zend_Form的视图助手的能力(即,显示错误消息并维护表单字段的值在验证失败时),但给你完全定制的能力。

如果你想走得更远,然后关闭单个表单元素的缺省装饰,然后可以附上你自己来进一步自定义使用什么标记(即错误消息和标签),或在不使用装饰所有(除来渲染表单元件本身),然后手动编写所有周围HTML。完整的定制能力,而不会在两者的形式水平和在视图级别失去的Zend_Form的好处。

马修纬二O'Phinney已经开始了一系列的博客约器装饰:

  1. 最简单的改变的装饰
  2. 从里面出:如何层的装饰
  3. 呈现改变单独的装饰
  4. 创建组合的元素

目前,我们已经有了新的闪闪发亮 Zend\Form 这是甚至更复杂的比旧的组件,但也更加可控制、封装和强大。因此,我说什么下不适用。新的成分是恕我直言一个巨大的进步,因为它...

  • ...让你完全控制你想怎么渲染形式,需要编写更多一点的认代码,但它是值得的
  • ...分离数据,逻辑和看到的最大可能程度
  • ...使用的5种形式的元素
  • ...给你很多选择如何你想把你的形式在一起的,例如水化,注释,等等。

旧的回答关于改变

我真的不能帮助可能是因为我完全相同的问题。我认为改变的装饰都是强大的,但迄今为止至少友好的程序员和非直观件的埃孚我已经看到迄今为止,我已经使用的一个主要部分的苏的各种项目。

这就是说我只能得到一些提示从我的经验:

  • 过滤器易于使用,而不使用形
  • 大多数(如果不是所有的东西你想要实现的帮助下完成装饰
  • 我开始与小形式和添加的东西一块一块但是我没有得到一些东西我在做我的一些形式,因为结果为基础的试验和误差(主要是装修)
  • 我已经得到的信息,从zend邮件列表我不能有任何地方发现的在网络上

从相关的问题,这在右边它是显而易见的,有一个缺乏全面的文件对于改变特别是由于它的非直观性。我真的很喜欢看到苏们做什么关于这个因为我喜欢Zend框架。

所以这个答案可能只是让你知道,你不是唯一一个具有这个问题。


或者您可以使用 绝地心灵的技巧 当然!

要添加到说了些什么:

不要害怕的装饰,你将使用他们很多,如果你决定坚持使用Zend_Form的。一旦你得到它“,不幸的是,文档是弱,玩它几乎是到那里的唯一方法是相当简单的。

在ViewScript和视图助手装饰给你很多的功率。

不要害怕通过源存在和不同的装饰挖看看他们是如何做的事情(我获得的洞察力与道场那些比较原始的装饰相当数量)。

我觉得肖恩的建议是,你不需要调用形式 - >渲染,你可以使用这样的事情在你的viewscript。

 <someHtmlThingy name="blah" value="<?php echo $this->formInstance->getElement('whatever')->getValue(); ?>" />

我工作的一个项目(预Zend_Form的),我们建立集验证,并通过使用标准viewscripts一路。这是多一点的工作(管道错误消息等),但相对于由Zend_Form创建元素也不为过。

如果你只是想之前或不使用ViewScript装饰你的表单元素后添加任意的标记,你可以用我的AnyMarkup装饰:的 的http:// WWW。 zfsnippets.com/snippets/view/id/62

例如,这里是你如何将预先准备的输入场与包装标签内部的图像(需要包括用于自动加载到正确设置路径):

$form->addElement('text', 'my_field', array(
  'label' => 'Enter Info:',
  'decorators' => array(
    'ViewHelper',
    array('AnyMarkup', array(
      'markup' => '<span class="imgwrapper">'.
        '<img src="info.png" alt="info icon"/></span>'),
      'placement' => 'prepend'
    ),
    'HtmlTag',
    'Label'
  )
);

上的形式范围内的装饰跳过了。(IE - 印刷形式的单独的元件,而不是仅仅依赖于窗体的标准视图助手来处理一切)是获得一堆控制的背面单程

另一种选择是简单地手工编写表单,并只使用ZF处理验证和筛选。

不幸的是,较复杂的问题都被跳过去了,因为没有一个真正的具体目的或目标,这真的很难编写的一个例子,或如何做。我花了一些时间帮助了另一个开发商在这里这么想 修改的方式隐藏的因素是显示, 但他的情况是非常具体的所以这是更深入的具体情况。

大多数较复杂的任务真的来到延伸的默认帮助的特定领域的类型。例如,我有一个项目中,我想要应用类"错误"所有领域,没有通过验证后一个形成已经提交,而不是编写了验证错误的文字:

<label for="field">Label:</label>
<input type="text" name="field" id="field" class="error">

这是一个相当复杂的过程,因为实际形成元的不可用的图帮助者默认情况下,这样的助手不能检查,如果件有一个验证错误。所以我去了有关下列工艺:

  1. 我必须创建一个客户图帮助的每个领域的类型,我想要应用"有误"类。在我复盖了的 formXXX() 方法,并添加一个检查,看如果元素了一个错误。此外,我加入 setElement() 方法,装饰可以打电话设置的一个实例的素因此我的助手可以检查的错误。
  2. 接下来,我不得不复盖默认的 Zend_Form_Decorator_ViewHelper.在我访问该图和实例的帮助形式单元类型和检查是否存在 setElement() 方法我创造了在我看来帮手,设置,如果它存在。通过这样做,我可以延长某些形式件类型和不是其他人没有破坏整个脚本。
  3. 在我的初始化()功能为每一种形式,我不得不添加一个新元素的前缀路径(addElementPrefixPath('My_Form_Decorator'), 'path/to/decorator'))其中指出,我的新形式的装饰。
  4. 最后,我不得不添加辅助道路以我应用程序,以便Zend框架可以找到帮手我创造了在第一点: addHelperPath('/path/to/helpers', 'My_View_Helper');

你可以看到为什么写作的复杂的教程真正需要现实世界的问题。大部分有关设置这些类型的帮手,或者复杂的装饰的计划是,所有这恼人的前面,它允许你很容易地创造多种形式,遵守同样的设计方案并修改其输出的均匀速度非常快,如果变化的需要作出。但如果在另一方面你觉得你花大量的时间来搞清楚如何做到什么应该是一个简单的任务的利益的一种形式中,我要说的是跳过它!

如果你想帮助一些更具体的,但是,我会更乐于帮助。只是造成另一个问题时(或更新这一)我会做我最好的帮助。

whycantitbemorethan25c提到它们上面,但是 ViewScripts 给你非常精细的控制呈现的形式。改变意味着要快,因此,它假定的许多缺省值样的标准装饰和单元的方式,他们加入形成的对象。与这样你可以跳多少的,这和把所有的元素,但是你就像在正常HTML。

不要跳过的概念修饰完全。它们风格的各个要素,即使他们是在使用一样以后。例如,可以使用它们对于错误信息,如其他人已经提出了建议。

如果你有非常复杂的形式具有多个数据点,与类似的行动(觉得一个清单的用户与有效/无效的按钮和删除按钮每个)应该考虑 Zend_Form_SubForm.电子窗体可以利用的ViewScripts就像普通的形式,如果你级联的一种形式一样,带子窗体,与他们自己的ViewScripts你结束了很好的载逻辑和显示更强有力的不仅仅是一个直接的形式。

我写了一些子类来Zend_Form和装饰器,使其布局的形式在一个

。它甚至有一些特殊的技巧做,比如让多个提交按钮显示在同一行。

黑客花了围绕得到它的工作了一整天。这是写对Zend的1.5.1所以不知道这是否会与当前版本的工作,但如果你有兴趣,我可以大概上传源的地方。

这似乎是与Zend形成非常常见的抱怨。

(我知道我会得到便便,poo'd由CSS纯粹主义者在使用表格来布局形式,虽然我同意,CSS是更好地为大多数事情,我还没有使用CSS没有按看到好形式布局“T看起来像一个对接丑陋的杂牌,随着表的形式‘只是工作’几乎在每一个浏览器我需要他们。)

编辑:好的,对接丑陋组装机的说,我已经把我的代码在github上制作表格Zend的形式。转到这里看到它。 (因为gaoshan88问它。)

答案这里。希望这会帮助你。我通过信息enormal量去直到我发现它。

<table>
    <tr>
        <td>Page name: *</td>
        <td><?php echo $this->pageForm->header_title;?></td>
    </tr>

    <tr>
        <td>H1 tag: *</td>
        <td><?php echo $this->pageForm->h1_tag;?></td>
    </tr>

    <tr>
        <td>Page URL: *</td>
        <td><?php echo $this->pageForm->url;?></td>
    </tr>

    <tr>
        <td>Meta Description: </td>
        <td><?php echo $this->pageForm->meta_description;?></td>
    </tr>

    <tr>
        <td>Meta Keywords: </td>
        <td><?php echo $this->pageForm->meta_keywords;?></td>
    </tr>

    <tr>
        <td>Short Description: *</td>
        <td><?php echo $this->pageForm->short_description;?></td>
    </tr>

    <tr>
        <td colspan="2"><a href="<?php echo $this->websiteUrl;?>backend_template/list?placeValuesBeforeTB_=savedValues&TB_iframe=true&height=200&width=300&modal=true"
                           title="add a caption to title attribute / or leave blank" class="thickbox">Open iFrame Modal</a></td>
         <td>
            <a href="<?php echo $this->websiteUrl;?>backend_template/list?placeValuesBeforeTB_=savedValues&TB_iframe=true&height=200&width=300&modal=true" onclick="javascript:getDataFromAddPage()" title="Select Template For Page" class="thickbox" > TEST FORM  </a>
         </td>
    </tr>

    <tr>
        <td>Featured: </td>
        <td><?php echo $this->pageForm->featured;?></td>
    </tr>

    <tr>
        <td>Mark as 404: </td>
        <td><?php echo $this->pageForm->is_404page;?></td>
    </tr>

    <tr>
        <td>Show in Navigation Menu: </td>
        <td><?php echo $this->pageForm->in_navmain;?></td>
    </tr>

    <tr>
        <td>Show in Static Menu:</td>
        <td><?php echo $this->pageForm->in_navstatic;?></td>
    </tr>

    <tr>
        <td><?php echo $this->pageForm->submit;?></td>
        <td><?php echo $this->pageForm->button_close;?></td>
    </tr>

</table>

您可能已经通过,现在解决了这个,但我一直在做一些工作,需要一个类似的解决方案。

form->getSubform('subform'); 
foreach ($subform as $key => $value) {
//some markup and custom code here
    print $value;
//some markup and custom code here

}
?>

foreach循环内,可以添加表的标记。如果你适当命名你的钥匙你的表行,他们应该匹配了形式键。你甚至可以使用一个循环,抓住重点通过适当的子窗体,时或通过键连的元素。你可以跳过foreach循环,如果你知道钥匙,简单地说打印窗体$ [“somekey”];假设你说$形式 - > setIsArray(真)设置的主要形式; (不知道这最后一部分是绝对必要的,但对于复杂的表格,应该设置这样的反正。

我除去缺省的装饰,所以我可以有各元件内打印的完全控制。 Zend_Form中应该有一点点更容易抓住各个元素内置的方法..但我觉得这工作得很好。

希望这是有帮助的人!

肖恩McSomething的第一个建议是去为我的方式。我一直认为,这样做<?php echo $this->form ?>呈现形式过于神奇。我买了一步,但并呈现个别装饰,而不是通过$element->renderDecorator()魔术方法单个元素。这样一来,你就不必担心在其中定义了装饰的顺序。你只需要在他们那里,你将不必添加那些讨厌的,不直观HtmlTag装饰。 我犯了一个博客帖子这个

scroll top