Laravel wyszukiwanie

0

witam

mam mały projekcik własnego CRUD plus system autoryzacji. Tabela z różnymi produktami. Chciałem do tego dopisać wyszukiwanie (search).
Niestety po dopisaniu Laravel wywala mi ciągle błąd > InvalidArgumentException
View [index] not found. >

Podejrzewam że jest jakiś bład w kontrolerze.
Mój kontroler: ProductsController.php
linijka **** public function search(Request $request)**** dopisane wyszukiwanie nie mam pojecia czy to jest poprawnie?? Nazwy tabeli i kolum raczej tak.


<?php
  
namespace App\Http\Controllers;
  
use App\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
  
class ProductController extends Controller
{
    public function __construct() {
        $this->middleware('auth')->except(['index', 'show']);
    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $products = Product::latest()->paginate(10);
  
        return view('products.index',compact('products'))
            ->with('i', (request()->input('page', 1) - 1) * 10);
    }
   
    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('products.create');
    }

    public function search(Request $request)
    {
        $search = $request->get('search');
        $posts = DB::table('products')->where('name', 'like', '%' .$search. '%' )->paginate(10);
        return view('index', ['products' => $posts]); 
    }
  
    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required',
            'detail' => 'required',
            'armor' => 'required',
            'gun'   => 'required',
            'engine' => 'required',
        ]);
  
        Product::create($request->all());
   
        return redirect()->route('products.index')
                        ->with('success','Product created successfully.');
    }
   
    /**
     * Display the specified resource.
     *
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function show(Product $product)
    {
        return view('products.show',compact('product'));
    }
   
    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function edit(Product $product)
    {
        return view('products.edit',compact('product'));
    }
  
    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Product $product)
    {
        $request->validate([
            'name' => 'required',
            'detail' => 'required',
            'armor' => 'required',
            'gun'   => 'required',
            'engine' => 'required',
        ]);
  
        $product->update($request->all());
  
        return redirect()->route('products.index')
                        ->with('success','Pozycja zaktualizowana');
    }
  
    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function destroy(Product $product)
    {
        $product->delete();
  
        return redirect()->route('products.index')
                        ->with('success','Pozycja usunięta');
    }
}

Routing web.php

Route::get('/', function () {
    return view('welcome');
});

Route::resource('products','ProductController');
Auth::routes();

Route::get('/search', 'ProductController@search');
Route::get('/home', 'HomeController@index')->name('home');

Wie ktos jak to naprawić lub napisac troche inaczej ? Wyszukiwanie w kolumnie name.

1

no podałeś że twój widok dla search to bedzie view/index.blade.php i system ci wyraźnie mówi, że ten plik nie istnieje. Sam index masz skierowany na view/products/index.blade.php więc może o ten widok ci chodzi?

0

zmieniłem widok na view/products/index.blade.php
tak słusznie o ten mi chodzi. niestety wywala mi dalej bład tym razem

$i is undefined
Make the variable optional in the blade template. Replace {{ $i }} with {{ $i ?? '' }}

zmienna $i jest niezdefiniowana. Ale w przypadku CRUD bez search działało normalnie
mój widok:

@ extends('products.layout')
 
@ section('content')
    <div class="row">
        <div class="col-lg-12 margin-tb">
            <div class="pull-left">
                </br><h2>TABELA - ADMIN PANEL</h2>
            </div>
                <form action="/search" method="get">
                    <div class="input-group">
                        <input type="search" name="search" class="form-control">
                        <span class="input-group-prepend">
                                    <button type="submit" class="btn btn-primary">Search</button>
                                    </span>
                                 </div>
                              </form>
                                  
        
            <div class="pull-right">
                <a class="btn btn-success" href="{{ route('products.create') }}"> Dodaj nowy produkt</a>
                @auth
                <form class="d-inline-block float-right" action="{{ route('logout') }}" method="post">
                @csrf
                <button class="btn btn-danger">Wyloguj</button>
                </form>
                @else
                <a href="{{route('login') }}" class="btn btn-secondary">Login</a>
                @endauth
            </div>
        </div>
    </div>
   
    @if ($message = Session::get('success'))
        <div class="alert alert-success">
            <p>{{ $message }}</p>
        </div>
    @endif
   
    <table class="table table-bordered">
        <tr>
            <th>ID</th>
            <th>Nazwa</th>
            <th>Opis</th>
            <th>Pancerz</th>
            <th>Działo</th>
            <th>Silnik</th>
            <th width="280px">MENU</th>
        </tr>
        @foreach ($products as $product)
        <tr>
            <td>{{ ++$i }}</td>
            <td>{{ $product->name }}</td>
            <td>{{ $product->detail }}</td>
            <td>{{ $product->armor }}</td>
            <td>{{ $product->gun }}</td>
            <td>{{ $product->engine }}</td>
            <td>
                <form action="{{ route('products.destroy',$product->id) }}" method="POST">
   
                    <a class="btn btn-info" href="{{ route('products.show',$product->id) }}">Pokaż</a>
    
                    <a class="btn btn-primary" href="{{ route('products.edit',$product->id) }}">Edytuj</a>
   
                    @csrf
                    @method('DELETE')
      
                    <button type="submit" class="btn btn-danger">Skasuj</button>
                </form>
            </td>
        </tr>
        @endforeach
    </table>
  
    {!! $products->links() !!}
      
@endsection

a w kontrolerze mam teraz tak:

public function search(Request $request)
    {
        $search = $request->get('search');
        $posts = DB::table('products')->where('name', 'like', '%' .$search. '%' )->paginate(10);
        return view('products/index', ['products' => $posts]); 
    }
  
0

no pewnie że jest niezdefiniowana, przecież w metodzie index przesyłasz tam tę zmienną (za pomocą with() ) a w search już nie więc jak mogła by być skoro jej nie podajesz do widoku?

0

jak usuwam ta zmienną od ID

 <td>{{ ++$i ?? '' ?? ''}}</td>

wtedy wyszukiwanie działa. Tylko jak teraz poprawić żeby wyszukiwanie działało razem z ID pokazywało.

1

to nie jest żadne id to jest $i które przesyłasz sam do widoku.

0

ok rozumiem to teraz pytanie jak prawidłowo dopisać w funkcji wyszukiwania w kontrolerze ->with ze zmienna $i ? Chyba zbytnio nie rozumiem tego zapisu....

1
  1. with niczym się nie rózni od przekazania zmiennej do templatki w arrayu. to po prostu inny sposób
  2. twoje $i to nie id tylko numer wiersza zgodny z kolejnością sortowania
  3. możesz zwyczajnie dodać identyczny kod co w index, przecież w searchu tak samo masz paginację.
0

dobra działa !!! :) miałem też literówkę dlatego nie działało dzięki wielkie

0

a wie ktoś jak dorobić do tego CRUD sortowanie w tabeli? np alfabetyczne albo po wartości. Laravel ma jakąś wbudowaną funkcje do tego ? Sortby? tylko zastanawiam się jak bedzie wyglądał zapis w kontrolerze

1

eeee? serio? Dokumentacja jest od czegoś... https://laravel.com/docs/7.x/queries#ordering-grouping-limit-and-offset

0

napisałem taki kontroller tylko nie wiem czy to jest dobrze. Nie wiem jak podpiąć to teraz do mojej warsty widokowej. W szablonie blade dodałem AJAX i w taki sposob chce robić sortowanie. wali mi błedami bo podejrzewam że mam zle napisany widok a wlasciwie nie wiem co tam teraz dodac zeby zadzialało sortowanie. Mój controllers:

public function sort(){
        $data = DB::table('products')->orderBy('id', 'asc')->paginate(10);
        return view('pagination', compact('data'));
    }

    function fetch_data(Request $request)
    {
     if($request->ajax())
     {
      $sort_by = $request->get('sortby');
      $sort_type = $request->get('sorttype');
            $query = $request->get('query');
            $query = str_replace(" ", "%", $query);
      $data = DB::table('products')
                    ->where('id', 'like', '%'.$query.'%')
                    ->orWhere('name', 'like', '%'.$query.'%')
                    ->orWhere('detail', 'like', '%'.$query.'%')
                    ->orderBy($sort_by, $sort_type)
                    ->paginate(10);
      return view('pagination_data', compact('data'))->render();
     }
    }

nazwy kolumn w bazie kolejno: id, name, detail. Sa tez inne ale chce miec sortowanie tylko na tych. tabela products

1

Skoro uważasz, że błąd tkwi w widoku, to czemu nie dasz jego kodu?
Po tych funkcjach ciężko powiedzieć "co autor miał na myśli".
Czemu te sortowane dane wysyłasz ponownie jako zrenderowane?

0

kod widoku (tylko bez wyświetlenia tego co jest w kontrolerze z sortowaniem ). Wydaje mi się że to może nie być poprawne w moim przypadku. Kodem tym zasugerowałem się z pewnego hinduskiego poradnika gdzie było robione sortowanie z AJAX..



    @extends('products.layout')
     
    @section('content')
        <div class="row">
            <div class="col-lg-12 margin-tb">
                <div class="pull-left">
                    </br><h2>TABELA - ADMIN PANEL</h2>
                    <form action="/search" method="get">
                        <div class="input-group">
                            <input type="search" name="search" class="form-control">
                            <span class="input-group-prepend">
                                        <button type="submit" class="btn btn-primary">Search</button>
                                        </span>
                                     </div>
                                  </form>
                </div>
                                      
            
                <div class="pull-right">
                    <a class="btn btn-success" href="{{ route('products.create') }}"> Dodaj nowy produkt</a>
                    @auth
                    <form class="d-inline-block float-right" action="{{ route('logout') }}" method="post">
                    @csrf
                    <button class="btn btn-danger">Wyloguj</button>
                    </form>
                    @else
                    <a href="{{route('login') }}" class="btn btn-secondary">Login</a>
                    @endauth
                </div>
            </div>
        </div>
       
        @if ($message = Session::get('success'))
            <div class="alert alert-success">
                <p>{{ $message }}</p>
            </div>
        @endif
       
        <table class="table table-bordered">
            <tr>
                <th class="sorting" data-sorting_type="asc" data-column_name="id" style="cursor: pointer">ID<span id="id_icon"></span></th>
                <th class="sorting" data-sorting_type="asc" data-column_name="name" style="cursor: pointer">Nazwa:</th>
                <th>Opis</th>
                <th>Pancerz</th>
                <th>Działo</th>
                <th>Silnik</th>
                <th width="280px">MENU</th>
            </tr>
            @foreach ($products as $product)
            <tr>
                <td>{{ ++$i ?? '' ?? ''}}</td>
                <td>{{ $product->name }}</td>
                <td>{{ $product->detail }}</td>
                <td>{{ $product->armor }}</td>
                <td>{{ $product->gun }}</td>
                <td>{{ $product->engine }}</td>
                <td>
                    <form action="{{ route('products.destroy',$product->id) }}" method="POST">
       
                        <a class="btn btn-info" href="{{ route('products.show',$product->id) }}">Pokaż</a>
        
                        <a class="btn btn-primary" href="{{ route('products.edit',$product->id) }}">Edytuj</a>
       
                        @csrf
                        @method('DELETE')
          
                        <button type="submit" class="btn btn-danger">Skasuj</button>
                    </form>
                </td>
            </tr>
            @endforeach
        </table>
     
        <div class="table-responsive">
     
        
      
        {!! $products->links() !!}
          
    @endsection
            



to może inne pytanie jak dopisac sortowanie kolumn do takiego widoku?

0

nie wiem czy dobrze rozumiem ale chyba mechanike sortowania bede musiał uwzględnić z zupełnie nowym szablonie niż tym który mi renderuje products? Dane które mi wyświetli po sortowaniu

1

Jak ja bym to wykonał:
Jeden nazwijmy to główny widok który tylko zawiera jakiegoś diva na na tabelę.
Do tego kontroler zwracający ten widok.
Druga metoda w tym kontrolerze która zwraca jsona z samymi danymi przez Ajax.
Przy generowanie strony JavaScript pyta tego ajaxa i otrzymuje posortowane standardowo dane. JavaScript renderuje tabelkę w przewidzianym divie.
Oprogramowujesz jakieś zdarzenia typu onclick na jakichś elementach od sortowania i wtedy znów następuje zapytanie o dane. Znów otrzymywany jest jsona a samo renderowanie już tabeli wykonujesz w js po otrzymaniu danych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1