2012-07-19 52 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。 有很多可以完成的改进,但总的想法在这里。 随时改进它,让你的!