Form Phalcon

Phalcon\Forms adalah komponen yang membantu pengembang dalam penciptaan dan pemeliharaan form dalam aplikasi web.

Contoh berikut menunjukkan penggunaan dasar:

<?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("telephone"));

$form->add(new Select("telephoneType", array(
    'H' => 'Home',
    'C' => 'Cell'
)));

Formulir dapat di-render sesuai dengan definisi bentuk:

<h1>Contacts</h1>

<form method="post">

    <p>
        <label>Name</label>
        <?php echo $form->render("name") ?>
    </p>

    <p>
        <label>Telephone</label>
        <?php echo $form->render("telephone") ?>
    </p>

    <p>
        <label>Type</label>
        <?php echo $form->render("telephoneType") ?>
    </p>

    <p>
        <input type="submit" value="Save" />
    </p>

</form>

Setiap elemen dalam form dapat di-render seperti yang diinginkan oleh pengembang. Secara internal, Phalcon \ Tag digunakan untuk menghasilkan HTML yang tepat untuk setiap elemen, Anda dapat memberikan atribut html sebagai parameter kedua:

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

Atribut HTML juga dapat diatur dalam definisi elemen:

<?php

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

Memulai form 

Seperti yang terlihat sebelumnya, form dapat diinisialisasi luar kelas form dengan menambahkan elemen. Anda dapat menggunakan kembali kode atau mengatur kelas form Anda menerapkan form dalam file terpisah:

<?php

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

class ContactForm extends Form
{
    public function initialize()
    {
        $this->add(new Text("name"));

        $this->add(new Text("telephone"));

        $this->add(new Select("telephoneType", TelephoneTypes::find(), array(
            'using' => array('id', 'name')
        )));
    }
}

Phalcon\Forms\Form extend dr Phalcon \ DI \ Injectable sehingga Anda memiliki akses ke layanan aplikasi jika diperlukan:

<?php

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

class ContactForm extends Form
{

    /**
     * This method returns the default value for field 'csrf'
     */
    public function getCsrf()
    {
        return $this->security->getToken();
    }

    public function initialize()
    {

        //Set the same form as entity
        $this->setEntity($this);

        //Add a text element to capture the 'email'
        $this->add(new Text("email"));

        //Add a text element to put a hidden csrf
        $this->add(new Hidden("csrf"));
    }
}

Entitas terkait ditambahkan ke form pada inisialisasi dan pilihan kustom pengguna diberikan ke form konstruktor:

<?php

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

class UsersForm extends Form
{
    /**
     * Forms initializer
     *
     * @param Users $user
     * @param array $options
     */
    public function initialize($user, $options)
    {

        if ($options['edit']) {
            $this->add(new Hidden('id'));
        } else {
            $this->add(new Text('id'));
        }

        $this->add(new Text('name'));
    }
}

Dalam membuat instance form Anda harus menggunakan:

<?php

$form = new UsersForm(new Users(), array('edit' => true));

Validasi 

Form Phalcon terintegrasi dengan komponen validasi  untuk menawarkan validasi instan. Built-in atau kustom validator bisa diatur untuk setiap elemen:

<?php

use Phalcon\Forms\Element\Text,
    Phalcon\Validation\Validator\PresenceOf,
    Phalcon\Validation\Validator\StringLength;

$name = new Text("name");

$name->addValidator(new PresenceOf(array(
    'message' => 'The name is required'
)));

$name->addValidator(new StringLength(array(
    'min' => 10,
    'messageMinimum' => 'The name is too short'
)));

$form->add($name);

Kemudian Anda dapat memvalidasi formulir sesuai dengan input yang dimasukkan oleh pengguna:

<?php

if (!$form->isValid($_POST)) {
    foreach ($form->getMessages() as $message) {
        echo $message, '<br>';
    }
}

Validator dijalankan dalam urutan yang sama sebagaimana mereka terdaftar.

Secara default pesan yang dihasilkan oleh semua elemen dalam form bergabung (join) sehingga mereka dapat disusuri menggunakan foreach tunggal, Anda dapat mengubah perilaku ini untuk mendapatkan pesan dipisahkan oleh kolom:

<?php

foreach ($form->getMessages(false) as $attribute => $messages) {
    echo 'Messages generated by ', $attribute, ':', "\n";
    foreach ($messages as $message) {
        echo $message, '<br>';
    }
}

Atau mendapatkan pesan khusus untuk sebuah elemen:

<?php

foreach ($form->getMessagesFor('name') as $message) {
    echo $message, '<br>';
}

Filter 

Sebuah formulir juga dapat menyaring data sebelum divalidasi, Anda dapat mengatur filter pada setiap elemen:

Mengatur Pilihan Pengguna 

Form + Entitas 

Sebuah entitas seperti model / koleksi / plain-instance atau hanya kelas PHP polos dapat dihubungkan dengan form dalam rangka untuk mengatur nilai default pada elemen form atau menetapkan nilai dari formulir ke entitas dgn mudah:

<?php

$robot = Robots::findFirst();

$form = new Form($robot);

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

$form->add(new Text("year"));

Setelah formulir dirender jika tidak ada nilai default diterapkan untuk elemen itu akan menggunakan data yang disediakan oleh entitas:

<?php echo $form->render('name') ?>

Anda dapat memvalidasi formulir dan menetapkan nilai-nilai dari input pengguna dengan cara sebagai berikut:

<?php

$form->bind($_POST, $robot);

//Check if the form is valid
if ($form->isValid()) {

    //Save the entity
    $robot->save();
}

Menyiapkan kelas polos sebagai entitas juga mungkin:

<?php

class Preferences
{

    public $timezone = 'Europe/Amsterdam';

    public $receiveEmails = 'No';

}

Menggunakan kelas ini sebagai entitas, memungkinkan formulir untuk mengambil nilai default dari itu:

<?php

$form = new Form(new Preferences());

$form->add(new Select("timezone", array(
    'America/New_York' => 'New York',
    'Europe/Amsterdam' => 'Amsterdam',
    'America/Sao_Paulo' => 'Sao Paulo',
    'Asia/Tokyo' => 'Tokyo',
)));

$form->add(new Select("receiveEmails", array(
    'Yes' => 'Yes, please!',
    'No' => 'No, thanks'
)));

Entitas dapat menerapkan getter, yang memiliki hak untuk didahulukan daripada properti publik, metode ini memberi Anda  kebebasan lebih untuk menghasilkan value:

<?php

class Preferences
{

    public $timezone;

    public $receiveEmails;

    public function getTimezone()
    {
        return 'Europe/Amsterdam';
    }

    public function getTimezone()
    {
        return 'No';
    }

}

Elemen Form 

Phalcon menyediakan satu set built-in elemen untuk digunakan dalam form Anda, semua elemen ini terletak di namespace Phalcon \ Forms \ Element :

Nama Deskripsi Contoh
Text Menghasilkan INPUT [type = text] elemen Contoh
Password Menghasilkan INPUT [type = password] elemen Contoh
Select Menghasilkan tag SELECT (daftar combo) elemen berdasarkan pilihan Contoh
Check Menghasilkan INPUT [type = check] elemen Contoh
Textarea Menghasilkan elemen TEXTAREA Contoh
Hidden Menghasilkan INPUT [type = hidden] elemen Contoh
File Menghasilkan INPUT [type = file] elemen Contoh
Date Menghasilkan INPUT [type = date] elemen Contoh
Numeric Menghasilkan INPUT [type = jumlah] elemen Contoh
Submit Menghasilkan INPUT [type = mengirimkan] elemen Contoh

Callback Event 

Setiap kali form diimplementasikan sebagai kelas, callback: beforeValidation dan afterValidation dapat diimplementasikan di kelas form untuk melakukan pra-validasi dan post-validasi:

<?php

class ContactForm extends Phalcon\Mvc\Form
{
    public function beforeValidation()
    {

    }
}

Render Form 

Anda dapat render form dengan fleksibilitas total, contoh berikut menunjukkan bagaimana untuk membuat setiap elemen menggunakan prosedur standar:

<form method="post">
    <?php
        //Traverse the form
        foreach ($form as $element) {

            //Get any generated messages for the current element
            $messages = $form->getMessagesFor($element->getName());

            if (count($messages)) {
                //Print each element
                echo '<div class="messages">';
                foreach ($messages as $message) {
                    echo $message;
                }
                echo '</div>';
            }

            echo '<p>';
            echo '<label for="', $element->getName(), '">', $element->getLabel(), '</label>';
            echo $element;
            echo '</p>';

        }
    ?>
    <input type="submit" value="Send"/>
</form>

Atau menggunakan kembali logika di kelas form Anda:

<?php

class ContactForm extends Phalcon\Forms\Form
{
    public function initialize()
    {
        //...
    }

    public function renderDecorated($name)
    {
        $element = $this->get($name);

        //Get any generated messages for the current element
        $messages = $this->getMessagesFor($element->getName());

        if (count($messages)) {
            //Print each element
            echo '<div class="messages">';
            foreach ($messages as $message) {
                echo $this->flash->error($message);
            }
            echo '</div>';
        }

        echo '<p>';
        echo '<label for="', $element->getName(), '">', $element->getLabel(), '</label>';
        echo $element;
        echo '</p>';
    }

}

Dalam view:

<?php

echo $element->renderDecorated('name');

echo $element->renderDecorated('telephone');

Membuat Elemen Form 

Selain elemen form yang disediakan oleh Phalcon Anda dapat membuat elemen kustom Anda sendiri:

<?php

use Phalcon\Forms\Element;

class MyElement extends Element
{
    public function render($attributes=null)
    {
        $html = //... produce some html
        return $html;
    }
}

Form Manager 

Komponen ini menyediakan manajer form yang dapat digunakan oleh pengembang untuk mendaftarkan form dan mengaksesnya melalui service-locator:

<?php

$di['forms'] = function() {
    return new Phalcon\Forms\Manager();
};

Formulir ditambahkan ke form-manajer dan direferensikan oleh nama yang unik:

<?php

$this->forms->set('login', new LoginForm());

Menggunakan nama yang unik, bentuk dapat diakses dalam setiap bagian dari aplikasi:

<?php

echo $this->forms->get('login')->render();

Sumber eksternal 

  • Vökuró , adalah contoh aplikasi yang menggunakan bentuk pembangun untuk membuat dan mengelola formulir, [ Github ]