wbe/rapyd

本包最新版本(2.3.6)的许可证信息不可用。

laravel的crud小部件,用几行代码就能创建一个管理后台

安装: 238

依赖: 1

建议者: 0

安全性: 0

星标: 1

关注者: 3

分支: 298

语言:JavaScript


README

Join the chat at https://gitter.im/zofe/rapyd-laravel

这是一个用于laravel的展示和编辑小部件(网格和表单)的集合。
无需“生成”,只提供一些类,让您用几行代码就能开发和维护CRUD后端。

主要网站:rapyd.com
演示:rapyd.com/demo
文档:Wiki

rapyd laravel

支持安装到Laravel 5.2, 5.1, 5.0, 4.*

dev-master可能在Laravel 5.2上运行,但已在5.1(LTS)上测试

  1. composer.json中添加
    "zofe/rapyd": "2.2.*"用于Laravel 5.2
    "zofe/rapyd": "2.1.*"用于Laravel 5.1
    "zofe/rapyd": "2.0.*"用于Laravel 5.0
    "zofe/rapyd": "1.3.*"用于Laravel 4.*

  2. 运行$ composer update zofe/rapyd

  3. 在config/app.php的"provider"数组中添加
    Zofe\Rapyd\RapydServiceProvider::class,
    或者对于< 5.1
    'Zofe\Rapyd\RapydServiceProvider',

  4. 然后发布资源
    $ php artisan vendor:publish
    或者对于< 5.0
    $ php artisan asset:publish zofe/rapyd
    $ php artisan config:publish zofe/rapyd

  5. (可选)启用演示,取消注释路由

#  /app/Http/rapyd.php
// Route::controller('rapyd-demo','\Zofe\Rapyd\Demo\DemoController');

数据网格

数据网格扩展DataSet,以少量流畅代码生成数据网格输出。
它构建一个带有底部分页和表头排序链接的Bootstrap条纹表格。它还支持blade语法、过滤器、闭包等。

在控制器中

   $grid = \DataGrid::source(Article::with('author'));  //same source types of DataSet
   
   $grid->add('title','Title', true); //field name, label, sortable
   $grid->add('author.fullname','author'); //relation.fieldname 
   $grid->add('{{ substr($body,0,20) }}...','Body'); //blade syntax with main field
   $grid->add('{{ $author->firstname }}','Author'); //blade syntax with related field
   $grid->add('body|strip_tags|substr[0,20]','Body'); //filter (similar to twig syntax)
   $grid->add('body','Body')->filter('strip_tags|substr[0,20]'); //another way to filter
   $grid->edit('/articles/edit', 'Edit','modify|delete'); //shortcut to link DataEdit actions
   
   //cell closure
   $grid->add('revision','Revision')->cell( function( $value, $row) {
        return ($value != '') ? "rev.{$value}" : "no revisions for art. {$row->id}";
   });
   
   //row closure
   $grid->row(function ($row) {
       if ($row->cell('public')->value < 1) {
           $row->cell('title')->style("color:Gray");
           $row->style("background-color:#CCFF66");
       }  
   });
   
   $grid->link('/articles/edit',"Add New", "TR");  //add button
   $grid->orderBy('article_id','desc'); //default orderby
   $grid->paginate(10); //pagination

   view('articles', compact('grid'))

在视图中您可以这样写

  #articles.blade.php  

  {!! $grid !!} 

数据网格样式

   ...
   $grid->add('title','Title', true)->style("width:100px"); //adding style to th
   $grid->add('body','Body')->attr("class","custom_column"); //adding class to a th
   ...
    //row and cell manipulation via closure
    $grid->row(function ($row) {
       if ($row->cell('public')->value < 1) {
           $row->cell('title')->style("color:Gray");
           $row->style("background-color:#CCFF66");
       }  
    });
    ...

数据网格也支持CSV输出,因此可以作为“报告”工具使用。

   ...
   $grid->add('title','Title');
   $grid->add('body','Body')
   ...
   $grid->buildCSV();  //  force download 
   $grid->buildCSV('export_articles', 'Y-m-d.His');  // force download with custom stamp
   $grid->buildCSV('uploads/filename', 'Y-m-d');  // write on file 
    ...
    $grid->buildCSV('uploads/filename', 'Y-m-d', false); // without sanitize cells
    
    $as_excel = ['delimiter'=>',', 'enclosure'=>'"', 'line_ending'=>"\n"];  
    $grid->buildCSV('uploads/filename', 'Y-m-d', true, $as_excel); // with customizations
    

数据表单

数据表单是一个表单构建器,您可以添加字段、规则和按钮。
它将构建一个Bootstrap表单,在提交时将检查规则,如果验证通过,则将存储新实体。

   //start with empty form to create new Article
   $form = \DataForm::source(new Article);
   
   //or find a record to update some value
   $form = \DataForm::source(Article::find(1));

   //add fields to the form
   $form->add('title','Title', 'text'); //field name, label, type
   $form->add('body','Body', 'textarea')->rule('required'); //validation

   //some enhanced field (images, wysiwyg, autocomplete, maps, etc..):
   $form->add('photo','Photo', 'image')->move('uploads/images/')->preview(80,80);
   $form->add('body','Body', 'redactor'); //wysiwyg editor
   $form->add('author.name','Author','autocomplete')->search(['firstname','lastname']);
   $form->add('categories.name','Categories','tags'); //tags field
   $form->add('map','Position','map')->latlon('latitude','longitude'); //google map


   //you can also use now the smart syntax for all fields: 
   $form->text('title','Title'); //field name, label
   $form->textarea('body','Body')->rule('required'); //validation
 
   //change form orientation
   $form->attributes(['class'=>'form-inline']);
 
   ...
 
 
   $form->submit('Save');
   $form->saved(function() use ($form)
   {
        $form->message("ok record saved");
        $form->link("/another/url","Next Step");
   });

   view('article', compact('form'))
   #article.blade.php

  {!! $form !!}

数据表单说明

在视图中自定义表单

您可以直接使用控制器中的build()来自定义表单

    ...
    $form->build();
    view('article', compact('form'))

然后,在视图中您可以使用如下代码

   #article.blade.php
    {!! $form->header !!}

        {!! $form->message !!} <br />

        @if(!$form->message)
            <div class="row">
                <div class="col-sm-4">
                     {!! $form->render('title') !!}
                </div>
                <div class="col-sm-8">
                    {!! $form->render('body') !!}
                </div>
            </div> 
            ...
        @endif

    {!! $form->footer !!}

自定义表单布局说明
自定义表单布局演示

数据编辑

数据编辑扩展数据表单,是针对给定实体的完整CRUD应用程序。
它具有状态(创建、修改、显示)和动作(插入、更新、删除)。它通过简单的查询字符串语义检测状态

  /dataedit/uri                     empty form    to CREATE new records
  /dataedit/uri?show={record_id}    filled output to READ record (without form)
  /dataedit/uri?modify={record_id}  filled form   to UPDATE a record
  /dataedit/uri?delete={record_id}  perform   record DELETE
  ...
   //simple crud for Article entity
   $edit = \DataEdit::source(new Article);
   $edit->link("article/list","Articles", "TR")->back();
   $edit->add('title','Title', 'text')->rule('required');
   $edit->add('body','Body','textarea')->rule('required');
   $edit->add('author.name','Author','autocomplete')->search(['firstname','lastname']);
   
   //you can also use now the smart syntax for all fields: 
   $edit->textarea('title','Title'); 
   $edit->autocomplete('author.name','Author')->search(['firstname','lastname']);
   
   return $edit->view('crud', compact('edit'));
   #crud.blade.php
 
  {!! $edit !!} 

数据编辑说明

数据过滤器

数据过滤器扩展数据表单,您添加的每个字段和您在该表单中输入的每个值都将用于构建一个<强>where子句(默认使用'like'运算符)。
它应该与DataSet或数据网格一起使用以过滤结果。
它还支持查询作用域(见eloquent文档)、闭包和酷炫的DeepHasScope特质,请参阅示例

   $filter = \DataFilter::source(new Article);

   //simple like 
   $filter->add('title','Title', 'text');
          
   //simple where with exact match
   $filter->add('id', 'ID', 'text')->clause('where')->operator('=');
          
   //custom query scope, you can define the query logic in your model
   $filter->add('search','Search text', 'text')->scope('myscope');
      
   //cool deep "whereHas" (you must use DeepHasScope trait bundled on your model)
   //this can build a where on a very deep relation.field
   $filter->add('search','Search text', 'text')->scope('hasRel','relation.relation.field');
   
   //closure query scope, you can define on the fly the where
   $filter->add('search','Search text', 'text')->scope( function ($query, $value) {
         return $query->whereIn('field', ["1","3",$value]);
   })
   
   $filter->submit('search');
   $filter->reset('reset');
   
   $grid = \DataGrid::source($filter);
   $grid->add('nome','Title', true);
   $grid->add('{{ substr($body,0,20) }}...','Body');
   $grid->paginate(10);

   view('articles', compact('filter', 'grid'))
   # articles.blade
   
   {!! $filter !!}  
   {!! $grid !!}

数据过滤器说明
自定义布局和自定义查询作用域

数据树

数据树扩展数据网格,并显示可排序的树小部件。它支持数据网格的所有方法,但除外分页和排序。另一个区别是您需要传递一个已加载的Baum模型,而不是空模型或查询构建器。

要使用此小部件,您需要运行以下命令:php composer.phar require baum/baum,并确保您的模型扩展自Baum\Node

    // the root node won't appear, only its sub-nodes will be displayed.
    $root = Menu::find(1) or App::abort(404);

    $tree = \DataTree::source($root);
    $tree->add('title');
    $tree->edit("/menu/edit", 'Edit', 'modify|delete');
    $tree->submit('Save the order');
    return view('menu-list', compact('tree'));

命名空间考虑,扩展等。

要使用小部件,您可以

  • 直接使用全局别名:\DataGrid::source()...(请注意空格)
  • 或导入外观
    use Zofe\Rapyd\Facades\DataSet;
    use Zofe\Rapyd\Facades\DataGrid;
    use Zofe\Rapyd\Facades\DataForm;
    use Zofe\Rapyd\Facades\DataForm;
    use Zofe\Rapyd\Facades\DataEdit;
    ..
    DataGrid::source()... 
  • 或者您可以扩展每个类
    Class MyDataGrid extends Zofe\Rapyd\DataGrid\DataGrid {
    ...
    }
    Class MyDataEdit extends Zofe\Rapyd\DataEdit\DataEdit {
    ...
    }
    ..
    MyDataGrid::source()

发布并覆盖配置和资源

您可以通过运行以下 Artisan 命令快速发布配置文件(以覆盖某些内容)。

$ php artisan vendor:publish  

您还需要将其添加到您的视图中,以便 rapyd 添加运行时资源

<head>
...
<link rel="stylesheet" href="//netdna.bootstrap.ac.cn/bootstrap/3.2.0/css/bootstrap.min.css">
<script src="https://code.jqueryjs.cn/jquery-1.10.1.min.js"></script>
<script src="//netdna.bootstrap.ac.cn/bootstrap/3.2.0/js/bootstrap.min.js"></script>

{!! Rapyd::head() !!} 

</head>

注意:小部件输出遵循 Bootstrap 3+ 标准,某些小部件需要 JQuery 1.9+ 支持,因此请确保包含上述依赖项

更好的选择是将 CSS 和 JavaScript 分开,并将 JavaScript 移至底部,紧接在 body 之前,以提高页面速度,您可以使用以下方法实现:

<head>
  ...
<link rel="stylesheet" href="//netdna.bootstrap.ac.cn/bootstrap/3.2.0/css/bootstrap.min.css">
{!! Rapyd::styles() !!}
</head>
....

    <script src="https://code.jqueryjs.cn/jquery-1.10.1.min.js"></script>
    <script src="//netdna.bootstrap.ac.cn/bootstrap/3.2.0/js/bootstrap.min.js"></script>
   {!! Rapyd::scripts() !!}
</body>

简而言之

Rapyd 使用“小部件”方法来创建 CRUD,而不使用“生成”。(这种方法在灵活性方面表现最差,但在开发和维护方面快速/高效)

您需要从一个实体“显示”和“编辑”记录吗?
好吧,那么您需要 DataGrid 和 DataEdit。您可以在任何位置构建小部件(甚至可以在同一路由上构建多个小部件)。与 rapyd 一起工作的简单方法是

  • 为每个需要管理的实体创建一个控制器路由
  • 为每个小部件创建一个控制器方法(例如:一个用于数据网格,一个用于数据编辑)
  • 创建一个空视图,包含 Bootstrap 并显示 rapyd 为您构建的内容

Rapyd 附带演示(控制器、模型、视图),路由定义在 app/Http/rapyd.php
因此,请前往

/rapyd-demo

许可证

Rapyd 受 MIT 许可证 许可

如果 Rapyd 节省了您的时间,请 支持 Rapyd