ドメイン オブジェクト
希望する柔軟性に応じて、ユーザーのカスタム フォーム データを保持する多数のエンティティ/ドメイン オブジェクトを作成する必要があります。
まず、フォーム要素を表すエンティティ。Form
、Fieldsets
、Fields
およびを作成しますFieldTypes
。各フォームには 1 つ以上のフィールドセットがあり、各フィールドセットには 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 システムには、ある種の「プレースホルダー」機能があります。「ページ」は、ヘッダー、フッター、タイトル、コンテンツなどのいくつかの「場所」に分割されます。ここでも、これらの「場所」は、ユーザーが編集可能なエンティティとしてモデル化できます。ユーザーは、フォームなどの各プレースホルダーに 1 つ以上の「コンテンツ項目」を「割り当てる」ことができます。
基本的な考え方は、構成に基づいてコンテンツが動的に生成される他の複数のビュー ファイル (ビュー パーシャルのようなもの) に基づいてページ ビューを構成する方法です。
幸いなことに、Zend Framework には、そのようなプレースホルダーを作成する機能も用意されています。彼らのドキュメントには次のように書かれています:
ビュー プレースホルダーは、アプリケーションの豊富なレイアウトを作成するためのシンプルで強力な方法です。説明したもの (doctype()、headTitle()、headLink()、および headScript()) などのさまざまな標準プレースホルダーを使用するか、汎用の placeholder() ヘルパーを使用してコンテンツを集約し、独自の方法でレンダリングすることができます。
テンプレート化
プレースホルダーは、設定された領域でコンテンツを見つけるのに役立ちます。ただし、ユーザーがフォームをテキスト コンテンツ内に直接レンダリングしたい場合 (ckeditor)、この方法は機能しません。
1 つの解決策は、フォームにある種のテンプレート システムを実装することです。この場合、セットのテキスト テンプレートがコンテンツに配置されます。
例えば:
「これは私の連絡先 [FORM][id=123][name=contact-us][FORM] フォームです。すべてのフィールドに入力してください」
フォームをレンダリングするときに、このテンプレートを実際のフォーム HTML に置き換えます。この方法は、誤検知がないようにテンプレートを作成し、ユーザー用のテンプレート テキストを作成するための JS の「フォームを追加」ボタンがあれば、うまく機能します。