Phalcon Form and Validate

การสร้าง form ด้วย Phalcon ทำได้ 2 แบบคือ ใช้ Phalcon\Tag กับ Phalcon\Forms\Form

สร้าง form ด้วย Phalcon\Tag

<?php  
use Phalcon\Tag;  
echo Tag::form("signup/register");  
?>

<?php echo Tag::form(array("signup/register", "method" => "post")); ?>  
 <p>
    <label for="name">Name</label>
    <?php echo Tag::textField("name") ?>
    <?php echo Tag::textField(array("name", 'maxlength' => 30, 'placeholder' => 'Type your name')) ?>
 </p>

 <p>
    <label for="email">E-Mail</label>
    <?php echo Tag::textField("email") ?>
 </p>

 <p>
    <?php echo Tag::submitButton("Register") ?>
 </p>

</form>  

อธิบาย

use Phalcon\Tag;  

ประกาศ namespace Phalcon\Tag เพื่อเริ่มใช้งาน class Tag

<?php echo Tag::form(array("signup/register", "method" => "post")); ?>  

สร้าง html element form ที่ post target ไปที่ signup/register

<?php echo Tag::textField("name") ?>  
<?php echo Tag::textField("email") ?>  
<?php echo Tag::submitButton("Register") ?>  

สร้าง input field ชื่อ name, email และปุ่ม submit ชื่อ Register

สร้าง form ด้วย Phalcon\Forms\Form

<?php  
use Phalcon\Forms\Form,  
    Phalcon\Forms\Element\Text,
    Phalcon\Forms\Element\Select;

$form = new Form();
$form->add(new Text("name"));
$form->add(new Text("email"));
?>

<?php echo Tag::form(array("signup/register", "method" => "post")); ?>

 <p>
    <label for="name">Name</label>
    <?php echo $form->render("name", array('maxlength' => 30, 'placeholder' => 'Type your name')) ?>
 </p>

 <p>
    <label for="email">E-Mail</label>
    <?php echo $form->render("email", array('maxlength' => 100, 'placeholder' => 'Type your email')) ?>
 </p>

 <p>
    <?php echo Tag::submitButton("Register") ?>
 </p>

</form>  

อธิบาย

use Phalcon\Forms\Form,  
    Phalcon\Forms\Element\Text,
    Phalcon\Forms\Element\Select;

ประกาศ namespace ท่ีจำเป็นต้องใช้ในการสร้าง form

$form = new Form();
$form->add(new Text("name"));
$form->add(new Text("email"));

สร้าง instance $form และเอา element Text ชื่อ name, emailเข้าไปไว้ข้างใน

<?php echo $form->render("name", array('maxlength' => 30, 'placeholder' => 'Type your name')) ?>  
<?php echo $form->render("email", array('maxlength' => 100, 'placeholder' => 'Type your email')) ?>  

render form element ออกมา พร้อมระบุ attribute ขณะ render

หรืออีกวิธีในการระบุ attribute ให้กับ form element คือ ระบุตั้งแต่ตอน add element ให้กับ form เลย เช่น

$form->add(new Text("email",  array(
    'maxlength' => 100, 
    'placeholder' => 'Type your email'
)));

ขณะ render ก็จะเหลือ code แค่

<?php echo $form->render("email") ?>  

เหนือชั้นไปอีกขั้น

บางครั้งเราจำเป็นต้องใช้ from element เดียวกันไปแสดงผลใน view ที่ต่างกัน พูดง่ายๆ คือเราอยากแสดงผล Form หน้าตาเดียวกันใน view ที่ทำหน้าที่ต่างกันเช่น view create กับ view edit ทั้งสอง view นี้จะแสดงผล form เหมือนกันแตกต่างกันที่ controller เบื้องหลัง ทีนี้ถ้าจะ code ซ้ำกัน ก็จะผิดหลักการ DRY ไป

Phalcon ช่วยให้เรื่องนี้ง่าย แค่ไปสร้าง class form ไว้ แล้วเรียกใช้ผ่าน Controller

ที่ /app/forms/ItemsForm.php ให้สร้าง class form ที่ extend มาจาก Phalcon\Forms

<?php  
namespace Phoenix\Forms;

use Phalcon\Forms\Form;  
use Phalcon\Forms\Element\Text;


class ItemsForm extends Form  
{
    $this->add(new Text("id",
        array('class' => 'form-control', 'id' => 'id', 'data-rule-required' => 'true')
    ));

    $this->add(new Text("name",
        array('class' => 'form-control', 'id' => 'name', 'data-rule-required' => 'true')
    ));
}

จากนั้นที่ /app/controllers/ItemsController.php เราก็เรียกใช้ ItemsForm เพื่อดึง form element แล้วโยนไปที่ variable form เพื่อให้ view จัดการ render ต่อ

use Phoenix\Forms\ItemsForm,  
...

public function newAction()  
{
    $this->tag->setDefault("id", $this->id);
    $this->tag->setDefault("name", $this->name");

    $form = new ItemsForm(new Items(), array('new' => true));
    $this->view->setVar("form", $form);
}

ที่ Views

<?php echo $form->render("email") ?>  

ศึกษาเพิ่มเติม
http://docs.phalconphp.com/en/latest/reference/tags.html#creating-forms
http://docs.phalconphp.com/en/latest/reference/tags.html