Получение входных данных из нескольких форм модально в laravel - PullRequest
0 голосов
/ 17 июня 2019

Я довольно новичок в веб-разработке, я создаю базовый CRUD для моего интерновского проекта. Мой клиент попросил меня создать единую форму создания, в которой мне нужно было бы загрузить эти данные в базу данных, скажем, у меня есть 3 таблицы: магазины, фрукты (в одном магазине много фруктов) и овощи (в одном магазине много овощей)

Я закончил тем, что сделал несколько форм, которые являются одной основной формой для входных данных магазина, и некоторую дополнительную форму внутри модальной для ввода фруктов и овощей (формы разделены). После отправки и передачи контроллеру я могу получать информацию только из формы магазина, а не из других.

Сценарии и стили:

<link rel="stylesheet" href="/css/bootstrap.min.css">
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/bootstrap.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        //Adding and removing fruit table row
        $(".fruit-add").click(function(){
            var fruit_pic = $("#fruit_pic").val();
            var fruit_pic_name = $("#fruit_pic").val().replace(/C:\\fakepath\\/i, '')
            var fruit_name = $("#fruit_name").val();
            var markup = "<tr><td>" + fruit_pic_name + "</td><td>" + fruit_name + "</td><td>" + "<button type='button' class='fruit-remove'> Delete </button>" +  "</td></tr>";
            $(".fruit-table").append(markup);
        });
        $("body").on("click",".fruit-remove",function(){
            $(this).parents("tr").remove();
        });
        //Adding and removing vegetable table row
        $(".vegetable-add").click(function(){
            var vegetable_pic = $("#vegetable_pic").val();
            var vegetable_pic_name = $("#vegetable_pic").val().replace(/C:\\fakepath\\/i, '')
            var vegetable_name = $("#vegetable_name").val();
            var markup = "<tr><td>" + vegetable_pic_name + "</td><td>" + vegetable_name + "</td><td>" + "<button type='button' class='vegetable-remove'> Delete </button>" +  "</td></tr>";
            $(".vegetable-table").append(markup);
        });
        $("body").on("click",".vegetable-remove",function(){
            $(this).parents("tr").remove();
        });
    });     
</script>

Форма моего магазина:

<form method="post" action="/add-shop/store" id="addShop" enctype="multipart/form-data"> 
    {{ csrf_field() }}
    <div class="form-group">
        <label for="shop_name">Shop name</label>
        <input type="text" class="form-control" name="shop_name"  id="shop_name" aria-describedby="shop_name">
        @if($errors->has('shop_name'))
            <div class="text-danger">
                {{ $errors->first('shop_name')}}
            </div>
        @endif
    </div>
    <div class="form-group">
        <label> Fruits </label>
        <div class="table-responsive">
            <table class="table table-bordered table-hover">
                <thead class="thead-dark">
                    <tr>
                        <th>Picture</th>
                        <th>Name</th>
                        <th>Action</th>
                    </tr>
                </thead>
                <tbody class="fruit-table">
                </tbody>
            </table>
        </div>
        <!-- Button trigger fruit modal -->
        <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addFruit">
            Add fruit
        </button>
    </div>
    <div class="form-group">
        <label> Vegetables </label>
        <div class="table-responsive">
            <table class="table table-bordered table-hover">
                <thead class="thead-dark">
                    <tr>
                        <th>Picture</th>
                        <th>Name</th>
                        <th>Action</th>
                    </tr>
                </thead>
                <tbody class="vegetable-table">
                </tbody>
            </table>
        </div>
        <!-- Button trigger vegetable modal -->
        <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addVegetable">
            Add vegetable
        </button>
    </div>
    <div class="form-group text-right">
        <button type="button" class="btn btn-secondary">Cancel</button>
        <button type="submit" class="btn btn-success">Save</button>
    </div>
</form>

Мои формы на всплывающем моде:

<!-- Fruit Modal -->
<div class="modal fade" id="addFruit" tabindex="-1" role="dialog" aria-labelledby="addFruit" aria-hidden="true">
    <div class="modal-dialog" role="document">
        <form id="form_fruit">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="addFruit">Fruit</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <div class="modal-body">
                    <div class="form-group">
                        <label for="fruit_pic">Picture</label>
                        <input type="file" accept="image/*" name="fruit_pic[]" id="fruit_pic" class="form-control">
                    </div>
                    <div class="form-group">
                        <label for="fruit_name">Name</label>
                        <input type="text" name="fruit_name[]" class="form-control" id="fruit_name">
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
                    <button type="submit" class="btn btn-primary fruit-add" data-dismiss="modal">Add</button>
                </div>
            </div>
        </form>
    </div>
</div>
<!-- Vegetable Modal -->
<div class="modal fade" id="addVegetable" tabindex="-1" role="dialog" aria-labelledby="addVegetavle" aria-hidden="true">
    <div class="modal-dialog" role="document">
        <form id="form_vegetable">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="addVegetable">Vegetable</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <div class="modal-body">
                    <div class="form-group">
                        <label for="vegetable_pic">Picture</label>
                        <input type="file" accept="image/*" name="vegetable_pic[]" id="vegetable_pic" class="form-control">
                    </div>
                    <div class="form-group">
                        <label for="vegetable_name">Name</label>
                        <input type="text" class="form-control" name="vegetable_name[]" id="vegetable_name" placeholder="Deskripsi">
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
                    <button type="submit" class="btn btn-primary vegetable-add" data-dismiss="modal">Add</button>
                </div>
            </div>
        </form>
    </div>
</div>

Функции контроллера:

public function add()
{
    return view('add-shop');
}

public function storeTest(Request $request)
{
    echo "test\n"; //works
    echo $request->fruit_name; //doest work
    if($request->hasfile('fruit_pic')){ //doesnt work
        foreach($request->file('fruit_pic') as $image){
            echo $request->fruit_name; 
        }
    }
    echo $request->shop_name; //work
}

Когда я пытаюсь отправить форму, я получаю имя магазина, но не все другие атрибуты формы (фрукты и овощи)

У меня такое ощущение, что мой метод не совсем правильный, что не так, и есть ли лучший способ применить это?

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

сделать это также для --vegetable модальный -:

<!-- Fruit Modal -->
<div class="modal fade" id="addFruit" tabindex="-1" role="dialog" aria-labelledby="addFruit" aria-hidden="true">
    <div class="modal-dialog" role="document">
        <form id="form_fruit" method="post" action="{{ url('/add-fruits') }}">
          {{ csrf_field() }}
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="addFruit">Fruit</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <div class="modal-body">
                    <div class="form-group">
                        <label for="fruit_pic">Picture</label>
                        <input type="file" accept="image/*" name="fruit_pic[]" id="fruit_pic" class="form-control">
                    </div>
                    <div class="form-group">
                        <label for="fruit_name">Name</label>
                        <input type="text" name="fruit_name" class="form-control" id="fruit_name">
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
                    <button type="submit" class="btn btn-primary fruit-add" data-dismiss="modal">Add</button>
                </div>
            </div>
        </form>
    </div>
</div>

контроллер

public function addFruits(Request $request)
{
$this->validate($request, [

          'fruit_name'      => 'required|string',
          'fruit_pic.*' => 'mimes:jpeg,jpg,gif,png,bmp|max:8300',
             ]);

       $fruitname=$request->input('fruit_name');

     if($request->hasfile('fruit_pic'))
                   {
                      foreach($request->file('fruit_pic') as $file)
                      {
                         $name=$file->getClientOriginalName();
                          $file->move(public_path().'/../../example.com/images', $name);

                         DB::table('tblfruits')->insert([
                         'fruit_name' => $fruitname,
                         'fruit_pic' => $name,
                         ]);


                      }
                   }
}

маршрут

Route::post('/add-fruits','Controller@addFruits');
0 голосов
/ 17 июня 2019

просто взгляните на форму, которую вы должны использовать на действии

{{url(}}
{{route()}}

вы не получаете форму магазина, потому что сама модель не находится в форме, убедитесь, что поместили ее в ту жеform где вы отправляете оригинальный тег формы.В качестве альтернативы, если вы действительно хотите, чтобы он был снаружи, вы можете сделать скрытый ввод в форму и поместить туда свои данные с помощью java-скрипта из модели, а затем отправить форму

...