OctoberCMS插件一次显示所有验证

时间:2017-05-03 09:46:59

标签: php octobercms octobercms-backend octobercms-plugins

我正在使用Builder插件来创建插件,并在我的一个插件中的模型中进行了字段验证,效果很好。

假设我的插件中有一个类似于此类的验证称为团队

模型文件: technobrave \ team \ models \ Team.php

<?php namespace Technobrave\Team\Models;

use Model;

/**
 * Model
 */
class Team extends Model
{
    use \October\Rain\Database\Traits\Validation;

    /*
     * Validation
     */
    public $rules = [
    'name' => 'required|unique:technobrave_team_',
    'photo' => 'required',    
    'description'=>'max:1000',
    'position' => 'required',            
    'phone' => 'required',            
    'mobile' => 'required',            
    'email' => 'required|email|unique:technobrave_team_',            
    'website' => 'url',            


    ];


    public $customMessages = [
                'name.required' => 'Please enter team member name',
                'name.unique' => 'This team member name already exists',
                'photo.required' => 'Please select team member photo',
                'description.max' => 'Please enter maximum 1000 characters for description',              
                'position.required' => 'Please enter team member position',                
                'phone.required' => 'Please enter team member phone number',  
                'mobile.required' => 'Please enter team member mobile number',  
                'email.required' => 'Please enter team member email address',  
                'email.email' => 'Please enter valid team member email address', 
                'email.unique' => 'This email address already exists', 
                'website.url' => 'Please enter valid team member url', 




    ];

}

这个工作非常好,我能够看到验证,但它们是一个接一个地来。相反,我希望他们立刻出现。对于所有领域。

这可能吗?我怎么能做到这一点?

谢谢

3 个答案:

答案 0 :(得分:2)

你可以这样做。

1.-禁用抛出的验证

public $throwOnValidation = false;

2.-在验证方法之前监听,但为了做到这一点,我们将实现一个静态标志,对方法是安全的,只会被调用一次而不会是一个递归循环。

public function beforeValidate()
{
    static $called = false;
    if (!$called) {
        $called = true;
        if (!$this->validate()) {
            throw  new \October\Rain\Exception\ValidationException([
                'Errors' => collect($this->validationErrors)->reduce(function (
                    $msg,
                    $error
                ) {
                    return $msg . $error[0] . ' ';
                })
            ]);
        }
    }
}

3.-解析验证错误并连接成字符串

4.-默认情况下,十月的flash消息会转义任何HTML字符串以避免XSS,但如果你真的想这样做,你可以覆盖e() laravel的帮助函数

4.1.-在插件目录中创建一个名为helpers.php的文件并覆盖e()函数

<?php

function e($str)
{
    return $str;
}

4.2.-在$ helpersPath声明之前将文件附加到bootstrap.php文件,如下所示:

$customHelpers = __DIR__ . '/../plugins/vendor/yourplugin/helpers.php';
if (file_exists($customHelpers)) {
    require $customHelpers;
}

现在你可以在reduce函数中附加一个
这样的

return $msg . $error[0] . '<br>';

答案 1 :(得分:0)

好的伙计们,以下是我解决这个问题的方法。

只需转到您想要处理的插件,然后打开 Plugin.php 文件并添加以下代码行。

Plugin.php

public function boot()
    {
        Event::listen('backend.page.beforeDisplay', function($controller, $action, $params) {
      /* Here you can put your css file wherever you want  .. I put in my current theme's directory */
      $controller->addCss('/themes/your_current_theme_folder_name/assets/css/general.css'); 
        }); 
    }

在此文件中添加use Event;代码之前,请忘记添加class

打开 general.css 文件并放在下面的代码中。

.flash-message.fade.in {
white-space: pre;
} 

下一个打开插件的模型文件并放在代码下面。

Team.php (模型文件)

public $throwOnValidation = false;


    public function beforeValidate()
    {
        static $called = false;
        if (!$called) 
        {
            $called = true;
            if (!$this->validate()) 
            {

                throw new \October\Rain\Exception\ValidationException([
                    'Errors' => collect($this->validationErrors)->reduce(function (
                    $msg,
                    $error
                    ) {
                        return $msg . $error[0] . "\r\n"; 
                        })
                ]);
            }
        }
    }

希望这会有所帮助。

答案 2 :(得分:0)

感谢您的帮助!

当心:不要让线

public $throwOnValidation = false;

没有beforeValidate()函数,否则您的验证将无法进行。我花了两个星期的时间...