Laravel проверяет динамически добавленный ввод с помощью пользовательских сообщений - PullRequest
0 голосов
/ 19 ноября 2018

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

Все шло как ожидалось, пока я не столкнулся с проблемой при проверке формы.

Итак, ниже моя функция вставки в коде моего контроллера заказов,

public function insert(Request $request) {
    // Save data to "orders" table
    $orderer = [
      'orderId' => $request->get('orderId'),
      'customerId' => $request->get('customerId'),
      'orderTotal' => $request->get('orderTotal'),
      'paymentMethodId' => $request->get('paymentMethodId'),
      'orderStatusId' => $request->get('orderStatusId'),
      'created_at' =>  \Carbon\Carbon::now(), # \Datetime()
      'updated_at' => \Carbon\Carbon::now()  # \Datetime()
    ];

    // Looping on dynamic "New Added" input field
    $orderedItems_Sku = $request->get('productSku');
    foreach($orderedItems_Sku as $key => $v)
    {
      $productSku = $request->get('productSku') [$key];
      $product = \App\Product::find($productSku);
      $rules = [
              'orderId' => 'unique:orders',
              'customerId' => 'required',
              'orderStatusId' => 'required',
              'paymentMethodId' => 'required',
              'uomId.*' => 'required',
              'productSku.*' => 'required',
              'productQty.*' => 'required',
              // 'lte' means Less Than or Equal to available stock quantity
              'orderQty.*' => 
              'required|numeric|min:1|lte:'.$product['productQty'],
              'orderPrice.*' => 'required'
          ];

      $messages = [
                'customerId.required' => 'Please select Customer',
                'orderStatusId.required' => 'Please select Order Status',
                'paymentMethodId.required' => 'Please select Payment Method',
                'uomId.*.required' => 'Please select UOM',
                'productSku.*.required' => 'Please select Product',
                'orderQty.*.required' => 'Please enter Order Quantity',
                'orderQty.*.min' => 'Quantity must be at least 1',
                'orderQty.*.lte' => 'Quantity of product no. 
                '.$product['productSku'].' must be not greater than 
                '.$product['productQty'],
                'orderPrice.*.required' => 'Please enter Product Price'
          ];

      // Validate "Rules" and "Messages" to running.
      $this->validate($request, $rules, $messages); 

      $data = [
        'orderId' => $request->get('orderId'),
        'productSku' => $v,
        'orderQty' => $request->get('orderQty') [$key],
        'uomId' => $request->get('uomId'),
        'orderPrice' => $request->get('orderPrice') [$key],
        'orderDiscount' => $request->get('orderDis') [$key],
        'orderPerAmount' => $request->get('orderPerAmount') [$key],
        'created_at' =>  \Carbon\Carbon::now(), # \Datetime()
        'updated_at' => \Carbon\Carbon::now()  # \Datetime()
      ];
      \App\orderedItem::insert($data);
      // "Decrement" means, product quantity will be deducted based on how 
      much quantity that customer has ordered.
      \App\Product::where("productSku", $v)->decrement("productQty", 
      $request->orderQty [$key]);
    }
    \App\Order::insert($orderer);
    return redirect('orders')->with('success', 'Order Successfully Added!'); 
  }

Вот мой HTML-код внутри create.blade.php,

https://pastebin.com/cn2X1aVL

как видите, есть поля "orderQty" и "productQty".

Итак, я пытаюсь проверить динамическое поле "orderQty" с помощью динамического поля "productQty", чтобы пользователь не мог ввести количество, большее, чем значение, в поле "productQty".

Я также использую команду lte (меньше чем равно) внутри массива $ rules в моем коде в соответствии с рекомендациями большинства сообществ laravel.

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

создание файла блейда

даже сообщения об ошибках, не отображающие динамическое сообщение как требуется.

Пожалуйста, помогите мне выяснить, в чем проблема. Я пробовал так много решений, но все еще не работает. : '(

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Попробуйте это

'orderQty.*' => 'required|numeric|min:1|max:'.$product['productQty'] 
0 голосов
/ 19 ноября 2018

После тестирования всех возможных решений, предложенных ответчиками,

Теперь исправлено!

Вот мой код функции вставки в OrderController,

public function insert(OrderRequest $request) {
    // Save data to "orders" table
    $orderer = [
      'orderId' => $request->get('orderId'),
      'customerId' => $request->get('customerId'),
      'orderTotal' => $request->get('orderTotal'),
      'paymentMethodId' => $request->get('paymentMethodId'),
      'orderStatusId' => $request->get('orderStatusId'),
      'created_at' =>  \Carbon\Carbon::now(), # \Datetime()
      'updated_at' => \Carbon\Carbon::now()  # \Datetime()
    ];

    // Looping on dynamic "New Added" input field
    $orderedItems_Sku = $request->get('productSku');
    foreach($orderedItems_Sku as $key => $v)
    {

      $data = [
        'orderId' => $request->get('orderId'),
        'productSku' => $v,
        'orderQty' => $request->get('orderQty') [$key],
        'uomId' => $request->get('uomId'),
        'orderPrice' => $request->get('orderPrice') [$key],
        'orderDiscount' => $request->get('orderDis') [$key],
        'orderPerAmount' => $request->get('orderPerAmount') [$key],
        'created_at' =>  \Carbon\Carbon::now(), # \Datetime()
        'updated_at' => \Carbon\Carbon::now()  # \Datetime()
      ];
      \App\orderedItem::insert($data);
      // "Decrement" means, product quantity will be deducted based on how much quantity that customer has ordered.
      \App\Product::where("productSku", $v)->decrement("productQty", $request->orderQty [$key]);
    }
    \App\Order::insert($orderer);

    $validated = $request->validated();
    return redirect('orders')->with('success', 'Order Successfully Added!'); 
}

и это мой код внутри OrderRequest

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;

class OrderRequest extends FormRequest
{
/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize()
{
    return true;
}

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{ 
    $rules = [
        'name' => 'required',
    ];

    foreach($this->request->get('productSku') as $key => $val)
    {
        $product = \App\Product::find($val);
        $rules['orderId'] = 'unique:orders'; 
        $rules['customerId'] = 'required';
        $rules['orderStatusId'] = 'required';
        $rules['paymentMethodId'] = 'required';
        $rules['uomId'] = 'required';
        $rules['productSku.'.$key] = 'required';
        $rules['orderQty.'.$key] = 'required|numeric|min:1|lte:'.$product['productQty'];
        $rules['orderPrice.'.$key] = 'required';
    }
    return $rules;
}

public function messages() 
{
    $messages = [];
      foreach($this->request->get('productSku') as $key => $val)
      {
        $product = \App\Product::find($val);
        $messages['orderQty.'.$key.'.lte'] = 'Quantity of product no. 
'.$product['productSku'].' must be not greater than '.$product['productQty'];
      }
      return $messages;
}
}

Как видите, я создал свой собственный файл запросов (OrderRequest) и вызываю его из OrderController.

Внутри файла OrderRequest я сделал цикл foreach, чтобы убедиться, что проверка работает на моем динамическом поле, включая в него правила lte / gte.

Для пользовательских сообщений я также сделал цикл foreach, так как хотел динамически показать ошибку, как показано ниже (см. Изображение),

создание файла блейда

Спасибо всем, кто предлагает мне различные возможные варианты решения этой проблемы. : D

0 голосов
/ 19 ноября 2018

Вы можете создать свой собственный запрос:

php artisan make: request {имя запроса}

Затем вы можете использовать этот запрос так же, как и запрос по умолчанию, как показано в этих документах.

https://laravel.com/docs/5.7/requests

если вы добавите другой метод, называемый «messages», вы можете добавить сообщения, подобные этому:

public function messages() {
    return [
        '{variable name}.{validation method}' => '{message to user}'
    ]
}

Тогда вы получите ответ ajax с ошибкойсообщений в нем.

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

Обновление

Приведенное выше предложение является наилучшей практикой, поскольку вы передаете все свои данные через пустой запрос

изменить:

'required|numeric|min:1|lte:'.$product['productQty'],

Кому:

'required|numeric|min:1|lte:productQty',

Это говорит валидатору, что значение orderQty должно быть меньше или равно входному значению для productQty

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...