122 lines
3.9 KiB
PHP
122 lines
3.9 KiB
PHP
<?php
|
|
|
|
namespace App\Lib\Helpers;
|
|
|
|
use Illuminate\Container\Container;
|
|
use Illuminate\Pagination\LengthAwarePaginator;
|
|
use Illuminate\Pagination\Paginator;
|
|
use Illuminate\Support\Collection;
|
|
|
|
class CollectionHelper
|
|
{
|
|
/**
|
|
* Paginate a collection.
|
|
*
|
|
* @param \Illuminate\Support\Collection $results
|
|
* @param integer $pageSize
|
|
* @return \Illuminate\Pagination\LengthAwarePaginator
|
|
*/
|
|
public static function paginate(Collection $results, int $pageSize): \Illuminate\Pagination\LengthAwarePaginator
|
|
{
|
|
$page = Paginator::resolveCurrentPage('page');
|
|
|
|
return self::paginateManually($results, $pageSize, $page);
|
|
}
|
|
|
|
/**
|
|
* Paginate a collection.
|
|
*
|
|
* @param \Illuminate\Support\Collection $results
|
|
* @param integer $pageSize
|
|
* @param integer $page
|
|
* @return \Illuminate\Pagination\LengthAwarePaginator
|
|
*/
|
|
public static function paginateManually(
|
|
Collection $results,
|
|
int $pageSize,
|
|
int $page = 1
|
|
): \Illuminate\Pagination\LengthAwarePaginator {
|
|
$total = $results->count();
|
|
|
|
return self::paginator($results->forPage($page, $pageSize), $total, $pageSize, $page, [
|
|
'path' => Paginator::resolveCurrentPath(),
|
|
'pageName' => 'page',
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Create a new length-aware paginator instance.
|
|
*
|
|
* @param \Illuminate\Support\Collection $items
|
|
* @param integer $total
|
|
* @param integer $perPage
|
|
* @param integer $currentPage
|
|
* @param array $options
|
|
* @return \Illuminate\Pagination\LengthAwarePaginator
|
|
*/
|
|
protected static function paginator(
|
|
Collection $items,
|
|
int $total,
|
|
int $perPage,
|
|
int $currentPage,
|
|
array $options
|
|
): \Illuminate\Pagination\LengthAwarePaginator {
|
|
return Container::getInstance()->makeWith(LengthAwarePaginator::class, [
|
|
'items' => $items,
|
|
'total' => $total,
|
|
'perPage' => $perPage,
|
|
'currentPage' => $currentPage,
|
|
'options' => $options
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Get an array of views for each recipe models given.
|
|
*
|
|
* @param \Illuminate\Pagination\LengthAwarePaginator $models
|
|
* @param string $path
|
|
* @param string $key
|
|
* @return array
|
|
*/
|
|
public static function getViewsFromPaginateModels(
|
|
LengthAwarePaginator $models,
|
|
string $path,
|
|
string $key
|
|
): array {
|
|
return $models->through(function ($model) use ($path, $key) {
|
|
return view($path, [$key => $model])->render();
|
|
})->toArray();
|
|
}
|
|
|
|
/**
|
|
* Get an array of views for each item in collection given.
|
|
*
|
|
* @param \Illuminate\Support\Collection $collection
|
|
* @param string $path
|
|
* @param string $key
|
|
* @return array
|
|
*/
|
|
public static function getViewsFromCollection(Collection $collection, string $path, string $key): array
|
|
{
|
|
return $collection->map(function ($item) use ($path, $key) {
|
|
return view($path, [$key => $item])->render();
|
|
})->toArray();
|
|
}
|
|
|
|
public static function mapSlidesToFields(array $fields): array
|
|
{
|
|
return collect($fields)
|
|
->filter(fn($field, $key) => str_starts_with($key, 'slider_image_'))
|
|
->filter(fn($field) => !empty($field['value']))
|
|
->sortKeys()
|
|
->map(fn($field) => [
|
|
'image' => [
|
|
'path' => $field['value'],
|
|
'title' => $field['title'] ?? '',
|
|
'alt' => $field['alt'] ?? '',
|
|
],
|
|
])
|
|
->values()
|
|
->toArray();
|
|
}
|
|
}
|