gakowalski/gk-form-toolkit

Laravel 的 CRUD 和表单相关工具

dev-master 2024-07-31 10:31 UTC

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('模式名称') 获取当前模式状态。结果不是空字符串,而是 truefalse

表单

变量绑定

如果由于某些原因 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请求文件。