【问题标题】:OctoberCMS plugin show all the validations at onceOctoberCMS 插件一次显示所有验证
【发布时间】:2017-10-01 01:56:57
【问题描述】:

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

假设我在一个名为 Team 的插件中进行了类似的验证。

模型文件: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', 




    ];

}

这绝对没问题,我可以看到验证,但它们一个接一个。相反,我希望他们一次全部出现。对于所有领域。

这可能吗?我怎样才能做到这一点?

谢谢

【问题讨论】:

    标签: php octobercms octobercms-backend octobercms-plugins


    【解决方案1】:

    你可以这样做。

    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.- 默认情况下,October 的 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>';
    

    【讨论】:

    • 对不起,我忘记了是否通过验证:D
    • 关于 HTML 很难解决,但我想我回答了你的问题
    • 感谢代码更新。它似乎在编辑模式下工作,如果我填写所有字段,我也不会收到验证错误消息。但是,如果我们可以在错误消息中提出换行符,那就太好了。它肯定会帮助我们和其他将被卡住或被卡住的成员。
    • 嗨兄弟..我已经解决了我们的问题。你可以在这里查看我的答案。
    【解决方案2】:

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

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

    插件.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'); 
            }); 
        }
    

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

    打开 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"; 
                            })
                    ]);
                }
            }
        }
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      感谢您的帮助!!!

      注意:不要让线

      public $throwOnValidation = false;
      

      没有 beforeValidate() 函数,否则您的验证将不起作用。我花了 2 周的时间...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        • 1970-01-01
        • 2011-04-03
        • 1970-01-01
        相关资源
        最近更新 更多