3

我知道这听起来很像“是否有一个 PHP 框架可以为我完成整个工作?” 但请忍受我。

假设我想为一个营地创建一个注册表单,并且我有一个简单的数据结构——

  • 地址

地址

  • 1号线
  • 2号线
  • 市郊

ETC

我所看到的部分但不是我想要的全部:

像 jFormer 和 ValidForm 这样的 PHP 表单库(更不用说所有的大框架了):这些东西让你可以使用一点 PHP 来定义你想要制作的表单——所以你会说“添加文本字段,添加文本区域”,等等——但它们不会让用户编辑表单数据结构,也不会自动保存到数据结构中。它们对开发人员更有用。

前端表单创建者,如 foxyform、jotform:他们让用户编辑表单,但后端需要以其他方式完成,并且没有链接。

然后是Wordpress Pods CMS,这几乎正是我想要的——但没有 wordpress 部分。

理想情况下,我想要两件事之一:

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 回答