Próbuję użyć atrybutów walidacji w „język> {język}> validation.php”, aby zamienić: nazwa atrybutu (nazwa wejściowa) na właściwą do odczytania nazwę (przykład: imię> Imię). Wydaje się, że jest bardzo prosty w użyciu, ale walidator nie pokazuje „ładnych nazw”.
Mam to:
'attributes' => array(
'first_name' => 'voornaam'
, 'first name' => 'voornaam'
, 'firstname' => 'voornaam'
);
Aby pokazać błędy:
@if($errors->has())
<ul>
@foreach ($errors->all() as $error)
<li class="help-inline errorColor">{{ $error }}</li>
@endforeach
</ul>
@endif
Oraz walidacja w kontrolerze:
$validation = Validator::make($input, $rules, $messages);
Tablica $ wiadomości:
$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.'
);
Czy ktoś może mi powiedzieć, co robię źle. Chcę, aby: nazwa atrybutu została zastąpiona przez „ładną nazwę” w tablicy atrybutów (język).
Dzięki!
EDYTOWAĆ:
Zauważyłem, że problem polega na tym, że nigdy nie ustawiłem domyślnego języka dla moich projektów Laravel. Kiedy ustawię język na „NL”, powyższy kod działa. Ale kiedy ustawię język, język pojawi się w adresie URL. I wolę, żeby tak nie było.
Więc moje następne pytanie: czy można usunąć język z adresu URL lub ustawić język domyślny, aby po prostu się tam nie pojawiał?
Odpowiedzi:
Tak, atrybuty „fajna nazwa”, jak je nazwałeś, były prawdziwym „problemem” kilka miesięcy temu. Mam nadzieję, że ta funkcja została już zaimplementowana i jest bardzo prosta w użyciu.
Dla uproszczenia podzielę dwie opcje rozwiązania tego problemu:
Globalny Prawdopodobnie bardziej rozpowszechniony. To podejście jest tutaj bardzo dobrze wyjaśnione , ale zasadniczo musisz edytować plik walidacyjny application / language / XX / validation.php, gdzie XX jest językiem, którego będziesz używać do walidacji.
Na dole zobaczysz tablicę atrybutów; to będzie tablica atrybutów „ładne imię”. Idąc za twoim przykładem, ostateczny wynik będzie mniej więcej taki.
'attributes' => array('first_name' => 'First Name')
Lokalnie O tym mówił Taylor Otwell w numerze , mówiąc:
Jest to całkowicie poprawne i jeśli zaznaczysz kod źródłowy , zobaczysz
public function setAttributeNames(array $attributes) { $this->customAttributes = $attributes; return $this; }
Aby skorzystać z tego sposobu, zobacz następujący prosty przykład:
$niceNames = array( 'first_name' => 'First Name' ); $validator = Validator::make(Input::all(), $rules); $validator->setAttributeNames($niceNames);
Zasoby
Na Github jest naprawdę świetne repozytorium, które ma wiele gotowych pakietów językowych. Zdecydowanie powinieneś to sprawdzić.
Mam nadzieję że to pomoże.
źródło
'name' => 'Customer name'
aw innej może być'name'=>'Seller name'
. Wolę mieć tłumaczenia na moduł, więc mogę ponownie użyć tych wartości również jako etykiet dla pól formularzy. Dlatego głosuję za rozwiązaniem lokalnym, ale w takim razie jak mogę odzyskać tablicę $ niceNames z mojego pliku językowego? Jak mam wywołaćsetAttributeNames
bez tworzenia nowej instancji Validatora, ale używając metody $ this-> validate (), która jest dostępna w kontrolerach?$this->validate(Request $request, $rules, $messages, $customAttributes)
aby mieć te ładne nazwy. Zobacz to w Laravel 5.1 API - Validate Request$validator = Validator::make(Input::all(), $rules);
$validator->setAttributeNames($niceNames);
$validator->setAttributeNames(Lang::get('my-language-file'))
.Prawidłową odpowiedzią na ten konkretny problem byłoby przejście do folderu app / lang i edycja pliku validation.php , w dolnej części pliku znajduje się tablica o nazwie atrybuty :
/* |-------------------------------------------------------------------------- | 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 ),
Dlatego uważam, że ta tablica została zbudowana w celu dostosowania nazw atrybutów.
źródło
'attributes' => [ 'name' => 'nombre', 'mail' => 'correo', 'password' => 'contraseña', 'password2' => 'confirmación de contraseña', ],
Od Laravel 5.2 możesz ...
public function validForm(\Illuminate\Http\Request $request) { $rules = [ 'first_name' => 'max:130' ]; $niceNames = [ 'first_name' => 'First Name' ]; $this->validate($request, $rules, [], $niceNames); // correct validation
źródło
W tablicy „atrybutów” klucz jest nazwą wejściową, a wartością jest ciąg znaków, który ma zostać wyświetlony w komunikacie.
Przykład, jeśli masz takie dane wejściowe
<input id="first-name" name="first-name" type="text" value="">
Tablica (w pliku validation.php) powinna być
'attributes' => array( 'first-name' => 'Voornaam'),
Próbowałem tego samego i działa świetnie. Mam nadzieję że to pomoże.
EDYTOWAĆ
Zauważyłem również, że nie przekazujesz parametru,
$errors->has()
więc może to jest problem.Aby to naprawić, sprawdź w kontrolerze, jeśli masz taki kod
return Redirect::route('page')->withErrors(array('register' => $validator));
wtedy musisz przekazać do
has()
metody klucz "register" (lub cokolwiek, czego używasz) w ten sposób@if($errors->has('register') .... //code here @endif
Innym sposobem wyświetlania komunikatów o błędach jest następujący, który preferuję (do projektowania używam Twitter Bootstrap, ale oczywiście możesz je zmienić za pomocą własnego projektu)
@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>
źródło
<input type="text" name="txt[]" />"
. Błąd wyświetli coś takiegoThe txt.0 is required.
. Jak możesz to zastąpić ładnymi nazwami?W Laravel 4.1 prostym sposobem na to jest przejście do folderu lang -> twój język (domyślnie en) -> validation.php.
Kiedy masz to w swoim modelu, na przykład:
'group_id' => 'Integer|required', 'adult_id' => 'Integer|required',
I nie chcesz, aby błąd brzmiał „proszę podać identyfikator grupy”, możesz utworzyć „ładne” komunikaty walidacyjne, dodając niestandardową tablicę w pliku validation.php. W naszym przykładzie tablica niestandardowa wyglądałaby następująco:
'custom' => array( 'adult_id' => array( 'required' => 'Please choose some parents!', ), 'group_id' => array( 'required' => 'Please choose a group or choose temp!', ), ),
Działa to również z aplikacjami wielojęzycznymi, wystarczy edytować (utworzyć) odpowiedni plik walidacji języka.
Domyślny język jest przechowywany w pliku konfiguracyjnym app / config / app.php i domyślnie jest to angielski. Można to zmienić w dowolnym momencie za pomocą
App::setLocale
metody.Więcej informacji na temat błędów i języków można znaleźć tutaj: walidacja i lokalizacja .
źródło
Używam moich niestandardowych plików językowych jako danych wejściowych dla „ładnych nazw” w następujący sposób:
$validator = Validator::make(Input::all(), $rules); $customLanguageFile = strtolower(class_basename(get_class($this))); // translate attributes if(Lang::has($customLanguageFile)) { $validator->setAttributeNames($customLanguageFile); }
źródło
W Laravel 7.
use Illuminate\Support\Facades\Validator;
Następnie zdefiniuj niceNames
$niceNames = array( 'name' => 'Name', );
I na koniec, po prostu umieść $ niceNames w czwartym parametrze, na przykład:
$validator = Validator::make($request->all(), $rules, $messages, $niceNames);
źródło
The: attribute może używać tylko nazwy atrybutu (w twoim przypadku imię_imienia), a nie ładnych nazw.
Ale możesz zdefiniować niestandardowe komunikaty dla każdego atrybutu + walidacja, definiując komunikaty w ten sposób:
$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!', );
źródło
$customAttributes = [ 'email' => 'email address', ]; $validator = Validator::make($input, $rules, $messages, $customAttributes);
źródło
Cóż, to dość stare pytanie, ale mało kto powinienem wskazać, że problem z językiem występującym pod adresem URL można rozwiązać przez:
config/app.php
;Jeśli zachodzi potrzeba, aby utrzymać go w sesji, obecnie używam do tego „AppServiceProvider”, ale myślę, że oprogramowanie pośredniczące może być lepszym podejściem, jeśli konieczna jest zmiana języka według adresu URL, więc robię to u mojego dostawcy:
if(!Session::has('locale')) { $locale = MyLocaleService::whatLocaleShouldIUse(); Session::put('locale', $locale); } \App::setLocale(Session::get('locale'));
W ten sposób radzę sobie z sesją i nie przykleja się do mojego adresu URL.
Aby wyjaśnić, obecnie używam Laravel 5.1+, ale nie powinno to być inne zachowanie niż 4.x;
źródło