OctoberCMS 插件一次显示所有验证
OctoberCMS plugin show all the validations at once
我正在使用 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',
];
}
这绝对没问题,我能看到验证,但它们一个接一个地出现。相反,我希望它们同时出现。对于所有领域。
这可能吗?我怎样才能做到这一点?
谢谢
你可以这样做。
1.- 禁用抛出的验证
public $throwOnValidation = false;
2.- 在 Validation 方法之前监听,但为了实现这个技巧,我们将实现一个静态标志以确保该方法只会被调用一次,而不是递归循环。
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>';
好的,伙计们,这是我解决这个问题的方法。
只需转到您要使用的插件并打开其 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');
});
}
在此文件中添加 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";
})
]);
}
}
}
希望这对您有所帮助。
感谢您的帮助!!!
注意:不要让线
public $throwOnValidation = false;
没有 beforeValidate() 函数,否则您的验证将无法进行。我花了 2 周的时间...
我正在使用 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',
];
}
这绝对没问题,我能看到验证,但它们一个接一个地出现。相反,我希望它们同时出现。对于所有领域。
这可能吗?我怎样才能做到这一点?
谢谢
你可以这样做。
1.- 禁用抛出的验证
public $throwOnValidation = false;
2.- 在 Validation 方法之前监听,但为了实现这个技巧,我们将实现一个静态标志以确保该方法只会被调用一次,而不是递归循环。
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>';
好的,伙计们,这是我解决这个问题的方法。
只需转到您要使用的插件并打开其 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');
});
}
在此文件中添加 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";
})
]);
}
}
}
希望这对您有所帮助。
感谢您的帮助!!!
注意:不要让线
public $throwOnValidation = false;
没有 beforeValidate() 函数,否则您的验证将无法进行。我花了 2 周的时间...