FrozenNode / Laravel-Administrator

An administrative interface package for Laravel
http://administrator.frozennode.com/
MIT License
1.94k stars 503 forks source link

Custom Validation Attributes #795

Open handycomm opened 9 years ago

handycomm commented 9 years ago

Validation error message has shown with input attribute name. It's have to be some title or custom attributes. So, I fixed.

In administrator/src/Frozennode/Administrator/AdministratorServiceProvider.php 67 ~ 81 line

///temporarily override the core resolver
LValidator::resolver(function($translator, $data, $rules, $messages, $customAttributes = array()) use ($app)
{
    $validator = new Validator($translator, $data, $rules, $messages, $customAttributes);
    $validator->setUrlInstance($app->make('url'));
    return $validator;
});

//grab our validator instance
$validator = LValidator::make(array(), array());

//set the validator resolver back to the original validator
LValidator::resolver(function($translator, $data, $rules, $messages, $customAttributes = array()) use ($originalValidatorClass)
{
    return new $originalValidatorClass($translator, $data, $rules, $messages, $customAttributes);
});

In administrator/src/Frozennode/Administrator/Config/Model/Config.php

// Add to $defaults
'custom_attributes' => array(),
// Add to $rules
'custom_attributes' => 'array',

// function save, original 335 line
$validation = $this->validateData($validation_data, $rules, $messages, $this->getOption('custom_attributes'));

In administrator/src/Frozennode/Administrator/Config/Setting/Config.php

// Add to $defaults
'custom_attributes' => array(),

// Add to $rules
'custom_attributes' => 'array',

// function save, original 177 line
$validation = $this->validateData($data, $rules, $this->getOption('messages'), $this->getOption('custom_attributes'));

In administrator/src/Frozennode/Administrator/Config/Config.php

public function validateData(array $data, array $rules, array $messages, array $customAttributes = array())
{
    if ($rules)
    {
        $this->customValidator->setData($data);
        $this->customValidator->setRules($rules);
        $this->customValidator->setCustomMessages($messages);
        $this->customValidator->setAttributeNames($customAttributes);

        //if the validator fails, kick back the errors
        if ($this->customValidator->fails())
        {
            return implode('. ', $this->customValidator->messages()->all());
        }
    }

    return true;
}

And then.. Usage On model page

  'custom_attributes' => array(
    'name' => 'Game name',
    'subject' => 'Campaign subject'
  ),

or

   // if defined static variable to Eloquent Model
  'custom_attributes' => Game::$customAttributes,
handycomm commented 9 years ago

Oh, I mean custom attributes that is not message. In \vendor\laravel\framework\src\Illuminate\Validation\Factory.php, There is parameter customAttributes at make function.

    /**
     * Create a new Validator instance.
     *
     * @param  array  $data
     * @param  array  $rules
     * @param  array  $messages
     * @param  array  $customAttributes
     * @return \Illuminate\Validation\Validator
     */
    public function make(array $data, array $rules, array $messages = array(), array $customAttributes = array())
frzsombor commented 9 years ago

Oops sorry, I was a bit (too much) tired when I read your message. I removed my reply to avoid confusion.