如何实现一个选择的形式?
当显示一个表单,你经常希望用户之间做出选择的可能性。
在HTML中,由一个选择选择
标签:
你可以添加一个多个
属性使其接受几种选择:
的sfWidgetFormChoice
但一个选择也可以由一组单选按钮选择(单)或一个复选框列表(多个选择)。
统一所有这些可能性,symfony 1.2附带了一个新的小部件ob娱乐下载sfWidgetFormChoice
。sfWidgetFormChoice
是一个抽象的小部件因为它代表呈现另一个小部件(渲染器小部件)。
让我们看一个简单的例子来说明所有可能的组合。在一个项目中,我们有以下模式:
/ /配置/模式。yml推动:demo_article: id: ~ author_id:{类型:整数,foreignReference: id、foreignTable: demo_author, onDelete:级联,onUpdate:级联,要求:真实}状态:varchar(255)标题:varchar(255)内容:用longvarchar published_at:时间戳demo_category: id: ~名字:varchar (255) demo_author: id: ~名字:varchar (255) demo_tag: id: ~名字:varchar (255) demo_tag_article: tag_id:{类型:整数,primaryKey:真的,foreignReference: id、foreignTable: demo_tag, onDelete:级联,onUpdate:级联,要求:真实}article_id:{类型:整数,primaryKey:真的,foreignReference: id、foreignTable: demo_article, onDelete:级联,onUpdate:级联,要求:真实}demo_category_article: category_id添加:{类型:整数,primaryKey:真的,foreignReference: id、foreignTable: demo_category, onDelete:级联,onUpdate:级联,要求:真实}article_id:{类型:整数,primaryKey:真的,foreignReference: id、foreignTable: demo_article, onDelete:级联,onUpdate:级联,要求:真正的}
这是一个经典的模式为一个简单的CMS。文章作者,可以有多个标签和类别。每一篇文章也状态值可以是:发表
,草案
,或删除
。状态值存储为纯文本是没有表创建的存储状态。
让我们玩DemoArticle
模型通过创建一个模块,提供了基本的CRUD操作:
php syob娱乐下载mfony推动美元:构建所有php symfony推动美元:generate-module前端DemoArticle条
如果您导航到编辑页面,您将看到这样的:
如果你有看的形式生成类DemoArticle
模型(lib /形式/基地/ BaseDemoArticle.class.php
),你会发现symfony的用途ob娱乐下载sfWidgetFormPropelChoice
为author_id
小部件和sfWidgetFormPropelChoiceMany
为demo_category_article_list
和demo_tag_article_list
小部件。ob娱乐下载symfony猜测最好的小部件使用基于模式定义。
sfWidgetFormPropelChoice
代表一个单一的基于一个推动对象和选择小部件sfWidgetFormPropelChoiceMany
代表一个多项选择小部件也基于一个推动对象。
自定义表单
我们可以做的第一件事来定制我们的形式是转换状态
小部件的选择:
首先,我们需要定义的状态DemoArticlePeer
模型类:
/ / lib /模型/ DemoArticlePeer.php类DemoArticlePeer扩展BaseDemoArticlePeer{静态受保护的美元的选择=数组(“发布”= >“发布”,“草案”= >“草案”,“删除”= >“删除”);静态公共函数getStatusChoices(){返回自我::美元的选择;}}
然后,编辑DemoArticleForm
类来改变小部件和相关的验证器状态
字段:
/ / lib /形式/ DemoArticleForm.class.php类DemoArticleForm扩展BaseDemoArticleForm{公共函数配置(){这个美元- >widgetSchema(“状态”]=新sfWidgetFormChoice(数组(“选择”= > DemoArticlePeer::getStatusChoices()));这个美元- >validatorSchema(“状态”]=新sfValidatorChoice(数组(“选择”= >中的(DemoArticlePeer::getStatusChoices())));}}
的sfWidgetFormChoice
需要选择使用的数组选择
标签的选择
选择。
的sfValidatorChoice
还需要一个选择
选择的有效值状态
列的键DemoArticlePeer: getStatusChoices ()
数组)。
玩的选择
单选按钮列表
时间玩的sfWidgetFormChoice
小部件!正如你所看到的在前面的截图,现在的状态是由一个表示选择
标签。但随着值数量的地位是很低的,这将是更好的显示状态列单选按钮:
这很容易实现。的sfWidgetFormChoice
以一个扩大
选择的输出变化选择
标记一个单选按钮列表:
这个美元- >widgetSchema(“状态”]=新sfWidgetFormChoice(数组(“选择”= > DemoArticlePeer::getStatusChoices(),“扩展”= >真正的,));
复选框列表
的类别列表也非常小,所以它会更好显示它们作为一个复选框列表:
的扩大
选择我们有用于单一的选择还可以用于多项选择小部件。小部件生成的基本形式类和不需要改变,我们可以设置扩大
选项真正的
:
这个美元- >widgetSchema(“demo_category_article_list”]- >setOption(“扩展”,真正的);
总结
下表总结了不同的配置sfWidgetFormChoice
和渲染器小部件使用symfony:ob娱乐下载
sfWidgetFormChoice |
扩大 是假 |
扩大 是真正的 |
---|---|---|
多个 是假 |
sfWidgetFormSelect |
sfWidgetFormSelectRadio |
多个 是真正的 |
sfWidgetFormSelectMany |
sfWidgetFormSelectCheckbox |
相同的表和一些截图:
sfWidgetFormChoice |
扩大 是假 |
扩大 是真正的 |
---|---|---|
多个 是假 |
||
多个 是真正的 |
组织你的选择
一个不知名的可能性的选择
标签是你可以把你的选择optgroup
特点:
的sfWidgetFormChoice
家庭小部件内置支持组。你只需要通过一个数组的数组选择
选项:
美元的选择=数组(“欧洲”= >数组(“法国”= >“法国”,“西班牙”= >“西班牙”,“意大利”= >“意大利”),“美国”= >数组(“美国”= >“美国”,“加拿大”= >“加拿大”,“巴西”= >“巴西”),);这个美元- >widgetSchema(“国家”]=新sfWidgetFormChoice(数组(“选择”= >美元的选择));
你当然可以扩大一个单选按钮列表:
这个美元- >widgetSchema(“国家”]=新sfWidgetFormChoice(数组(“选择”= >美元的选择,“扩展”= >真正的,));
您还可以自定义渲染器小部件使用的布局:
这个美元- >widgetSchema(“国家”]=新sfWidgetFormChoice(数组(“选择”= >美元的选择,“扩展”= >真正的,“renderer_options”= >数组(“模板”= >' <强> % % < /强> %选项分组%”),));
是的,它同样适用于多个
选择:
更多使用JavaScript
这是很容易。让我们添加一些JavaScript来探索更多的可能性。
双列表
如果我们的CMS是广泛使用,我们会有越来越多的标签,它将变得越来越难以发现与本文相关的标签。在这种情况下,双列表小部件是一个最好的解决方案:
直到现在,symfonob娱乐下载y选择最好的小部件使用基于一些简单的配置(多个
和扩大
)。但是,sfWidgetFormChoice
不能使我们的吗选择
标签小部件作为一个列表的两倍。
很幸运,我们知道sfWidgetFormChoice
代表呈现到另一个小部件。改变呈现小部件一样简单的修改renderer_class
选择。
如果你安装sfFormExtraPlugin
,你会发现很多有趣的小部件和验证器非常有用,但没有成为核心,因为他们有第三方依赖关系。
的sfWidgetFormSelectDoubleList
小部件就是其中之一:
这个美元- >widgetSchema(“demo_tag_article_list”]- >setOption(“renderer_class”,“sfWidgetFormSelectDoubleList”);
如果你现在刷新页面,它不会工作部件依赖一些JavaScript正常工作。小部件API文档包含所有你需要欧宝官网下载app知道正确地配置:
/ /应用程序/前端/模块/文章/模板/ _form.php< ? phpuse_javascript(' / sfFormExtraPlugin / js / double_list.js ')? ><表单动作=“< ?php echo url_for (@article_update) ? > "> <表>< ? php回声美元的形式? >< !——……- - > < /表> > < /形式
自动完成
我们没有玩author_id
字段。假设我们有很多作者对CMS,真的很多。它不是很容易找到在一个很长的名单在一个下拉选择标记。所以,让我们把这个自动完成小部件。
这是令人印象深刻的,不是吗?使它工作,我们将不得不比以前更多的工作。
sfFormExtraPlugin
包含两个自动完成部件基于JQuery库:
sfWidgetFormJQueryAutocompleter
:可用于任何自动完成任务sfWidgetFormPropelJQueryAutocompleter
:为推动相关自动完成优化
在我们这样的情况,我们将使用基于推动的:
/ / lib /形式/ DemoArticleForm.class.php这个美元- >widgetSchema(“author_id”]- >setOption(“renderer_class”,“sfWidgetFormPropelJQueryAutocompleter”);这个美元- >widgetSchema(“author_id”]- >setOption(“renderer_options”,数组(“模型”= >“DemoAuthor”,“url”= >这个美元- >getOption(“url”),));
我们有一些选项传递给小部件的设置renderer_options
。在这些选项,您可能已经注意到url
被设置为一个url
表单选项($ this - > getOption (url)
)。当你创建一个表单实例,第一个构造函数参数的默认值,第二个是一个数组的选项:
公共函数executeEdit(美元的请求){/ /……这个美元- >形式=新DemoArticleForm(美元的文章,数组(“url”= >这个美元- >getController()- >genUrl(“文章/ ajax”)));/ /……}
现在我们需要创建文章/ ajax
行动。当小部件调用这个动作,它通过几个请求参数:
问
:用户输入的字符串限制
:返回条目的最大数量
这是代码:
/ /应用程序/前端/模块/文章/行动/ actions.class.php公共函数executeAjax(美元的请求){这个美元- >getResponse()- >setContentType(“application / json”);美元的作者= DemoAuthorPeer::retrieveForSelect(美元的请求- >getParameter(“问”),美元的请求- >getParameter(“限制”));返回这个美元- >renderText(json_encode(美元的作者));}/ / lib /模型/ DemoAuthorPeer.php类DemoAuthorPeer扩展BaseDemoAuthorPeer{静态公共函数retrieveForSelect(美元的问,美元的限制){美元标准=新标准();美元标准- >添加(DemoAuthorPeer::的名字,“%”。美元的问。“%”标准::就像);美元标准- >addAscendingOrderByColumn(DemoAuthorPeer::的名字);美元标准- >setLimit(美元的限制);美元的作者=数组();foreach(DemoAuthorPeer::doSelect(美元标准)作为美元的作者){美元的作者(美元的作者- >getId()]=(字符串)美元的作者;}返回美元的作者;}}
现在,每一个JavaScript小部件,我们还需要一些文件添加到表单模板,让它正常工作:
/ /应用程序/前端/模块/文章/模板/ _form.php< ? phpuse_javascript(' / sfFormExtraPlugin / js / jquery.autocompleter.js ')? >< ? phpuse_stylesheet(' / sfFormExtraPlugin / css / jquery.autocompleter.css ')? >< !——……- - >
做完了。我们现在有一个自动完成部件能够显示作者的名字,并提交作者id的形式。感谢验证器,我们相信,只有有效的id被提交并保存到数据库中。
最终形式
这是最终的形式显示所有的不同的方式要求用户选择:
这是一个很大的灵活性的一个小部件!
这个工作许可适用创作共用署名下衍生著作3.0 Unported许可执照。