Просмотрено
Category: Программирование

Не работает метод map() с методом paginate() в Laravel Eloquent.

Не работает метод map() с методом paginate() в Laravel Eloquent.

Не работает метод map() с методом paginate() в Laravel Eloquent.

Столкнулся с проблемой, не работает метод map() с методом paginate() в Laravel Eloquent. Метод map() создает новую коллекцию. Соответственно при попытке использовать его с методом paginate() ничего не получится. Используя map() мы получим коллекцию без пагинации.

$users = User::paginate($request->per_page ?? 10)->map(function ($user) {
            $user->confirm_email = $user->email_verified_at ? true : false;
            $user->role_name = $user->roles()->first() ? $user->roles()->first()->name : null;
            return $user;
        });

Для того, чтобы изменить значения в полученной коллекции, нужно использовать метод through().

 $users = User::paginate($request->per_page ?? 10)->through(function ($user) {
            $user->confirm_email = $user->email_verified_at ? true : false;
            $user->role_name = $user->roles()->first() ? $user->roles()->first()->name : null;
            return $user;
        });

В результате мы получим измененную коллекцию с пагинацией. Я написал это для себя в качестве шпаргалки, но вдруг кому-то это также будет полезно.


Настройка Xdebug + OpenServer + PhpStorm

Настройка Xdebug + OpenServer + PhpStorm

Настройка Xdebug + OpenServer + PhpStorm

В данной статье я подробно и наглядно расскажу как настроить и использовать связку Xdebug + OpenServer + PhpStorm.

Первым делом нужно включить расширение Xdebug в конфигурации PHP. Для этого нужно в OpenServer идем в Дополнительно > Конфигурация > PHP_8.1. Версия PHP у вас может отличаться.

Конфигурация PHP
Конфигурация PHP

В файле конфигурации нужно найти и раскомментировать строку:

zend_extension = xdebug

После нужно найти секцию [xdebug] и раскомментировать строки:

xdebug.mode                     = develop,debug
xdebug.client_host              = "localhost"
xdebug.client_port              = 9003

После сохраняем файл и перезапускаем OpenServer.

Перезапускаем сервер
Перезапускаем сервер

Теперь переходим к настройке PhpStorm. Комбинацией Ctrl + Alt + S или через File > Settings открываем настройки. Слева выбираем PHP > Debug. В открывшихся настройках снимаем галочки с Force break at first line when no path mapping specified и Force break at first line when a script is outside the project. Порты должны быть 9000 и 9003.

Далее в открытом проекте в правом верхнем углу выбираем Current File > Edit Configurations.

Current File > Edit Configurations
Current File > Edit Configurations

В открывшемся окне нажимаем + и выбираем PHP Remote Debug.

Добавляем конфигурацию для отладки
Добавляем конфигурацию для отладки

В этом окне нужно выбрать напротив поля Server.

Выбираем многоточие напротив поля Server
Выбираем многоточие напротив поля Server

В очередном открывшемся окне тыкаем + и в полях Name и Host указываем имя нашего хоста и жмем OK.

Добавляем хост для отладки
Добавляем хост для отладки

В предыдущем окне в поле Name для удобства указываем имя нашего хоста. В поле Server выбираем наш созданный хост, а в IDE key пишем PHPSTORM. Жмет OK.

Настройка отладки PHP
Настройка отладки PHP

Переходим к настройке браузера. Нужно установить расширение Xdebug helper из магазина расширений Google Chrome.

Xdebug helper в магазине Google Chrome
Xdebug helper в магазине Google Chrome

После того, как установили Xdebug helper кликаем по нему правой клавишей и выбираем Параметры.

Переходим в параметры Xdebug helper
Переходим в параметры Xdebug helper

В открывшихся настройках нас интересует параметр IDE key. Выбираем PhpStorm, т.к. его же мы указали при настройке ранее.

Параметры Xdebug helper
Параметры Xdebug helper

Теперь на странице хоста кликаем по иконке Xdebug helper и выбираем Debug. В моем случае хост будет plastpoliefir.lan. Жук должен загореться зеленым цветом.

В PhpStorm в правом верхнем углу также кликаем по жуку.

Теперь в проекте можно поставить точку остановки и сделать запрос в браузере.

Точка остановки в PhpStorm
Точка остановки в PhpStorm

Если все правильно сделали, то наше приложение остановиться в том месте, где мы установили точку остановки.

Приложение остановилось там, где мы и хотели.
Приложение остановилось там, где мы и хотели.

Так же можно посмотреть содержимое массивов и объектов.

Содержимое объекта в PhpStorm.
Содержимое объекта в PhpStorm.

Также в панели отладки можно посмотреть глобальные переменные, консоль, ответ нашего HTTP сервера и многое другое.

Панель отладки
Панель отладки

На этом настройка связки Xdebug + OpenServer + PhpStorm закончена. Надеюсь данная вам статья была полезна.

Пагинация массива в Laravel

Пагинация массива в Laravel

Пагинация массива в Laravel

Пагинация массива в Laravel достаточно делается легко при помощи класса LengthAwarePaginator.

// Импортируем класс
use Illuminate\Pagination\LengthAwarePaginator as Paginator;

// Получаем текущую страницу
$currentPage = Paginator::resolveCurrentPage();
// Создаем коллекцию
$collection = collect($categories);
// Задаем кол-во элементов на страницу
$perPage = 15;
// Выбираем элементы для текущей страницы
$currentPageItems = $collection->slice(($currentPage - 1) * $perPage, $perPage);

// Создаем экземпляр класса Paginator
$items = new Paginator($currentPageItems, count($collection), $perPage);
// Указываем URI для генерации ссылок пагинации
$items->setPath($request->url());

// Возвращаем представление
return view('pagination', compact('items'));

В представлении для вывода пагинации используем как и в обычной пагинации $items->links().

<!doctype html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Пагинация массива</title>
</head>
<body>
@foreach($items as $item)
    {{ $item['name'] }} <br>
@endforeach

{{ $items->links() }}

</body>
</html>
Добавляем CKEditor 4 в Laravel Orchid + Laravel Filemanager

Добавляем CKEditor 4 в Laravel Orchid + Laravel Filemanager

CKEditor в Laravel Orchid

В данной статье я расскажу как добавить поле с WYSIWYG редактором CKEditor 4 в Laravel Orchid.
В первую очередь нужно установить сам CKEditor. Для этого в консоли выполняем:

npm install ckeditor4

После создаем файл resources\js\controllers\ckeditor_controller.js со следующим содержимым:

export default class extends window.Controller {
    connect() {
        CKEDITOR.replace('ckeditor', {
            height: '500px'
        });
    }
}

Файл resources\js\dashboard.js с содержимым:

import Ckeditor_controller from './controllers/ckeditor_controller';

application.register("ckeditor", Ckeditor_controller);

В файл webpack.mix.js добавляем:

mix.copyDirectory('./node_modules/ckeditor4/', 'public/js/ckeditor4');
mix.js('resources/js/dashboard.js', 'public/js');

Собираем все:

npm run dev

Регистрируем наши ресурсы в app\Providers\AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Orchid\Platform\Dashboard;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot(Dashboard $dashboard)
    {
        $dashboard->registerResource('scripts', '/js/ckeditor4/ckeditor.js');
        $dashboard->registerResource('scripts', '/js/dashboard.js');
    }
}

Создаем класс нашего кастомного поля app\Orchid\Fields\CKEditor.php

<?php

namespace App\Orchid\Fields;

use Orchid\Screen\Field;

class CKEditor extends Field
{
    /**
     * Blade template
     *
     * @var string
     */
    protected $view = 'fields.ckeditor';

    /**
     * Default attributes value.
     *
     * @var array
     */
    protected $attributes = [];

    /**
     * Attributes available for a particular tag.
     *
     * @var array
     */
    protected $inlineAttributes = [];
}

Создаем файл представления resources\views\fields\ckeditor.blade.php

<div data-controller="ckeditor">
    <div class="form-group">
        <lable class="text-wrap mt-2 form-label">{{ $title }}</lable>
        <textarea name="{{ $name }}" id="ckeditor">{{ $value }}</textarea>
    </div>
</div>

На этом наше поле готово. Переходим в экран и добавляем:

CKEditor::make('news.text')
    ->title('Текст новости')

И получаем результат

Поле CKEditor в Laravel Orchid
Поле CKEditor в Laravel Orchid

Добавление Laravel Filemanager в CKEditor 4

Также можно добавить Laravel Filemanager в наш CKEditor. Для этого устанавливаем его. Подробнее про файловый менеджер можно почитать тут

 composer require unisharp/laravel-filemanager
 php artisan vendor:publish --tag=lfm_config
 php artisan vendor:publish --tag=lfm_public
 php artisan storage:link

Файл resources\js\controllers\ckeditor_controller.js приводим к такому виду:

export default class extends window.Controller {
    connect() {
        CKEDITOR.replace('ckeditor', {
            height: '500px',
            filebrowserImageBrowseUrl: '/laravel-filemanager?type=Images',
            filebrowserImageUploadUrl: '/laravel-filemanager/upload?type=Images&_token=',
            filebrowserBrowseUrl: '/laravel-filemanager?type=Files',
            filebrowserUploadUrl: '/laravel-filemanager/upload?type=Files&_token='
        });
    }
}

Билдим еще раз:

npm run dev

И получаем наш результат:

Laravel Filemanager + CKEditor
Laravel Filemanager + CKEditor
Laravel Filemanager + CKEditor
Laravel Filemanager + CKEditor
Автоматическое удаление записей в ZoneMinder

Автоматическое удаление записей в ZoneMinder

Автоматическое удаление записей в  ZoneMinder

Сколько не искал как настроить ZM, чтобы он сам удалял старые записи, так и не смог найти. Пришлось сделать свой костыль на PHP. Скрипт писался исключительно для себя, и не претендует на правильность.

<?php
$servername = ""; // IP адрес MySQL сервера
$database = "zm"; // Имя БД
$username = ""; // Имя пользователя БД
$password = ""; // Пароль пользователя БД
$path = ""; // Путь к папке с записями
$interval = "7"; // Удалять записи старше N дней

// Создаем соединение
$mysqli = new mysqli($servername, $username, $password, $database);

// Получаем записи старше N дней
$result = $mysqli->query('SELECT * FROM `Events` WHERE StartDateTime < (NOW() - INTERVAL '.$interval.' DAY)');
$rows = $result->fetch_all(MYSQLI_ASSOC);

// Форматируем дату
$arrDates = array();
foreach($rows as $row) {
    $date = explode(' ', $row['StartDateTime'])[0];
    array_push($arrDates, $date);
}
// Удаляем дубликаты дат
$arrDates = array_unique($arrDates);

// Удаляем папки старше N дней
foreach($arrDates as $date) {
    // Удаление для каждого монитора отдельно
    exec('rm -R '.$path.'5/'.$date);
    exec('rm -R '.$path.'6/'.$date);
}

// Удаляем записи старше N дней
$mysqli->query('DELETE FROM `Events` WHERE StartDateTime < (NOW() - INTERVAL '.$interval.' DAY)');

// Закрываем соединение
$mysqli->close();

Скрипт запускается командой php script.php из консоли и может быть добавлен в cron.