Laravel — Как я могу автоматически заполнить вводимый текст в форме адресом, привязанным к идентификатору выбранного клиента?

#mysql #laravel #input

#mysql #laravel #ввод

Вопрос:

Это в моем ordered.blade.php файле. По сути, я хочу сделать так, чтобы при выборе клиента из выпадающего списка автоматически заполнялся адрес, привязанный к идентификатору клиента. Но поскольку очень сложно найти какую-либо документацию по этому вопросу, я застрял. Был бы признателен за любую помощь. Спасибо!

     <div class="form-group">
      <label for="customerId">Customer Name:</label>
      <select onchange="customerId(this.value)" name="customerId" class="form-control">
        <option>Choose A Customer</option>
        @foreach ($customers as $customer)
          <option name="customerId" id="customerId" value="{{$customer->id}}{{$customer->address}}">{{$customer->name}}</option>
        @endforeach
      </select>
    </div>

    <div class="form-group">
      <label for="shiptoAddress">Ship-To Address (Full Address):</label>
      <input name="shiptoAddress" class="form-control" id="shiptoAddress" placeholder="Ship-To Address">
    </div>
  

Это моя функция в моем OrderController для создания нового заказа:

     /*Create Order*/
    public function create( Request $data){
        $order = new Order;
        $order->customerId = $data->customerId;
        $order->save();
        return redirect('orders');
    }
  

Ответ №1:

Похоже, вы используете функцию JavaScript, но она не была включена в этот фрагмент кода, поэтому я изменил функцию, чтобы она выполняла то, что вы просите. Если он что-то делал, вы можете добавить это в новую функцию.

Итак, в основном первое, что я сделал, это изменил некоторые идентификаторы. У вас есть идентификатор, установленный в вашем теге option, который находится внутри цикла, который будет создавать элементы с одинаковым идентификатором для каждого клиента.

Следующее, что я сделал, это изменил значение, которое вы установили для своих параметров, поскольку это выглядело так, как будто пытались сохранить несколько значений, поэтому вместо этого я использовал весь объект customer (который будет сохранен в виде строки).

 <div class="form-group">
    <label for="customer-select">Customer Name:</label>
    <select id="customer-select" onchange="selectCustomer()" name="customer-select" class="form-control">
        <option value="default">Choose A Customer</option>
        @foreach ($customers as $customer)
            <option value="{{ $customer }}">{{$customer->name}}</option>
        @endforeach
    </select>
</div>

<div class="form-group">
    <label for="shiptoAddress">Ship-To Address (Full Address):</label>
    <input name="shiptoAddress" class="form-control" id="shiptoAddress" placeholder="Ship-To Address">
</div>
  

Установив весь объект customer в качестве значения параметра, вы будете иметь доступ к любым другим частям клиента, если вам понадобится что-то с ними сделать в будущем (т.Е. используйте идентификатор клиента, чтобы сделать что-то еще).

Теперь для JavaScript я использовал необработанный JavaScript (вы можете изменить его на jQuery, если он у вас есть), чтобы получить значение вашего Customer Select и применить его к вашему Address Input

Затем я использовал JavaScript, чтобы получить значение вашего оператора select и сделал его значением вашего поля ввода. JSON.parse(...) Вызов преобразует строку customer (как упоминалось ранее) в пригодный для использования объект JavaScript.

 <script>
    function selectCustomer() {
        let select = document.getElementById('customer-select');
        let ship_to_address = document.getElementById('shiptoAddress');

        if(select.value === 'default') {
            ship_to_address.value = '';
        } else {
            ship_to_address.value = JSON.parse(select.value).address;
        }
    }
</script>
  

В будущем, если у вас есть несколько ключей в вашем $customer->address , вы могли бы использовать тот же подход для установки разных значений отдельных входных данных для каждой части вашего адреса. Например:

 ...
    let address = JSON.parse(select.value).address;
    street_1.value = address.street_1;
    city.value = address.city;
...
  

Комментарии:

1. Только что понял одну проблему: он отправляет адрес отправки в базу данных, но не отправляет имя клиента. Пытаюсь поработать с ним, чтобы заставить его работать, но мне интересно, есть ли у вас какие-либо советы.

2. @DevMatt Вы должны быть в состоянии устранить эту проблему в своем контроллере, используя json_decode(..., true); имя формы «выбор клиента», через которое мы проходим, которое содержит весь объект customer. Это превратит строку в массив, который мы могли бы затем использовать, чтобы получить имя клиента для передачи в базу данных. Если вы хотите, я могу направить вас дальше, если вы опубликуете метод, отвечающий за хранение вашего ресурса.

3. Абсолютно! Хотя я не совсем уверен, что вы подразумеваете под «методом хранения вашего ресурса».

4. @DevMatt Я просто имею в виду функцию, ответственную за хранение данных формы в вашей таблице, обычно это находится в Controller и вызываемая функция: store() {...}

5. Позвольте мне добавить контроллер к моему вопросу. Однако у меня нет функции сохранения.