在Zend中为CMS创建表单构建器?

时间:2013-09-30 14:20:21

标签: php forms zend-framework

美好的一天,

我创建了一个CMS来显示页面,但我现在看到用户希望能够使用他们选择的字段插入custom forms

我认为应该将form fields添加到链接到fields表的forms表中。其中诸如字段数据类型和验证之类的内容以及信息是否应存储在数据库中或发送表单的电子邮件地址将被存储,然后用于在CMS的前端生成表单。

现在用于在页面中显示实际表单... 用户如何设置字段在内容中的位置?我现在所拥有的只是text editor (ckeditor),用户可以在其中更改要显示的内容...他们如何告诉CMS在该特定页面中放置表单以及CMS如何知道将表单添加到特定页面?

你有什么建议吗?

由于

4 个答案:

答案 0 :(得分:0)

简单方法:
将所有不同的HTML节点拆分为基本的php对象,如radiobutton,checkbox,select,file,textarea和input。 为它们提供一些验证,如输入的整数。使用内置表示法将它们传递给表单构造类。

艰难的方式:
另一种方法是逻辑分割提供的数据,列表,文本,文件和一个选项。 文本可以有多个子类型,如整数,浮点数,日期电子邮件,你喜欢什么(PHP的正则表达式验证器在这里非常好)。对于某些人,您可能会存储可用的选项或某些域名,......

对于其中一些类型,您可以使用不同的选项在网站上呈现它们,即列表可以是多个输入元素,一个带有分隔符的textarea或只是一个多选择框。 因此,您可能希望从它们所代表的数据类型中使这些独立,这意味着您需要为这些基本数据类型(适配器)呈现HTML的类。

这些适配器将通过获取一个数据类型对象来构造,呈现由某个表单对象调用的HTML,而不是转换数据并将其发送到数据类型。然后,这些将验证它们并将它们存储在您的数据库或其他任何内容中。

我认为最复杂的部分是将这个与javascript验证结合在一起,让你可以为某些适配器和数据类型启用它。

答案 1 :(得分:0)

正如@ mjb4所说,你可以创建自己的表单类。该类可以添加新的表单元素,每个表单元素都是类中的对象。我自己做了这个,非常方便。

<强> PHP

表单本身保存在数据库中,可以由表单类加载。它为每个表单元素启动相应的类。然后,您可以更改单个表单属性。您还可以添加新表单元素或删除一些。

使用方法$html = $form->getHTML();,您可以获取html。简单地循环遍历所有表单元素对象并调用它们的getHTML方法。

发送表单时,您再次使用该类进行验证。它遍历所有表单元素并调用其validateMe方法。每个对象都知道表单元素的名称,并在$_REQUEST数组中查找它。

Jquery cms方

您可以使用Jquery创建表单创建者并将表单方案保存到数据库中。为用户提供两种保存表单数据的选项。一:给表单数据发送电子邮件。二:创建新的db表并插入具有唯一id的数据。在给出选项二时,还应该有一个报表创建者,它创建一个显示表单数据的页面(公共或私有)。

另外你应该把html结构留给你php类。用户无需更改。只需创建一个模板,为他们造型。

答案 2 :(得分:0)

域对象

根据您所需的灵活性,您需要创建一些实体/域对象,这些对象将保存用户自定义表单数据。

首先,表示表单元素的实体。我会创建FormFieldsetsFieldsFieldTypes。每个表单都有一个或多个字段集,每个字段集都有一个或多个字段等。

我实际上是在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 Framework还提供了创建此类占位符的功能。 Their documentation says

  

查看占位符是一种简单而强大的方法,可用于为应用程序创建丰富的布局。您可以使用各种标准占位符,例如讨论的那些(doctype(),headTitle(),headLink()和headScript()),或使用通用占位符()帮助程序聚合内容并以自定义方式呈现它。

<强>模板

占位符可以帮助您找到设置区域中的内容。但是,如果用户希望直接在文本内容(您的ckeditor)中呈现表单,则此方法不起作用。

一种解决方案是为表单实现某种模板系统,其中在内容中放置一组文本模板。

例如:

  

“这是我的联系方式[FORM] [id = 123] [name = contact-us] [FORM]表格请填写所有字段”

当您呈现表单时,您将此模板替换为实际表单HTML。这种方法可以很好地工作,只要你在模板上有创意就可以确保没有误报,也许还有一些JS'添加表单'按钮来为用户创建模板文本。

答案 3 :(得分:0)

一种可能的解决方案:

您的客户端将创建的每个表单都将具有唯一的名称或ID。

他们将使用CMS编辑页面内容。他们会在他们希望出现的地方放置一个唯一的代码(商定的格式)。

离。

##FORM_CONTINER_CONTACT_US##  // in this case the form is contact us based on ##FORM_CONTINER_XXXX## where XXX could be string or Id.

从数据库中提取页面内容后,将其传递给新功能

public function insertFormContiner($pageContetnt)
{
    // find the form container in $pageContent use regular expression to find it
    // get the unique name of the form container CONTACT_US in this case
    // build the form from the database (get the full html) 
    // replace the new created from with ##FORM_CONTINER_CONTACT_US## in this case

    // view the finale content of the page
    return $pageContent;
}

注意:您需要构建其他功能以在提交时处理表单。