2
votes

Remplacer un seul message pour required_without_all laravel

J'utilise required_without_all pour au moins un champ obligatoire dans laravel. Voici mon code pour la règle

'rental_company_id.required_without_all'                => 'The Rental Companies is required when none of Campers, Takeover stations and Returnable stations are present.',
'camper_id.required_without_all'                        => 'The Campers is required when none of Rental Companies, Takeover stations and Returnable stations are present.',
'take_over_station_id.required_without_all'             => 'The Takeover stations is required when none of Campers, Rental Companies and Returnable stations are present.',
'returnable_station_id.required_without_all'            => 'The Returnable stations is required when none of Campers, Rental Companies and Takeover stations are present.',

Voici mon message personnalisé qui remplacera le message par défaut produit par laravel

'rental_company_id'         => 'required_without_all:camper_id,take_over_station_id,returnable_station_id',
'camper_id'                 => 'required_without_all:rental_company_id,take_over_station_id,returnable_station_id',
'take_over_station_id'      => 'required_without_all:rental_company_id,camper_id,returnable_station_id',
'returnable_station_id'     => 'required_without_all:rental_company_id,camper_id,take_over_station_id',

Au lieu d'afficher plusieurs lignes de message d'erreur à l'utilisateur. est-il possible que je puisse résumer ces quatre messages en un seul message comme

L'une des saisons suivantes, les sociétés de location, ... doit être présente.

Merci d'avance.


0 commentaires

3 Réponses :


1
votes

Si vous utilisez une demande de formulaire, vous pouvez le faire dans votre méthode messages () :

@if (
    $errors->has('rental_company_id')
    || $errors->has('camper_id')
    || $errors->has('take_over_station_id') 
    || $errors->has('returnable_station_id')
) {
    // display the error message you need
}

Si vous utilisez un validateur manuel, vous pouvez faites ceci:

$messages = [
    'required_without_all' => 'One of the field must be present.',
];

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

Modifier : une alternative serait de vérifier si votre MessageBag contient une erreur pour l'un de ces champs, puis d'en afficher un autre en conséquence à votre avis. Par exemple:

return [
    'required_without_all' => 'One of the field must be present.'
];

Certes, ce n'est pas joli, mais je n'arrive pas à trouver une autre façon de le faire.


4 commentaires

J'utilise la demande de formulaire mais je dois utiliser required_without_all pour un autre champ et un autre cas dans le même formulaire. Désolé, j'ai trompé mes messages. J'ai édité ma question.


Dans ce cas, je ne suis pas sûr que cela soit réalisable du point de vue du validateur.


de toute autre manière que vous pouvez me recommander?


J'ai modifié ma réponse pour ajouter une alternative possible . Pas un grand fan, cependant.



1
votes

Résoudre en ajoutant une règle personnalisée php artisan make: rule AssignDataValidation

protected function getValidatorInstance()
{
    $validator = parent::getValidatorInstance();
    $validator -> after(function ($validator){
        $timeDataValidation     = new TimeDataValidation;
        $assignDataValidation   = new AssignDataValidation;
        if (!$timeDataValidation -> passes(TimeDataValidation::FIELD,Discount::TIME_DATA_FIELD)){
            $validator -> errors() -> add(TimeDataValidation::FIELD,$timeDataValidation -> message());
        }
        if (!$assignDataValidation -> passes(AssignDataValidation::FIELD,Discount::ASSIGNED_DATA_FIELD)){
            $validator -> errors() -> add(AssignDataValidation::FIELD,$assignDataValidation -> message());
        }
    });
    
    return $validator;
}

Sur demande de formulaire, j'ai une méthode de remplacement getValidatorInstance () et invoquer après validation pour ajouter ma règle manuellement et déclencher sur le sac d'erreur avec le nom personnalisé

/**
 * Determine if the validation rule passes.
 *
 * @param  string  $attribute
 * @param  mixed  $value
 * @return bool
 */
public function passes($attribute, $value)
{
    $isSet = false;
    $input = Input::all();
    foreach (Discount::ASSIGNED_DATA_FIELD as $data){
        if (isset($input[$data])){
            $isSet = true;
            break;
        }
    }
    return $isSet;
}

/**
 * Get the validation error message.
 *
 * @return string
 */
public function message()
{
    return 'One of the following Season, Rental companies,... must be present.';
}


0 commentaires

0
votes

Il existe un moyen très simple d'y parvenir. Appliquez la règle à un champ ids créé, puis incluez tous les champs réels pour lesquels vous souhaitez que la validation soit appliquée après required_without_all . Et juste un message de validation correspondant.

$validator = Validator::make($request->all(), [
            'ids' => 'required_without_all:rental_company_id,camper_id,take_over_station_id, returnable_station_id'
            ], [
            'required_without_all' => 'One of the following Season,Rental companies,... must be present.'
            ]);


0 commentaires