2013-06-11 2 views
60

Я пытаюсь использовать атрибуты проверки в «language> {language}> validation.php», чтобы заменить имя атрибута (имя входа) для правильного чтения имени (пример : first_name> Имя). Это кажется очень простым в использовании, но валидатор не показывает «хорошие имена».Атрибуты проверки Laravel «nice names»

У меня есть это:

'attributes' => array(
    'first_name' => 'voornaam' 
    , 'first name' => 'voornaam' 
    , 'firstname' => 'voornaam' 
); 

Для показаны ошибки:

@if($errors->has()) 
    <ul> 
    @foreach ($errors->all() as $error) 
    <li class="help-inline errorColor">{{ $error }}</li> 
    @endforeach 
    </ul> 
@endif 

И валидацию в контроллере:

$validation = Validator::make($input, $rules, $messages); 

$ Сообщения массива:

$messages = array(
    'required' => ':attribute is verplicht.' 
    , 'email' => ':attribute is geen geldig e-mail adres.' 
    , 'min'  => ':attribute moet minimaal :min karakters bevatten.' 
    , 'numeric' => ':attribute mag alleen cijfers bevatten.' 
    , 'url'  => ':attribute moet een valide url zijn.' 
    , 'unique' => ':attribute moet uniek zijn.' 
    , 'max'  => ':attribute mag maximaal :max zijn.' 
    , 'mimes' => ':attribute moet een :mimes bestand zijn.' 
    , 'numeric' => ':attribute is geen geldig getal.' 
    , 'size'  => ':attribute is te groot of bevat te veel karakters.' 
); 

Может кто-нибудь сказать мне, что я делаю неправильно. Я хочу, чтобы имя атрибута было заменено «хорошим именем» в массиве атрибутов (язык).

Спасибо!

EDIT:

Я заметил, что проблема, я никогда не установить язык по умолчанию для моих проектов Laravel. Когда я устанавливаю язык в «NL», код выше работает. Но, когда я устанавливаю свой язык, язык появится в URL-адресе. И я предпочитаю, чтобы этого не случилось.

Итак, мой следующий вопрос: возможно ли удалить язык с URL-адреса или задать язык по умолчанию, чтобы он просто не появился?

+0

Я не уверен, если я правильно понимаю, но вы можете установить язык по умолчанию в приложении/config/app.php, который будет использоваться поставщиком услуг перевода. Для каждого языка вам необходимо создать соответствующую папку в app/lang /. е.g, если у вас есть «en» и «nl» в качестве языков, которые вы используете в своем приложении, вы должны иметь обе папки в приложении/lang/с соответствующими файлами (в этом примере validation.php), поэтому всякий раз, когда вы меняете язык, этот файл будет загружен. Что касается удаления языка из URL-адреса, я не совсем уверен, но я считаю, что вы можете достичь этого с помощью маршрутов. – Altrim

+0

Я знаю, как установить языки и переводить имена ввода теперь работают. Мне нужно только знать, как удалить язык из URL. Я буду искать это. Благодаря! – Hak

+0

Определенно это можно сделать, см. Мой ответ ниже. –

ответ

1

Атрибут: атрибут может использовать только имя атрибута (first_name в вашем случае), а не красивые имена.

Но вы можете определить пользовательские сообщения для каждого атрибута + проверок с помощью definine сообщений, как это:

$messages = array(
    'first_name_required' => 'Please supply your first name', 
    'last_name_required' => 'Please supply your last name', 
    'email_required' => 'We need to know your e-mail address!', 
    'email_email' => 'Invalid e-mail address!', 
); 
7

В массиве «атрибуты» ключ имя входа и значение является строкой, которую вы хотите показать в сообщении.

Пример, если у вас есть вход, как этот

<input id="first-name" name="first-name" type="text" value=""> 

массива (в файле validation.php) должен быть

'attributes' => array(
    'first-name' => 'Voornaam'), 

Я попробовал то же самое, и он прекрасно работает. Надеюсь это поможет.

EDIT

Кроме того, я заметил, вы не передавать параметр $errors->has() так, возможно, это проблема.

Чтобы исправить это проверить в контроллере, если у вас есть код, как этот

return Redirect::route('page')->withErrors(array('register' => $validator)); 

, то вы должны перейти к методу has() «Peгиcтpaция» ключ (или что вы используете), как это

@if($errors->has('register') 
.... //code here 
@endif 

Другой способ отображения сообщений об ошибках является следующий один, который я предпочитаю (я использую Twitter Bootstrap для проектирования, но, конечно, вы можете изменить те с вашей собственной конструкции)

@if (isset($errors) and count($errors->all()) > 0) 
<div class="alert alert-error"> 
    <h4 class="alert-heading">Problem!</h4> 
    <ul> 
     @foreach ($errors->all('<li>:message</li>') as $message) 
     {{ $message }} 
     @endforeach 
    </ul> 
</div> 
+0

См. Мое редактирование – Hak

+1

Что делать, если имя поля является массивом? Например, '" '. Ошибка выведет что-то вроде' Txt.0 required.'. Как вы можете заменить его на красивые имена? –

+0

@ AnnaFortuna Проверьте этот пост, посмотрите, может ли он помочь вам http://stackoverflow.com/questions/17974231/laravel-4-validation-nested-indexed-arrays – Altrim

111

Да, атрибуты «хорошего имени», которые вы назвали, были реальной «проблемой» несколько месяцев назад. Надеемся, эта функция теперь implemented и очень проста в использовании.

Для простоты я разделится на два варианта решения этой проблемы:

  1. Global Вероятно, более широкое распространение. Этот подход очень хорошо объяснен here, но в основном вам необходимо отредактировать файл подтверждения application/language/XX/validation.php, где XX - это язык, который вы будете использовать для проверки.

    Внизу вы увидите массив атрибутов; это будет ваш массив атрибутов «nice name». Следуя вашему примеру, конечным результатом будет что-то вроде этого.

    'attributes' => array('first_name' => 'First Name') 
    
  2. Локально Это то, что Тейлор Otwell говорил в issue, когда он говорит:

    Вы можете назвать setAttributeNames на экземпляре Validator прямо сейчас.

    Это вполне допустимо, и если вы проверить source code вы увидите

    public function setAttributeNames(array $attributes) 
    { 
        $this->customAttributes = $attributes; 
    
        return $this; 
    } 
    

    Таким образом, чтобы использовать этот способ увидеть следующий простой пример:

    $niceNames = array(
        'first_name' => 'First Name' 
    ); 
    
    $validator = Validator::make(Input::all(), $rules); 
    $validator->setAttributeNames($niceNames); 
    

Ресурсы

Существует действительно удивительный репо на Github, у которых есть много пакетов языков, готовых к работе. Определенно вы должны это проверить.

Надеюсь, это поможет.

+1

Существует проблема с глобальным решением: в одной форме у меня может быть '' name '=>' Имя клиента '', а в другой форме это может быть '' name '=>' Имя продавца'. Я предпочитаю иметь переводы на модуль, поэтому Я могу повторно использовать эти значения и как метки для полей формы. Следовательно, я голосую за локальное решение, но как я могу получить этот массив $ niceNames из моего языкового файла? И как я могу называть 'setAttributeNames' без создания нового экземпляра Validator, но используя метод $ this-> validate(), который доступен в контроллерах? – JustAMartin

+2

В ответ на этот комментарий и c omplete решение @javiercadiz, так как Laravel 5.1 вы можете использовать четвертый параметр в '$ this-> validate (Request $ request, $ rules, $ messages, $ customAttributes)', чтобы иметь эти красивые имена. См. Его в [Laravel 5.1 API - Validate Request] (http://laravel.com/api/5.1/Illuminate/Foundation/Validation/ValidatesRequests.html#method_validate) –

+0

Где вы помещаете код в последний параметр? Я имею в виду эту часть: '$ validator = Validator :: make (Input :: all(), $ rules);' '$ validator-> setAttributeNames ($ niceNames);' – Jenthe

1

Поздний ответ, но может помочь кому-то

В Laravel 4.1 простой способ сделать это перейти в папку языки -> ваш язык (по умолчанию еп) -> проверка.PHP

, а затем, например, когда у вас есть в вашей модели

`'group_id' => 'Integer|required', 
    'adult_id' => 'Integer|required',` 

И не хотите, как ошибка please enter a group id

Вы можете создать «хорошее» сообщение проверки путем добавления в validation.php к пользовательский массив так в нашем примере, пользовательский массив будет выглядеть следующим образом

` 'custom' => array(
     'adult_id' => array(
      'required' => 'Please choose some parents!', 
     ), 
     'group_id' => array(
      'required' => 'Please choose a group or choose temp!', 
     ), 
    ),` 

Это также работает с многоязычным ар ps, вам просто нужно отредактировать (создать) правильный файл проверки языка.

Язык по умолчанию хранится в файле конфигурации app/config/app.php и по умолчанию является английским. Это можно изменить в любое время с помощью метода App :: setLocale.

Более подробную информацию для обеих ошибок и языков можно найти здесь validation и localization

17

Правильный ответ на этой конкретной проблемы можно было бы пойти в приложение/ЯЗ папку и редактировать validation.php файл в нижней части файла есть массив называется атрибуты:

/* 
|-------------------------------------------------------------------------- 
| Custom Validation Attributes 
|-------------------------------------------------------------------------- 
| 
| The following language lines are used to swap attribute place-holders 
| with something more reader friendly such as E-Mail Address instead 
| of "email". This simply helps us make messages a little cleaner. 
| 
*/ 

'attributes' => array(
    'username' => 'The name of the user', 
    'image_id' => 'The related image' // if it's a relation 
), 

Так что я считаю, что это массив был построен, чтобы настроить конкретно этот атр имена ibute.

+1

Это лучший ответ, чтобы ответы на испанском ' 'атрибуты' => [ \t 'имя' => 'Номбр', \t 'почты' => 'Коррео', \t 'пароль' => 'contraseña' , \t 'password2' => 'confirmación de contraseña', \t], ' –

10

С Laravel 5.2 вы могли бы ...

public function validForm(\Illuminate\Http\Request $request) 
{ 
    $rules = [ 
     'first_name' => 'max:130' 
    ]; 
    $niceNames = [ 
     'first_name' => 'First Name' 
    ]; 
    $this->validate($request, $rules, [], $niceNames); 

    // correct validation 
0

Ну, это довольно старый вопрос, но я мало, я должен отметить, что проблема наличия языка, появляющийся в URL может быть решена:

  • Изменение языка и fallback_language на config/app.php;
  • или установка \ App :: Setlocale ($ Lang)

При необходимости упорствовать через сессию, я в настоящее время использую «AppServiceProvider», чтобы сделать это, но, я думаю, промежуточный слой может быть лучше подход при изменении языка по URL необходим, поэтому я, как это у моего провайдера:

if(!Session::has('locale')) 
    { 
     $locale = MyLocaleService::whatLocaleShouldIUse(); 
     Session::put('locale', $locale); 
    } 

    \App::setLocale(Session::get('locale')); 

таким образом, я обрабатывать сессию и не слипаются в моей ссылке.

Чтобы уточнить, что я использую Laravel 5.1+, но не должен отличаться от 4.x;

1

Я использую мои пользовательские файлы языка в качестве входных данных для «хороших имен» так:

$validator = Validator::make(Input::all(), $rules); 
$customLanguageFile = strtolower(class_basename(get_class($this))); 

// translate attributes 
if(Lang::has($customLanguageFile)) { 
    $validator->setAttributeNames($customLanguageFile); 
} 
Смежные вопросы