6.5 在视图中打印表单

此刻,我们已经使用控制器逻辑操作过一条模型记录,并且向该记录请求了一个表单对象。现在我们要在视图中显示这个表单对象。Solar有一整套手动渲染表单的视图辅助类,但是这里我们关心的是如何使用Solar_View_Helper_Form辅助类自动的显示表单,你可以在视图脚本中使用$this->form()来操作该辅助类。

[Note]Note

对于大多数操作,Solar_View_Helper_Form使用“流畅的”方法。这意味着你可以把所有方法链接在一起,只通过一次调用就可以按顺序执行一系列操作。

显示表单最简单的方法是使用$this->form()->auto()方法。这个方法将使用Solar_Form ,并且为我们自动建立表单元素。我们在博客演示示例中的edit.php视图中已经见过这种操作了。

<?php
    echo $this->form()             // fluent form helper
              ->auto($this->form)  // auto-build from a Solar_Form object
              ->addProcess('save') // add a "Save" button
              ->fetch();           // fetch the xhtml output
[Note]Note

为什么要调用addProcess()方法?模型记录的newForm()方法没有添加提交按钮,因为它完全没有必要知道调用逻辑将如何使用表单。因此,我们在视图中使用process keys添加提交按钮;process keys允许控制器获取终端用户点击的提交按钮的类型。

上面仅仅四行代码就为你构建了一个表单,包括CSS的类和ID,这些类和ID建立在表单元素的类型、名称、属性、是否必须、是否非法等基础上。

<form action="/blog/edit/2" method="post" enctype="multipart/form-data">
    <dl class="list">
        
        <dt class="blog-status">
            <label for="blog-status" class="blog-status">Status</label>
        </dt>
        <dd class="blog-status">
            <select name="blog[status]" id="blog-status" class="input-select blog-status">
                <option value="draft" label="draft" selected="selected">draft</option>
                <option value="public" label="public">public</option>
            </select>
        </dd>
        
        <dt class="blog-title require">
            <label for="blog-title" class="blog-title require">Title</label>
        </dt>
        <dd class="blog-title require">
            <input type="text" name="blog[title]" value="A Draft Article" 
                maxlength="63" size="60" id="blog-title" class="input-text 
                blog-title require"
            />
        </dd>
        
        <dt class="blog-body">
            <label for="blog-body" class="blog-body">Body</label>
        </dt>
        <dd class="blog-body">
            <textarea name="blog[body]" rows="18" cols="60" id="blog-body" 
                class="input-textarea blog-body">My, it sure is drafty in here.</textarea>
        </dd>
        
        <dt class="process-save">
        </dt>
        <dd class="process-save">
            <input type="submit" name="process" value="Save" id="process-save"
                class="input-submit process-save" />
        </dd>
        
    </dl>
</form>