领域对象
根据您想要的灵活性,您将需要创建许多实体/域对象来保存用户自定义表单数据。
首先,代表表单元素的实体。我会创建Form
,Fieldsets
和. 每个表单有 1 个或多个字段集,每个字段集有一个或多个字段等。Fields
FieldTypes
作为我公司当前的项目,我实际上是在 ZF2 中构建一个表单构建器,我从一个通用元素开始,该元素可以扩展到所有表单“元素”
/**
* Base form element that all form elements extend
*/
abstract class Element implements ElementInterface, AttributeCollectionAwareInterface
{
/**
* @var string
* @ODM\Id
*/
protected $id;
/**
* @var string
* @ODM\Field(type="string")
*/
protected $name;
/**
* @var string
* @ODM\Field(type="string")
*/
protected $label;
/**
* $attributes
*
* Map of form element attributes
*
* @var array
* @ODM\ReferenceMany(targetDocument="JobboardBase\Document\Form\Attribute")
*/
protected $attributes;
/**
* $options
*
* Map of form element options
*
* @var Doctrine\Common\Collections\Collection
* @ODM\ReferenceMany(targetDocument="JobboardBase\Document\Form\Option")
*/
protected $options;
/**
* @var status
*
* @ODM\ReferenceOne(targetDocument="JobboardBase\Document\Form\Status")
*/
protected $status;
/**
* $dateCreated
*
* The form creation date
*
* @var \MongoDate
* @Gedmo\Timestampable(on="create")
* @ODM\Field(type="date")
*/
protected $dateCreated;
/**
* $dateUpdated
*
* The form updated date
*
* @var \MongoDate
* @Gedmo\Timestampable(on="update")
* @ODM\Field(type="date")
*/
protected $dateUpdated;
这些实体应该具有尽可能接近 Zend 现有Zend_Form_Element_*
类的属性(例如$attributes
、等) $name
,$options
这将在您需要在页面上呈现它们时为您提供帮助。
占位符
大多数 CMS 系统都具有某种“占位符”功能——“页面”被分解为多个“位置”,例如页眉、页脚、标题、内容等。这些“位置”也可以建模为您可以编辑的实体用户,他们可以将一个或多个“内容项”“分配”给每个占位符,例如您的表单。
基本思想实际上是一种基于多个其他视图文件(有点像视图部分)组成页面视图的方法,其中的内容是根据配置动态生成的。
幸运的是,Zend 框架还提供了创建此类占位符的能力。他们的文件说:
视图占位符是一种为应用程序创建丰富布局的简单而强大的方法。您可以使用各种标准占位符,例如讨论的那些(doctype()、headTitle()、headLink() 和 headScript()),或使用通用 placeholder() 帮助器来聚合内容并以自定义方式呈现它。
模板
占位符可以帮助您在设定的区域中定位内容。但是,如果用户希望直接在文本内容(您的 ckeditor)中呈现表单,则此方法将不起作用。
一种解决方案是为您的表单实现某种模板系统,其中将设置的文本模板放置在内容中。
例如:
“这是我的联系我们 [FORM][id=123][name=contact-us][FORM] 表格,请填写所有字段”
当您呈现表单时,您将此模板替换为实际的表单 HTML。如果您在模板上有创意以确保没有误报,并且可能有一些 JS 的“添加表单”按钮来为用户创建模板文本,则此方法可以很好地工作。