1

良い一日、

ページを表示するために作成しましたが、ユーザーが選択したフィールドCMSを挿入できるようにしたいことがわかりました。custom forms

テーブルにリンクされてform fieldsいるテーブルに追加する必要があると考えています。フィールドのデータ型や検証、情報をデータベースに保存するか、フォームの送信先の電子メール アドレスを保存するかなどの情報が保存され、CMS のフロント エンドでフォームを生成するために使用されます。fieldsforms

ページに実際のフォームを表示するには...ユーザーはどのようにコンテンツ内のフィールドの位置を設定するのでしょうか? 私が今持っているのはtext editor (ckeditor)、ユーザーが表示するコンテンツを変更できる場所だけです...特定のページにフォームを配置するようにCMSにどのように指示できますか?また、CMSはフォームを特定のページに追加することをどのように認識しますか?

何か提案はありますか?

ありがとう

4

4 に答える 4

0

ドメイン オブジェクト

希望する柔軟性に応じて、ユーザーのカスタム フォーム データを保持する多数のエンティティ/ドメイン オブジェクトを作成する必要があります。

まず、フォーム要素を表すエンティティ。FormFieldsetsFieldsおよびを作成します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 の「フォームを追加」ボタンがあれば、うまく機能します。

于 2013-10-15T12:35:32.980 に答える
0

@ mjb4 が言ったように、独自のフォーム クラスを作成できます。クラスは新しいフォーム要素を追加でき、すべてのフォーム要素はクラス内のオブジェクトです。私はこれを自分でやったことがありますが、とても便利です。

PHP

フォーム自体はデータベースに保存され、フォーム クラスによってロードできます。すべてのフォーム要素に対応するクラスを開始します。その後、個々のフォーム プロパティを変更できます。新しいフォーム要素を追加したり、一部を削除したりすることもできます。

メソッド$html = $form->getHTML();を使用すると、html を取得できます。すべてのフォーム要素オブジェクトを単純にループし、getHTML メソッドを呼び出すだけです。

フォームを送信するときは、再度クラスを使用して検証します。すべてのフォーム要素をループし、validateMe メソッドを呼び出します。すべてのオブジェクトは、フォーム要素の名前を認識しており、$_REQUEST配列内でそれを探します。

Jquery cms側

Jquery を使用してフォーム クリエーターを作成し、フォーム スキームをデータベースに保存できます。フォーム データを保存するための 2 つのオプションをユーザーに提供します。1: フォーム データを電子メールで送信します。2: 新しい db テーブルを作成し、一意の ID を持つデータを挿入します。オプション 2 を指定する場合、フォーム データを表示するページ (公開または非公開) を作成するレポート作成者も必要です。

また、html 構造は php クラスに任せる必要があります。ユーザーがそれを変更する必要はありません。魔女のスタイリング用のテンプレートを 1 つ作成するだけです。

于 2013-10-14T07:41:44.543 に答える
0

あなたのための1つの可能な解決策:

クライアントが作成する各フォームには、一意の名前または 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 に答える