Funsi carian global

Fungsi carian ini adalah carian global. Anda hanya perlu daftarkan Model kerana carian akan dilakukan pada model yang didaftarkan. Secara lazimnya, kod ini akan diletakkan pada Controller (Contoh: app\Http\Controllers\GlobalController.php)

class GlobalController extends Controller{    private $models = [        'User'       => '==User info==',        'Jabatan'       => '==Jabatan info==',    ];    public function search(Request $request)    {        $search = $request->input('search');        if ($search === null || !isset($search['term'])) {            abort(400);        }        $term           = $search['term'];        $searchableData = [];        foreach ($this->models as $model => $translation) {            $modelClass = 'App\\' . $model;            $query      = $modelClass::query();            $fields = $modelClass::$searchable;            foreach ($fields as $field) {                $query->orWhere($field, 'LIKE', '%' . $term . '%');            }            $results = $query->take(10)                ->get();            foreach ($results as $result) {                $parsedData           = $result->only($fields);                $parsedData['model']  = trans($translation);                $parsedData['fields'] = $fields;                $formattedFields      = [];                foreach ($fields as $field) {                    $formattedFields[$field] = Str::title(str_replace('_', ' ', $field));                }                $parsedData['fields_formated'] = $formattedFields;                $parsedData['url'] = url('/' . Str::plural(Str::snake($model, '-')) . '/' . $result->id . '/edit');                $searchableData[] = $parsedData;            }        }        return response()->json(['results' => $searchableData]);    }}

Daftarkan Static Properties $searchable yang ingin di cari pada model yang berkaitan

// User.phpclass User extends Model{    ...    // fungsi carian hanya sasar column ini    public static $searchable = [        'name',        'nokp',        'email',    ];}// Jabatan.phpclass Jabatan extends Model{    // fungsi carian hanya sasar column ini    public static $searchable = [        'nama',    ];}

Daftarkan route di routes\web.php

Route::get('global-search', 'GlobalController@search')->name('globalSearch');

Untuk mencuba logik carian, masukkan URL berikut pada browser

www.webanda.com/global-search?search[term]=XXX&search[type]=query
{    "results": [        {            "name": "TEKNOLOGI STAFF",            "nokp": "880808080808",            "email": "staff@staff.com",            "model": "==Info Ahli==",            "fields": [                "name",                "nokp",                "email"            ],            "fields_formated": {                "name": "Name",                "nokp": "Nokp",                "email": "Email"            },            "url": "http://skp2.test/users/4/edit"        },        {            "nama": "TEKNOLOGI",            "model": "==Info Kad==",            "fields": [                "nama"            ],            "fields_formated": {                "nama": "Nama"            },            "url": "http://skp2.test/jabatan/41/edit"        }    ]}

Maklumat carian akan dipaparkan dalam bentuk JSON dan jika anda ingin paparkan pada frontend, anda boleh menggunak script jquery berikut pada fail blade

<script>        $(document).ready(function() {            $('.searchable-field').select2({                minimumInputLength: 3,                ajax: {                    url: '{{ route("globalSearch") }}',                    dataType: 'json',                    type: 'GET',                    delay: 200,                    data: function (term) {                        return {                            search: term                        };                    },                    results: function (data) {                        return {                            data                        };                    }                },                escapeMarkup: function (markup) { return markup; },                templateResult: formatItem,                templateSelection: formatItemSelection,                placeholder : 'Carian ahli...',                language: {                    inputTooShort: function(args) {                        var remainingChars = args.minimum - args.input.length;                        var translation = 'Masukkan 3 aksara';                        return translation.replace(':count', remainingChars);                    },                    errorLoading: function() {                        return 'Carian tidak boleh dipaparkan';                    },                    searching: function() {                        return 'Sedang dicari...';                    },                    noResults: function() {                        return 'Tiada maklumat ditemui.';                    },                }            });            function formatItem (item) {                if (item.loading) {                    return 'Sedang dicari......';                }                var markup = "<div class='searchable-link' href='" + item.url + "'>";                markup += "<div class='searchable-title'>" + item.model + "</div>";                $.each(item.fields, function(key, field) {                    markup += "<div class='searchable-fields'>" + item.fields_formated[field] + " : " + item[field] + "</div>";                });                markup += "</div>";                return markup;            }            function formatItemSelection (item) {                if (!item.model) {                    return 'Carian ahli...';                }                return item.model;            }            $(document).delegate('.searchable-link', 'click', function() {                var url = $(this).attr('href');                window.location = url;            });        });    </script>

Diatas ini adalah contoh fungsi global search yang diguna pakai pada element input html

Post a Comment

Previous Post Next Post