sleeping owl

sleeping owl

sleeping

<?php

namespace App\Http\Section;

use File;
use App\Rating;
use App\Tag;
use Illuminate\Database\Eloquent\Model;
use SleepingOwl\Admin\Contracts\Display\DisplayInterface;
use SleepingOwl\Admin\Contracts\Form\FormInterface;
use SleepingOwl\Admin\Contracts\Initializable;
use SleepingOwl\Admin\Section;
use AdminDisplay;
use AdminColumn;
use AdminForm;
use AdminFormElement;


/**
 * Class Training
 *
 * @property \App\Training $model
 *
 * @see http://sleepingowladmin.ru/docs/model_configuration_section
 */
class Training extends Section implements Initializable
{
    protected $size = '10737418240';
    protected $model = '\App\Training';
    /**
     * @see http://sleepingowladmin.ru/docs/model_configuration#ограничение-прав-доступа
     *
     * @var bool
     */
    protected $checkAccess = false;
    /**
     * @var string
     */
    protected $title;
    /**
     * @var string
     */
    protected $alias;

    public function initialize()
    {
        // Добавление пункта меню и счетчика кол-ва записей в разделе
        $this->addToNavigation($priority = 500, function () {
            return \App\Training::count();
        });

        $this->creating(function ($config, \Illuminate\Database\Eloquent\Model $model) {
            //...
        });
    }

    public function deleteImageVideo($local, $imageUrl)
    {
        if (File::exists(public_path() . '/' . $local)) ;
        {

            File::delete(public_path() . '/' . $local);
        }
        if (File::exists(public_path() . '/' . $imageUrl)) ;
        {

            File::delete(public_path() . '/' . $imageUrl);
        }
        return true;
    }

    public function createImageFromVideo($local_url)
    {
        $video_path = public_path() . '/' . $local_url;
        $image_path = 'files/uploads/images/' . str_random(10) . '.jpg';

        $preview_path = public_path() . '/' . $image_path;

        exec(escapeshellcmd('convert ' . escapeshellarg($video_path) . '[100] ' . escapeshellarg($preview_path)));
        return $image_path;
    }

    /**
     * @return DisplayInterface
     */
    public function onDisplay()
    {
        return AdminDisplay::datatables()/*->with('users')*/
        ->setHtmlAttribute('class', 'table-primary')
            ->setColumns(
                AdminColumn::text('id', '#')->setWidth('30px'),
                AdminColumn::link('title', 'Title')->setWidth('200px'),
                // AdminColumn::text('description', 'Description'),
                AdminColumn::custom('Description', function (\Illuminate\Database\Eloquent\Model $model) {
                    return strip_tags(str_limit($model->description, 50));
                }),
                //AdminColumn::text('Lang', 'language'),
                AdminColumn::lists('tags.name', 'Tag'),
                AdminColumn::lists('categories.name', 'Category'),
                AdminColumn::custom('Rate', function (\Illuminate\Database\Eloquent\Model $model) {
                    $rate = (int)Rating::where('training_id', $model->id)->avg('rate');
                    return $rate;
                }),
                AdminColumn::custom('Lang', function (\Illuminate\Database\Eloquent\Model $model) {
                    return $model->lang->name;
                })

            )->paginate(20);
        // todo: remove if unused
    }

    /**
     *
     * @param int $id
     *
     * @return FormInterface
     */
    public function onEdit($id)
    {
        return AdminForm::panel()->addBody([
            AdminFormElement::text('title', 'Title')->required(),
            AdminFormElement::wysiwyg('description', 'Description')->required(),
            //AdminFormElement::select('language', 'Language')->setOptions(['english' => 'english', 'russian' => 'russian'])->required()->setSortable(false),
            AdminFormElement::file('local_url', 'Local Url')->maxSize((int)$this->size),
            AdminFormElement::text('external_url', 'External Url'),
            AdminFormElement::multiselect('tags', 'Tag')->setModelForOptions(Tag::class)->setDisplay('name')->required(),
            AdminFormElement::multiselect('categories', 'Category')->setModelForOptions(\App\Category::class)->setDisplay('name')->required(),
            AdminFormElement::select('language_id', 'Language')->setModelForOptions(\App\Language::class)->setDisplay('name')->exclude(['any' => '1'])->required(),
            AdminFormElement::text('id', 'ID')->setReadonly(1),
            AdminFormElement::text('created_at')->setLabel('Создано')->setReadonly(1),
            AdminFormElement::custom(function (Model $model) {
                if ((string)$model->local_url == 'false' || empty($model->local_url)) {
                    $local = $model->getOriginal('local_url');
                    $imageUrl = $model->getOriginal('imageUrl');

                    $this->deleteImageVideo($local, $imageUrl);
                    $model->imageUrl = '';
                }
                if ($model->local_url == $model->getOriginal('local_url')) {
                    return $model;
                }
                $local = $model->getOriginal('local_url');
                $imageUrl = $model->getOriginal('imageUrl');

                $this->deleteImageVideo($local, $imageUrl);

                if (!empty($model->local_url) && (string)$model->local_url != 'false') {

                    $model->imageUrl = $this->createImageFromVideo($model->local_url);
                }

            })

        ]);
        // todo: remove if unused
    }

    /**
     * @return FormInterface
     */
    public function onCreate()
    {
        return AdminForm::panel()->addBody([
            AdminFormElement::text('title', 'Title')->required(),
            AdminFormElement::select('language_id', 'Language')->setModelForOptions(\App\Language::class)->setDisplay('name')->exclude(['any' => '1'])->required(),
            AdminFormElement::multiselect('tags', 'Tag')->setModelForOptions(Tag::class)->setDisplay('name')->required(),
            AdminFormElement::multiselect('categories', 'Category')->setModelForOptions(\App\Category::class)->setDisplay('name')->required(),
            //AdminFormElement::text('description', 'Description')->required(),
            AdminFormElement::wysiwyg('description', 'Description')->required(),
            AdminFormElement::file('local_url', 'Local Url')->maxSize((int)$this->size),
            AdminFormElement::custom(function (Model $model) {
                if (!empty($model->local_url)) {
                    $model->imageUrl = $this->createImageFromVideo($model->local_url);
                }

            }),
            AdminFormElement::text('external_url', 'External Url')

        ]);
    }

    /**
     * @return void
     */
    public function onDelete($id)
    {
        if (\App\Training::find($id)) {
            $local = \App\Training::find($id)->local_url;
            $imageUrl = \App\Training::find($id)->imageUrl;

        }
        $this->deleteImageVideo($local, $imageUrl);
        if (!\App\Training::find($id)) {
            return false;
        }

        \App\Training::find($id)->users()->detach();
        \App\Training::find($id)->tags()->detach();
        \App\Training::find($id)->categories()->detach();
        \App\Training::find($id)->views()->detach();


    }

    /**
     * @return void
     */
    public function onRestore($id)
    {
        // todo: remove if unused
    }
}