Sergio BenavidesSergio Benavides
Sergio Benavides
Comparte:

Debo usar un loop while ? si es asi cómo puedo usarlo?

Hola a todos, tengo un formulario en el cual tengo un select con el plugin select2 y tengo la opción de tags: true, en este select envió nombre-valor-descripción(opcional), y el formato seria por ejemplo: john doe-15000 jane doe-12500-descripción opcional.
para que el usuario envié el formato correcto cree una regla de validación:
Input del formulario:
<div class="form-group col-md-6 {{ $errors->has('pagos') ? 'has-error' : '' }}">
    <label for="pagos">Pago / valor pago <i class="fa fa-info-circle" data-toggle="tooltip" data-placement="right" title="Ej: andres-50000 luis-78500"></i></label>
    <select class="form-control select2-pagos" multiple="multiple" name="pagos[]" data-placeholder="Dele un nombre al pago y su valor, separelos por '-'" style="width: 100%;">
      @if(is_array(old('pagos')))
        @foreach (old('pagos') as $pago)
            <option value="{{ $pago }}" selected="selected">{{ $pago }}</option>
        @endforeach
      @endif
    </select>
    @if ($errors->has('pagos'))
    <label class="control-label" for="pagos"><i class="fa fa-times-circle-o"></i>
      <strong>{{ $errors->first('pagos') }}</strong>
    </label>
    @endif
  </div>

Request
public function rules()
    {
        return [
            'cuadre_venta' => 'required|integer|min:0',
            'cuadre_base' => 'required|integer|min:0',
            'cuadre_propina' => 'required|integer|min:0',

            'pagos' => ['required', new ValidFormatPagos],
            'datafonos' => 'required',
        ];
    }
Regla 
public function passes($attribute, $values)
    {
      foreach ($values as $key => $value) {
        $pagoSeparados = explode('-',$value);
        // dd($values);
        if (count($pagoSeparados) == 2) {
          if (is_string($pagoSeparados[0]) && ctype_digit($pagoSeparados[1])) {
            return true;
          }
        }elseif (count($pagoSeparados) > 2) {
          if (is_string($pagoSeparados[0]) && ctype_digit($pagoSeparados[1]) && is_string($pagoSeparados[2]) != true) {
            return true;
          }
        }
      }
      return false;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'El formato para los pagos es incorrecto.';
    }
Primero recorro los valores que envian desde el form con un foreach
y los divido por el caracter "-" (0 => "John doe", 1 => "15000") entonces pregunto si el arreglo es igual a 2 es que viene nombre y valor, el nombre siempre sera en la pos 0 y el valor en la pos 1, entonces pregunto si el valor en la pos 0 es string y el valor en la pos 1 es  un int, si estas dos condiciones son verdaderas retorno true. hasta aquí todo va bien, si en el select envio ([john doe-15000] [Jane doe]) la validacion pasa ya que en la primera condición es verdadera pero la segunda no, cómo puedo hacer que evalue todos los tags y no solo el primero, lo siento si no fui claro en alguna parte puedes preguntarme y gracias de antemano a los que me puedan ayudar