elbadawy/laravel-backpack-crud-extended

该扩展包扩展了 Laravel Backpack\CRUD

0.3.3 2019-06-25 10:48 UTC

README

Travis Packagist Release Licence

此扩展包扩展了 Backpack/CRUD。以下列出了所有添加的功能。

无需对控制器或其它包进行任何修改即可实现此功能;

  • 此包可以覆盖所有 Backpack/CRUD 视图;
  • 扩展了 CrudPanel 类。

目录

安装

在您的终端中

composer require novius/laravel-backpack-crud-extended

然后,如果您使用的是 Laravel 5.4(不需要 Laravel 5.5 及更高版本),请将服务提供者注册到您的 config/app.php 文件中

'providers' => [
    ...
    Novius\Backpack\CRUD\CrudServiceProvider::class,
];

发布视图

如果您已经发布了 backpack-crud 视图,则此包将无法工作。您必须从 resources/views/vendor/backpack/crud/ 中删除视图,或者用以下方式覆盖它们:

php artisan vendor:publish --provider="Novius\Backpack\CRUD\CrudServiceProvider" --force

配置

以下是一些可以覆盖的选项。

php artisan vendor:publish --provider="Novius\Backpack\CRUD\CrudServiceProvider" --tag="config"

使用 & 特性

权限

描述

  • 权限可以自动应用于 CRUD 控制器:如果没有与路由关联的权限,则拒绝访问 => apply_permissions 选项
  • 可以为应用程序中使用的所有 Crud 控制器自动创建权限(将创建 4 个权限:列表、更新、创建、删除)=> create_permissions_while_browsing 选项
  • 可以为登录用户自动分配权限(在本地环境中很有用)=> give_permissions_to_current_user_while_browsing 选项

要求

php artisan permissions:generate // Insert permissions in database for each CRUD controllers.
  • 将您希望启用的每个选项设置为 true

用法

您的 CrudController 必须扩展 \Novius\Backpack\CRUD\Http\Controllers\CrudController

CRUD 框架

现在,您可以创建多个框来分割您的创建/编辑输入。

backpack-crud-boxes

为了使用此功能,您只需为每个字段指定框名称。

$this->crud->addField([
    'name' => 'title',
    'label' => "My Title",
    'type' => 'text',
    'box' => 'Box name here'
]);

您还可以为每个框指定一些选项

$this->crud->setBoxOptions('Details', [
    'side' => true,         // Place this box on the right side?
    'class' => "box-info",  // CSS class to add to the div. Eg, <div class="box box-info">
    'collapsed' => true,    // Collapse this box by default?
]);

如果您忘记指定字段的标签名称,Backpack 将将其放置在最后一个框中。

您可以在 crud 文件中手动指定默认框。如果您的字段没有框属性,则该字段将显示在此默认框中。

$this->crud->setDefaultBox('YourBoxName');

字段驱动

字段类型现在可以是类名

$this->crud->addField([
    'name' => 'username',
    'label' => "My username",
    'type' => \My\Other\Package\Field\Foo::class,
]);

这允许您在外部包中提出新的字段类型。您的字段类必须实现字段契约。

语言 / i18n

为特定 CRUD 设置自定义字典

$this->crud->setLangFile('backpack::crud/movie');

然后,此字典将在 CRUD 视图中使用。

您可以使用它在自己的视图中,如下所示

{{ trans($crud->getLangFile().'.add') }}

上传字段:UploadableFile 特性

如果您使用上传 CRUD 字段,则可以在您的模型上实现此特性,以便自动上传/删除服务器上的文件。

示例

// Article Model

class Article extends \Backpack\NewsCRUD\app\Models\Article
{
    use Sluggable, SluggableScopeHelpers;
    use HasTranslations;
    use UploadableFile;

    protected $fillable = ['slug', 'title', 'content', 'image', 'status', 'category_id', 'featured', 'date', 'document', 'document_2'];
    protected $translatable = ['slug', 'title', 'content'];

    public function uploadableFiles(): array
    {
        return [
            ['name' => 'document'],
            ['name' => 'document_2', 'slug' => 'title']
        ];
    }
}
// ArticleCrudController

$this->crud->addField([ 
    'label' => 'Image',
    'name' => 'image',
    'type' => 'image',
    'upload' => true,
    'crop' => true, // set to true to allow cropping, false to disable
    'aspect_ratio' => 0, // ommit or set to 0 to allow any aspect ratio
    'prefix' => '/storage/',
]);

$this->crud->addField([
    'label' => 'Document',
    'name' => 'document',
    'type' => 'upload',
    'upload' => true,
    'prefix' => '/storage/',
]);

$this->crud->addField([
    'label' => 'Document 2',
    'name' => 'document_2',
    'type' => 'upload',
    'upload' => true,
    'prefix' => '/storage/',
]);

上传字段:file_upload_crud 验证规则

存在一个验证规则,可以轻松验证包含“上传”字段的 CRUD 请求。

在您的请求文件中使用示例

public function rules()
{
    return [
        'name' => 'required|min:2|max:191',           
        'document' => 'file_upload_crud:pdf,docx', // the parameters must be valid mime types
    ];
}

public function messages()
{
    return [
        'file_upload_crud' => 'The :attribute must be a valid file.',
    ];
}

图片字段:UploadableImage 特性

如果您使用 Image CRUD 字段,则可以在您的模型上实现此特性,以便自动管理在服务器上保存和删除图片。

示例

namespace App\Models;

use Backpack\CRUD\CrudTrait;
use Illuminate\Database\Eloquent\Model;
use Novius\Backpack\CRUD\ModelTraits\UploadableImage;

class Example extends Model
{
    use CrudTrait;
    use UploadableImage;

    protected $fillable = ['title', 'image', 'thumbnail'];

    public function uploadableImages()
    {
        return [
            [
                'name' => 'image', // The attribute name where to store the image path
                'slug' => 'title', // The attribute name from which to generate the image file name (optionnal)
            ],
            [
                'name' => 'thumbnail',
            ],
        ];
    }
}

如果您想在保存或删除图片后执行一些自定义操作

namespace App\Models;

use Backpack\CRUD\CrudTrait;
use Illuminate\Database\Eloquent\Model;
use Novius\Backpack\CRUD\ModelTraits\UploadableImage;

class Example extends Model
{
    use CrudTrait;
    use UploadableImage {
        imagePathSaved as imagePathSavedNative;
        imagePathDeleted as imagePathDeletedNative;
    }

    protected $fillable = ['title', 'image', 'thumbnail'];

    public function uploadableImages()
    {
        return [
            [
                'name' => 'image', // The attribute name where to store the image path
                'slug' => 'title', // The attribute name from which to generate the image file name (optionnal)
            ],
            [
                'name' => 'thumbnail',
            ],
        ];
    }

    /**
     * Callback triggered after image saved on disk
     */
    public function imagePathSaved(string $imagePath, string $imageAttributeName = null, string $diskName = null)
    {
        if (!$this->imagePathSavedNative()) {
            return false;
        }

        // Do what you want here

        return true;
    }

    /**
     * Callback triggered after image deleted on disk
     */
    public function imagePathDeleted(string $imagePath, string $imageAttributeName = null, string $diskName = null)
    {
        if (!$this->imagePathDeletedNative()) {
            return false;
        }
        
        // Do what you want here

        return true;
    }
}

媒体库

如果您想将图片存储在Spatie提供的媒体库中,请使用SpatieMediaLibrary\UploadableImage特质,而不是使用UploadableImage

例如,使用媒体库可以轻松管理转换(裁剪、缩放等)。

翻译

两个特质UploadableImageSpatieMediaLibrary\UploadableImage都与Spatie提供的翻译包兼容。

对于具有SpatieMediaLibrary\UploadableImage的可翻译图片,存储图片的集合名称由属性名和区域设置名称组成,两者之间用短横线分隔(例如:image-enimage-fr等)。

CRUD:自定义路由

您可以设置某些路由的自定义值。

  • 索引路由:与“返回所有”按钮或面包屑链接一起使用。通过$crud->indexRoute()可用。
  • 重新排序路由:与“重新排序按钮”一起使用。通过$crud->reorderRoute()可用。

在您的CrudController中的使用示例

// Set a custom index route
$this->crud->setIndexRoute('crud.slide.index', ['slideshow' => (int) request('slideshow')]);

// Set a custom reorder route
$this->crud->setReorderRoute('crud.slide.reorder', ['slideshow' => (int) request('slideshow')]);

测试

使用以下命令运行测试

./test.sh

代码风格检查

使用php-cs运行

./cs.sh

贡献

欢迎贡献力量!在Github上提交问题,或创建一个Pull Request。

许可证

本软件包遵循GNU Affero General Public License v3或(根据您的选择)任何后续版本。

然而,本软件包需要Backpack\CRUD,它遵循YUMMY许可协议:如果您将其用于商业项目,您必须购买Backpack许可证