簡體   English   中英

Phalcon-形式驗證

[英]Phalcon - validation in form

我創建了帶有驗證規則的表單。 一切都很好,形式可見並且有效。 問題出在驗證器上。 只有第一個驗證器在addValidators([ ....])起作用

我的表單類源代碼:

public function initialize()
{

    $title = new Text('title');
    $title->setLabel('Title of article');
    $title->setFilters([
        'striptags', 'trim'
    ]);

    $title->addValidators([
        new PresenceOf([
            'message' => 'Title can not be empty'
        ]),
        new StringLength([
            'min' => 5,
            'messageMinimum' => 'Title is too short. Should has more than 5 letters'
        ]),
        new MYArticleAddCheckTitleValidator([
            'message' => 'aaaaaaaaaaaaaaa'
        ])
    ]);

    $this->add($title);

    ..........
  • 驗證程序PresenceOf可以正常工作。 驗證閃存消息可見。
  • 驗證程序StringLength不起作用。 看起來形式不知道
  • 驗證器MYArticleAddCheckTitleValidator(我自己的驗證器類)-與StringLength相同。

Windows上的Phalcon版本2.0.4。

有什么建議或建議嗎?

非常感謝。

使用Phalcon \\ Flash \\ Direct

解決此問題的最佳方法是使用Flash消息(類為Phalcon\\Flash\\Direct 您可以在此處找到文檔。

我建議您查看phalcon vokuro項目使用此策略。

該解決方案的關鍵是表單類內部的message()函數。

表格類

<?php
namespace Your\App\Forms;

use Phalcon\Forms\Form;
use Phalcon\Forms\Element\Text;
use Phalcon\Validation\Message;
use Phalcon\Validation\Validator\PresenceOf;
use Phalcon\Validation\Validator\StringLength;
use Your\App\Validation\MYArticleAddCheckTitleValidator;

class YourForm extends Form {

    public function initialize()
    {

        $title = new Text('title');
        $title->setLabel('Title of article');
        $title->setFilters([
            'striptags', 'trim'
        ]);

        $title->addValidators([
            new PresenceOf([
                'message' => 'Title can not be empty'
            ]),
            new StringLength([
                'min' => 5,
                'messageMinimum' => 'Title is too short. Should has more than 5 letters'
            ]),
            new MYArticleAddCheckTitleValidator([
                'message' => 'aaaaaaaaaaaaaaa'
            ])
        ]);

        $this->add($title);
    }

    /**
     * Prints messages for a specific element. Call it in the view
     */
    public function messages($name)
    {
        if ($this->hasMessagesFor($name)) {
            foreach ($this->getMessagesFor($name) as $message) {
                $this->flash->error($message);
            }
        }
    }
}

調節器

<?php
namespace Your\App;

use Your\App\YourForm;

class YourController extends ControllerBase
{

    public function indexAction()
    {
       $form = new YourForm();
       $this->view->form = $form;

        if($this->request->hasQuery('title')){
            if ($form->isValid($this->request->getQuery()) != false) {
                // Code when form is valid
            }
        }
    }
}

查看如果您遵循建議的架構,則應位於/app/views/your/index.html

<form method="GET" action="">
    <?= $form->label('title') ?>
    <?= $form->render('title')?>
    <?= $form->messages('title') //show messages here ?>
</form>

如果您使用多種形式,則向DI注冊Flash服務非常有用。 定義服務時(可以在根文件夾中的index.php/app/config/文件夾中的services.php中),您可以定義Flash服務:

<?php 
use Phalcon\DI\FactoryDefault;

$di = new FactoryDefault();

// Register the flash service with custom CSS classes
$di->set('flash', function () {
    $flash = new Phalcon\Flash\Direct(
        array(
            'error'   => 'your-error-class',
            'success' => 'your-success-class',
            'notice'  => 'your-notice-class',
            'warning' => 'your-warning-class'
        )
    );

    return $flash;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM