Laravel Yajra DataTables Ручная фильтрация - PullRequest
0 голосов
/ 12 октября 2018

В моем приложении Laravel я использую DataTables Yajra для обработки нумерации моего набора данных.Таблица используется для отображения ряда продуктов, которые исключаются из других частей приложения.

Их можно исключить с помощью простых настроек, которые я могу включить в предложение where.Другой набор правил для исключения продуктов немного более продвинутый и имеет свою собственную функцию, которую я называю.Это все работает, но если, например, я хочу, чтобы на каждой странице было 10 товаров, на первой странице отображается только 7 товаров, потому что требуется 10 товаров, но исключены только 7 из них.

Есть ли способ включить мою функцию?в предложении where (которое я считаю крайне маловероятным) или каким-либо образом, чтобы убедиться, что мое приложение правильно использует нумерацию страниц и длину таблицы?

<?php

function filteringMethod(Request $request)
{
    $type = $request->get('type');
    $channel = $request->get('channel');
    $sortData = $this->getSortingData();

    $data = [];
    $store = access()->getCurrentStore();
    $website = $store->website;
    $helper = new CommandHelper($store, $channel);

    $products = Product::where([
        ['website_id', '=', $website->website_id],
        ['store_view_id', '=', $store->defaultStoreView()->store_view_id],
    ])
        ->limit($sortData['length'])
        ->offset($sortData['offset'])
        ->orderBy('store_data_product_id')
        ->get();

    $fullCount = Product::where([
        ['website_id', '=', $website->website_id],
        ['store_view_id', '=', $store->defaultStoreView()->store_view_id],
    ])->count();

    foreach ($products as $product) {
        $reasons = [];
        $includeReasons = [];

        if ($helper->maybeExcludeVariant($product, $type, $reasons)) {
            $productArray = $product->toArray();
            sort($reasons);

            if ($helper->maybeExcludeVariant($product, ProductFilters::TYPE_WHITELIST, $includeReasons)) {
                sort($includeReasons);
                $reasons[] = '';
                $reasons = array_merge($reasons, $includeReasons);
            }

            $productArray['reason'] = implode("<br>", $reasons);
            $data[] = $productArray;
        }
    }

    if (!empty($data)) {
        for ($i = 0; $i < count($data); $i++) {
            $data[$i]['name_long'] =
                $data[$i]['name_long'] . (!empty($data[$i]['name_variant']) && $data[$i]['name_variant'] !== 'Default' ?
                    ' ' . $data[$i]['name_variant'] : '');
            $data[$i]['price_excl'] =
                Number::money($data[$i]['price_excl'], $store->defaultStoreView()->default_currency);
            $data[$i]['cost_price_excl'] =
                Number::money($data[$i]['cost_price_excl'], $store->defaultStoreView()->default_currency);
        }
    }

    /**
     * @var \Illuminate\Http\JsonResponse $returnData
     */
    $returnData = Datatables::of($data)->rawColumns(['reason'])->make(true);

    if (!empty($data)) {
        $returnDataData = $returnData->getData();
        $returnDataData->recordsFiltered = $fullCount;
        $returnDataData->recordsTotal = $fullCount;
        $returnData->setData($returnDataData);
    }

    return $returnData;
}

Выше приведен метод фильтрации, вызываемый объектом DataTable.

Любая помощь с этим будет оценена.

...