gakowalski / gk-form-toolkit
Laravel 的 CRUD 和表单相关工具
Requires
- php: ^8.0
- mk-j/php_xlsxwriter: ^0.38.0
This package is auto-updated.
Last update: 2024-10-01 00:14:49 UTC
README
安装
要求和兼容性
该包在以下环境中进行了测试
- PHP 8.0
- Laravel 8
理论上它也应该在 PHP 7.4 上运行。在 Laravel 7 上可能会出现与文件夹结构以及(因此)命名空间相关的问题。
新服务
sudo /usr/local/bin/composer self-update && composer --version
composer update
composer require gakowalski/gk-form-toolkit
更新使用分布式文件而非包的服务
rm -v app/Html.php app/Smartcrop.php app/Http/Controllers/GenericAppController.php app/Http/Requests/ModelBasedFormRequest.php
sudo /usr/local/bin/composer self-update && composer --version
composer update
composer require gakowalski/gk-form-toolkit
使用方法
错误处理
要使用替代的错误日志记录方法,需要在 app\Exceptions\Handler.php
文件中将 report()
方法更改为
public function report(Throwable $exception) { \Kowalski\Laravel\App\Exceptions\Handler::report($exception); }
Html
简介
\App\Html
类是一组解决方案,在 基础级别 上帮助生成 HTML 代码,在 扩展级别 上处理表单。
尽管该类有构造函数,但创建其实例只发生在非常基础的生成单个 HTML 标签的情况下。在 99% 的情况下,工作是在基于调用静态方法之一的更高抽象级别上完成的。几乎所有这些方法都返回 string
类型或可以直接转换为 string
的对象,并且结果是为了在视图文件中使用而设计的,所以通常看起来是这样的
{!! \App\Html::some_function('some_arg', $some_arg_2) !!}
重要的是使用 而不是传统的
{{ }}
来传递文本内容到视图,而不会进行过滤。
为了可读性,引入了使用特定 Blade 指令 @html
的可能性。此时代码如下所示
@html(some_static_function('some_arg', $some_arg_2))
使用搜索和替换迁移到指令
{!! \App\Html::
更改为@html(
!!}
及!!}
更改为)
创建简单标签
{!! new \App\Html('p', 'Hello <u>world</u>!', [ 'align' => 'center', 'id' => 'my-hello', ]) !!}
上述代码生成以下 HTML
<p align="center" id="my-hello">Hello <u>world<u>!</p>
对于某些标签,如果标签的内容等于 null
,则不会生成关闭标签。
{!! new \App\Html('input', null, [ 'type' => 'submit' ]) !!}
此类标签的列表位于 \App\Html::$_self_closing_tags
中。
创建链接
1 @html(link('http://domain.com')) 2 @html(link('http://domain.com', 'Moja domena')) 3 @html(new_tab('http://domain.com')) 4 @html(new_tab('http://domain.com', 'Moja domena')) 5 @html(email('info@domain.com')) 6 @html(email('info@domain.com', 'Napisz do mnie')) 7 @html(phone('123456789')) 8 @html(phone('123456789', 'Zadzwoń!'))
大致对应于
1 <a href="http://domain.com">http://domain.com<a> 2 <a href="http://domain.com">Moja domena<a> 3 <a href="http://domain.com" target="_blank">http://domain.com<a> 4 <a href="http://domain.com" target="_blank">Moja domena<a> 5 <a href="mailto:info@domain.com">info@domain.com<a> 6 <a href="mailto:info@domain.com">Napisz do mnie<a> 7 <a href="tel:123456789">123456789<a> 8 <a href="tel:123456789">Zadzwoń do mnie<a>
创建多选框和单选按钮组
单选按钮组
垂直布局的单选按钮组
@html(form_group('select_radio', 'answer', $category_id, null, [ 'options' => [ 0 => 'NIE', 1 => 'TAK', 2 => 'NIE WIEM', ], ]))
对于 Bootstrap,要获得水平布局,请将字段包含在容器中,然后使用基于 flex 的 CSS 规则。
.kontener .form-control { display: flex; gap: 2em; font-size: 1em; }
对于 JetStream 以及 Tailwind,可以通过 options_group_classes
传递相应的样式。
@html(form_group('select_radio', 'answer', $category_id, null, [ 'options' => [ 0 => 'NIE', 1 => 'TAK', ], 'options_group_classes' => 'flex', ]))
多级选择框
@html(form_group('select_multilevel', 'zwierzeta', 'rodzaj', 'Rodzaj zwierzęcia', [ 'options' => json_decode(json_encode([ [ 'label' => 'Ssaki', 'value' => '2', 'children' => [ [ 'value' => 'pies', 'label' => 'Pies', 'children' => null ], [ 'value' => 'kot', 'label' => 'Kot', 'children' => null ], [ 'value' => 'kon', 'label' => 'Koń', 'children' => null ], ], ], [ 'label' => 'Ptaki', 'value' => '1', 'children' => [ [ 'value' => 'slowik', 'label' => 'Słowik', 'children' => null ], [ 'value' => 'golab', 'label' => 'Gołąb', 'children' => null ], [ 'value' => 'wrona', 'label' => 'Wrona', 'children' => null ], ], ], ])), 'options_default_label' => '(Wybierz zwierzę)', ])) </div>
控制模式
可以通过更改模式设置来更改 \App\Html
类的许多生成元素的行为。启用模式的方式如下
@html(set_mode('nazwa_trybu', true))
请注意,该方法始终返回空字符串。
禁用模式如下所示
@html(set_mode('nazwa_trybu', false))
可以通过方法 get_mode('模式名称')
获取当前模式状态。结果不是空字符串,而是 true
或 false
。
表单
变量绑定
如果由于某些原因 form_group
无法从相应的数组中读取数据,则可以手动将数组的名称与变量绑定。
@html(form_add_var('search', $search))
文件上传
要使上传功能正常工作,首先需要在 API 中添加 upload
路由,该路由将处理将 single_file
写入文件、检查其属性、创建缩略图,并且最重要的是返回一个包含属性的对象的 JSON。
- url - 后续添加到基本网站地址的路径
- preview - 如果没有可用的缩略图,这里应该包含一个替代图像的 URL(可能是占位符,也可能是完整尺寸的目标图像)
- thumbnail - 缩略图的路径
- 标题 - 文件名或显示在缩略图中的其他名称,
Route::post('upload', function(Request $request) { $supported_images = ['jpeg', 'jpg', 'JPG', 'gif', 'png']; $thumbnail = ''; if ($request->hasFile('single_file') && $request->file('single_file')->isValid()) { $path = 'attachments/' . time() . '--' . $request->single_file->getClientOriginalName(); file_put_contents(storage_path('app/public/') . $path, $request->single_file->getContent()); if (in_array(pathinfo($path, PATHINFO_EXTENSION), $supported_images)) { Smartcrop::thumbnail(storage_path('app/public/') . $path, 300, 300); $thumbnail = Smartcrop::asset("storage/$path", 300, 300); } return json_encode([ 'url' => "storage/$path", 'preview' => in_array(pathinfo($path)['extension'], $supported_images) ? "storage/$path" : asset('storage/images/file-icon-pngwing.com.png'), 'thumbnail' => $thumbnail, 'title' => $request->single_file->getClientOriginalName(), ]); } return 'ERROR'; })->name('upload');
然后您可以添加表单字段类型为file
并设置相应选项
- 路由 - 用于上传功能的路由名称
- loader - 动画图像的路径,在上传功能返回正确缩略图链接之前将预显示
- use_smartcrop - 是否使用SmartCrop库来裁剪缩略图,以便包含原始图像的最重要部分
- default_source - 当没有缩略图时显示的默认图标
- preview_width - 缩略图的宽度
- preview_height - 缩略图的高度
- gallery_name - 当使用glightbox库时,用作data-gallery属性值的画廊名称
- gallery_selector - 包含图像的
a
元素类名称,以便将它们全部纳入一个glightbox画廊
$html = ''; $html .= \App\Html::form_group('file', $variable, $field . '--zalacznik--1', null, [ 'upload' => [ 'route' => route('upload'), 'loader' => asset('storage/images/ajax-loader.gif'), 'use_smartcrop' => true, 'default_source' => asset('storage/images/file-icon-pngwing.com.png'), 'preview_width' => 150, 'preview_height' => 150, 'gallery_name' => "$variable--$field", 'gallery_selector' => 'glightbox', ], ]); $html .= new \App\Html('label', "Dodaj załącznik", [ 'for' => \App\Html::field_id($variable, $field, 'upload-input'), 'class' => 'btn', ]); echo $html;
导出为XLSX
类模板
cd app/Templates/
cp GenericControllerTemplate.php make Patronat
生成新的PatronatControllerTemplate,PatronatController,Patronat模型文件和Patronat请求文件。