Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Zend中为CMS创建表单生成器?_Php_Forms_Zend Framework - Fatal编程技术网

Php 在Zend中为CMS创建表单生成器?

Php 在Zend中为CMS创建表单生成器?,php,forms,zend-framework,Php,Forms,Zend Framework,你好 我已经创建了一个CMS来显示页面,但是我现在看到用户希望能够插入自定义表单,以及他们选择的字段 我认为应该将表单字段添加到链接到表单表的字段表中。其中,诸如字段数据类型和验证以及信息是否应存储在数据库中或发送表单的电子邮件地址中等内容将被存储,然后用于在CMS前端生成表单 现在在页面中显示实际表单。。。 用户如何设置字段在内容中的位置?我现在只有一个文本编辑器(ckeditor),用户可以在其中更改要显示的内容……他们如何告诉CMS在该特定页面中放置表单,以及CMS如何知道将表单添加到特定

你好

我已经创建了一个
CMS
来显示页面,但是我现在看到用户希望能够插入
自定义表单
,以及他们选择的字段

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

现在在页面中显示实际表单。。。 用户如何设置字段在内容中的位置?我现在只有一个
文本编辑器(ckeditor)
,用户可以在其中更改要显示的内容……他们如何告诉CMS在该特定页面中放置表单,以及CMS如何知道将表单添加到特定页面

你有什么建议吗

谢谢

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

艰难的道路:
另一种方法是通过逻辑分割提供的数据,因此列表、文本、文件和一个选项。 文本可以有多个子类型,如integer、float、date-email等等(PHP的正则表达式验证器在这里非常好)。此外,对于某些应用程序,您可能会存储可用的选项或某个域

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

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


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

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

PHP

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

使用方法
$html=$form->getHTML()你可以抓取html。is只需循环遍历所有表单元素对象并调用它们的getHTML方法

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

Jquery cms端

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


您还应该将html结构留给php类。用户没有必要改变这一点。只需为他们创建一个模板

域对象

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

首先,是表示表单元素的实体。我将创建
表单
字段集
字段
字段类型
。每个表单有一个或多个字段集,每个字段集有一个或多个字段等

实际上,我正在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\u Form\u Element*
类(如
$attributes
$name
$options
等)的属性,这将在需要在页面上呈现它们时帮助您

占位符

大多数CMS系统都有某种“占位符”功能,“页面”被分解为几个“位置”,如页眉、页脚、标题、内容等。同样,这些“位置”可以建模为用户可编辑的实体,用户可以在其中“分配”一个或多个“内容项”给每个占位符,比如你的表格

基本思想实际上是一种基于多个其他视图文件(有点像部分视图)构建页面视图的方法,其中的内容是根据配置动态生成的

幸运的是,Zend框架还提供了创建此类占位符的功能:

视图占位符是为应用程序创建丰富布局的一种简单而强大的方法。您可以使用各种标准占位符,如前面讨论的占位符(doctype()、headTitle()、headLink()和headScript()),或者使用通用占位符()辅助工具聚合内容并以自定义方式呈现

模板化

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

<
##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;
}