1

再会,

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

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

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

你有什么建议吗?

谢谢

4

4 回答 4

0

领域对象

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

首先,代表表单元素的实体。我会创建Form,Fieldsets和. 每个表单有 1 个或多个字段集,每个字段集有一个或多个字段等。FieldsFieldTypes

作为我公司当前的项目,我实际上是在 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 的“添加表单”按钮来为用户创建模板文本,则此方法可以很好地工作。

于 2013-10-15T12:35:32.980 回答
0

简单方法:
将所有不同的 HTML 节点拆分为基本的 php 对象,例如单选按钮、复选框、选择、文件、文本区域和输入。为他们每个人提供一些验证,如输入的整数。使用它们的内置表示将它们传递给表单构造类。

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

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

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

我认为最复杂的部分是将它与 javascript 验证放在一起,你可能只为某些适配器和数据类型启用它。

于 2013-10-08T15:44:15.410 回答
0

一种可能的解决方案:

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

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

前任。

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

注意:您将需要构建其他函数来处理提交时的表单。

于 2013-10-15T14:08:01.780 回答
0

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

PHP

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

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

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

jQuery cms 端

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

此外,您应该将 html 结构留给您的 php 类。用户无需更改它。只需为他们的女巫造型创建一个模板。

于 2013-10-14T07:41:44.543 回答