2012-07-19 56 views
3

我知道這聽起來很像「是否有一個PHP框架,做我的整個作業我嗎?」但請忍受我。PHP/JavaScript表單生成器/架構定義者

說我想創建一個陣營註冊表單,我心裏有一個簡單的數據結構 -

  • 地址

地址

  • 線1
  • 線2
  • 郊區

事情我已經看到了做,但不是所有我想要的部分:

像jFormer和ValidForm這樣的PHP表單庫(更不用說所有的大型框架了):這些東西讓你使用一點PHP來定義你想要的表單 - 所以你會說「添加文本字段,添加textarea」等等,但是它們不允許用戶編輯表單數據結構,也不會自動保存到數據結構中。它們對開發人員更有用。

前端形式的創作者一樣foxyform,jotform:他們讓用戶編輯的形式,但後端需要一些其他的方式來完成,並且它沒有聯繫起來。

再有就是Wordpress Pods CMS,這幾乎正是我想要的 - 但沒有WordPress的一部分。

理想情況下,我想兩件事情之一:

1),你在一些相當簡單的方式定義您的數據模式,如A microframework說JSON或YAML - 你的基本

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

它會採取這一點,並創建你需要的形式,甚至可能創建數據庫模式等等。然後,您可以得到的數據對象的保持在其他地方你的代碼以迭代(我不是夠瘋狂嘗試,並自動執行,以及...或者,也許我,但肯定感覺這個特殊封裝的範圍之內) 。

OR

2)以上,再加上編輯數據模式的小編輯器。

Create data type: 

Name: [Person] 

Fields: 

    First name: [Text field] 

[+ Add field] 

我有一個很好的看看,並沒有發現任何小的和獨立的,只是這一點。莢CMS幾乎正是我想要的,但體積更小,更清潔,不依賴於WordPress的。

這樣的事情是否存在?如果不是的話 - 我在這裏偏向意見,但我會抓住機會 - 看起來應該存在這樣的事情嗎?能夠將這樣的東西放到任何應用程序中,並且自己編寫架構或允許用戶編輯它,不是很好嗎?它看起來並不那麼困難,而且在很多情況下都可以使用。

+0

Silverstripe相當接近http://doc.silverstripe.org/framework/en/tutorials/3-forms – 2012-07-19 04:19:13

+0

這個鏈接真的不是我想要的。但是,Silverstripe DOES有一個非常接近的UserDefinedForm模塊。缺失的鏈接將有能力使用結果數據,而且重要的是能夠處理關係。例如,我真的想保存到Person,Address等對象中,然後能夠將許多人員放入營地。但Silverstripe是我用於當前版本的,所以有意或無意,我們在相同的波長:D – 2012-07-19 04:27:35

+0

我想嘗試Silverstripe,但一直在慢慢地從PHP遷移。無論如何,最後一個鏈接:http://www.symfony-project.org/forms/1_2/en/11-Doctrine-Integration – 2012-07-19 04:36:45

回答

-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。 有很多可以完成的改進,但總的想法在這裏。 隨時改進它,讓你的!