3

これは、「自分の仕事をすべてやってくれる PHP フレームワークはありますか?」のように聞こえるかもしれません。しかし、我慢してください。

キャンプのサインアップ フォームを作成したいとします。単純なデータ構造を念頭に置いています。

  • ファーストネーム
  • 苗字
  • 住所

住所

  • ライン1
  • 2行目
  • 郊外

私が見たものは、私が望むものの一部ではありますが、すべてではありません:

jFormer や ValidForm などの PHP フォーム ライブラリ (すべての大きなフレームワークは言うまでもありません): これらを使用すると、作成したいフォームを PHP を少し使用して定義できます。など -- ただし、ユーザーがフォームのデータ構造を編集することはできません。また、データ構造に自動的に保存することもできません。それらは開発者にとってより便利です。

foxyform、jotform などのフロントエンド フォーム作成者: ユーザーはフォームを編集できますが、バックエンドは別の方法で行う必要があり、リンクされていません。

次に、 Wordpress Pods CMSがあります。これは、私が望んでいるものとほぼ同じですが、wordpress の部分はありません。

理想的には、次の 2 つのいずれかが必要です。

1) Json や Yaml などの合理的に単純な方法でデータ スキーマを定義するマイクロフレームワーク - 基本的な

Person
  First name: Text
  Last name: Text
  Address: has_one Address
Address
  ... and so on

そして、それを利用して、必要なフォームを作成し、データベース スキーマなどを作成することさえできます。その後、データ オブジェクトを取得して、コード内で反復処理することができます (私はそれを自動化しようとするほど頭がおかしいわけではありません... または、そうかもしれませんが、確かに、この特定のカプセル化の範囲外に感じます)。 .

また

2) 上記に加えて、データ スキーマを編集するための小さなエディター。

Create data type:

Name: [Person]

Fields:

  First name: [Text field]

[+ Add field]

私はよく見回しましたが、小さくてスタンドアロンで、これを行うものは何も見つかりませんでした。Pods CMS は私が望んでいるものとほぼ同じですが、より小さくてクリーンで、Wordpress に縛られていません。

そのようなものは存在しますか?そうでない場合、私はここで意見を逸れていますが、チャンスをつかみますが、そのようなものは存在するべきだと思いますか? このようなものを任意のアプリケーションにドロップして、スキーマを自分で作成するか、ユーザーが編集できるようにできると便利だと思いませんか? それほど難しいことではないようで、非常に多くのコンテキストで使用できます。

4

1 に答える 1

-1

そのようなパーソナライズの詳細が存在するかどうかはよくわかりませんが、試してみましょう。

まず、クラスを作成する必要があります。

class Person{
  private $first_name;
  private $last_name;
  private $adress;

  public function __construct($data=array(), adress $adress=null){
    foreach ($data as $cle => $valeur)
      $this->$cle=$valeur;
    $this->adress=$adress;
  }
  public function __get($property){
    return $this->$property;
  }
  public function __set($property,$value)
  {
    $this->$property=$value;
  }     
  public function all_object_properties() {
    return get_object_vars($this);
  }
  public function all_class_properties(){
    return get_class_vars(__CLASS__);
  }
}
class Adress{
  private $id;
  private $line_1;
  private $line_2;
  private $suburb;

  public function __construct($data=array()){
    foreach ($data as $cle => $valeur)
      $this->$cle=$valeur;
  }
  public function __get($property){
    return $this->$property;
  }
  public function __set($property,$value)
  {
    $this->$property=$value;
  }     
  public function all_object_properties() {
    return get_object_vars($this);
  }
  public function all_class_properties(){
    return get_class_vars(__CLASS__);
  }
  public function fill($id){
    $connexion=db_connect();
    $req=$connexion->prepare("SELECT * FROM adresses WHERE id=:id");
    $req->execute(array('id'=>$id));
    while ($row = $req->fetch(PDO::FETCH_ASSOC)){
      foreach ($row as $cle => $valeur)
        $this->$cle=$valeur;
    }
    return $this;
  }
  public function save(){
    $connexion=db_connect();
    $sql1="INSERT INTO adresses (";
    $sql2=" VALUES (";
    $vars=$this->all_properties();
    foreach($vars as $var=>$value){
      $sql1.=$var.", ";
      $sql2.=":".$var.", ";
    }
    $sql1=substr($sql1,0,-2).")";
    $sql2=substr($sql2,0,-2).")";
    $sql=$sql1.$sql2;
    $query=$connexion->prepare($sql);
    $query->execute($vars);
    if($query){
      $this->id=$connexion->lastInsertId();
      return true;
    }else{
      return false;
    }
  }
  public function update(){
    $connexion=db_connect();
    $sql1="UPDATE adresses SET ";
    $vars=$this->all_properties();
    foreach($vars as $var=>$value){
       $sql1.=$var."=".":".$var.", ";
    }
    $sql1=substr($sql1,0,-2)." WHERE id=:id";
    $query=$connexion->prepare($sql1);
    $query->execute($vars);
    if($query){
       return true;
    }else{
       return false;
    }
  }
}

次に、JSON や XML などのファイルに基づいてフォームを作成する機能が必要です。

<forms>
  <form>
    <host>name_of_my_page_where_my_form_is_displayed.php</host>
    <method>post</method>
    <target>#</method>
    <input>
       <type>text</type>
       <name>first_name</type>
       <class>Person</class>
    </input>
    <input>
       <type>text</type>
       <name>last_name</type>
       <class>Person</class>
    </input>
    <input>
       <type>text</type>
       <name>line_1</type>
       <class>Adress</class>
    </input>
    <input>
       <type>text</type>
       <name>suburb</type>
       <class>Adress</class>
    </input>
  </form>
</forms>

ここでは、フォームを解析して作成する関数が必要です。

function display_form($xml_file,$page_to_display){
  $content=null;
  $values=array();
  $dom = new DOMDocument;
  $dom->load($xml_file);
  $forms=$dom->getElementsByTagName("form");
  foreach($forms as $form){
    $urls = $form->getElementsByTagName( "host" );
    $url = $urls->item(0)->nodeValue;
    if($url==htmlspecialchars($page_to_display)){
      $tp_method = $form->getElementsByTagName( "method" );
      $method = $tp_method->item(0)->nodeValue;
      $tp_target = $form->getElementsByTagName( "target" );
      $target = $tp_target->item(0)->nodeValue;
      $content="<form action=".$target." method=".$method."><br/>";
      $inputs=$dom->getElementsByTagName("input");
      foreach($inputs as $input){
        $tp = $form->getElementsByTagName( "type" );
        $type = $tp->item(0)->nodeValue;
        $tp = $form->getElementsByTagName( "name" );
        $name = $tp->item(0)->nodeValue;
        $tp = $form->getElementsByTagName( "class" );
        $class = $tp->item(0)->nodeValue;
        $content.="<input type=".$type." name=".$name."/><br/>";
        $values[]=array("class"=>$class,"name"=>$name);
      }
      $content.="<input type='submit' value='Submit'/>";
    }
  }
  return array("content"=>$content,"values"=>$values);
}

最後に、フォームが表示されるページで:

<?php
$array=display_form("forms.xml",$_SERVER['REQUEST_URI']);
$content=$array['content'];
$values=$array['values'];
$classes=array();
$names=array();
foreach($values as $tab){
  $class=$tab['class'];
  $name=$tab['name'];
  $classes[]=(!in_array($class,$classes)) ? $class : null;
  $names[]=$name;
  ${$class}[]=$name;
}
$form_submitted=true;
foreach($names as $name){
  if(!isset($_POST[$name]))
    $form_submitted=false;
}
if($form_submitted){
  foreach($classes as $name_class){
    $var= new $name_class;
    foreach(${$name_class} as $value){
     $var->__set($value,$_POST[$value]);
    }
    $var->save();
  }
}
echo $content;

さらに、xml を埋める関数を作成することもできます。各クラスでは、関数 fill() を使用して ID に基づいてデータベース内のオブジェクトのデータを取得したり、save() を使用してデータベースに新しい挿入を作成したり、update() を使用して ID に基づいて既存の行を更新したりできます。 . できる改善点はたくさんありますが、一般的な考え方はここにあります。自由に改良して自分のものにしてください!

于 2012-07-19T08:04:16.563 に答える