【问题标题】:Creating a form builder for a CMS in Zend?在 Zend 中为 CMS 创建表单构建器?
【发布时间】:2013-09-30 14:20:20
【问题描述】:

美好的一天,

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

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

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

你有什么建议吗?

谢谢

【问题讨论】:

    标签: php forms zend-framework


    【解决方案1】:

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

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

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

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

    我认为最复杂的部分是将其与 javascript 验证结合在一起,您可能只需为某些适配器和数据类型启用此功能。

    【讨论】:

      【解决方案2】:

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

      PHP

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

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

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

      Jquery cms 端

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

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

      【讨论】:

        【解决方案3】:

        域对象

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

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

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

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

        模板

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

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

        例如:

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

        当您呈现表单时,您会将此模板替换为实际的表单 HTML。如果您在模板上有创意以确保没有误报,并且可能有一些 JS 的“添加表单”按钮来为用户创建模板文本,则此方法可以很好地工作。

        【讨论】:

          【解决方案4】:

          一种可能的解决方案:

          您的客户将创建的每个表单都有一个唯一的名称或 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;
          }
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-06-20
            • 1970-01-01
            • 2010-12-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多