axn/laravelcollective-form-to-raw-html

提供Artisan命令,用于将LaravelCollective Form::语法替换为原始HTML

1.1.2 2024-06-27 12:31 UTC

This package is auto-updated.

Last update: 2024-08-27 12:50:58 UTC


README

提供Artisan命令,用于将LaravelCollective Form::语法替换为原始HTML

它会搜索{!! Form::<method>(<arguments>) !!}{{ Form::<method>(<arguments>) }},然后分析参数以确定HTML标签属性。

安装

使用Composer,作为开发依赖项

composer require axn/laravelcollective-form-to-raw-html --dev

用法

只需运行此命令

php artisan laravelcollective-form-to-raw-html:run

默认情况下,命令会扫描resources/views/中的所有文件。

您还可以指定其他目录

php artisan laravelcollective-form-to-raw-html:run resources/views/admin/users

或单个文件

php artisan laravelcollective-form-to-raw-html:run resources/views/admin/users/create.blade.php

注意:目标路径始终相对于项目根目录。

支持的方法包括

  • open(options)
  • close()
  • label(name, value, options, escape)
  • labelRequired(name, value, options, escape)
  • input(type, name, value, options)
  • text(name, value, options)
  • number(name, value, options)
  • date(name, value, options)
  • time(name, value, options)
  • datetime(name, value, options)
  • week(name, value, options)
  • month(name, value, options)
  • range(name, value, options)
  • search(name, value, options)
  • email(name, value, options)
  • tel(name, value, options)
  • url(name, value, options)
  • color(name, value, options)
  • hidden(name, value, options)
  • checkbox(name, value, checked, options)
  • radio(name, value, checked, options)
  • file(name, options)
  • password(name, options)
  • textarea(name, value, options)
  • select(name, list, selected, options)
  • button(name, options)
  • submit(name, options)

如果方法不受支持,则不会进行替换。

警告和限制

转义echo,不进行双重编码

LaravelCollective通常在内部使用转义echo,不进行双重编码

e($value, false)

这防止了编码的HTML实体再次被编码(&amp; => &amp;amp;

因此,您将看到在替换中使用此功能以保持原始行为。

例如

<label>
    {!! e('<strong>Name &amp; firstname</strong>', false) !!}
<label>

HTML结果将是

&lt;strong&gt;Name &amp; firstname&lt;/strong&gt;

转义并双重编码

如果您不想使用此功能,可以将--escape-with-double-encode选项传递给命令。

因此,而不是这样转义

{!! e($value, false) !!}

值将这样转义

{{ $value }}

自动检索字段值

LaravelCollective有一个复杂的方法来自动检索字段的值:它在"old"值和请求中搜索。您可以在FormBuilder类的getValueAttribute方法中看到它。

由于实现起来过于复杂,因此转换器仅处理从"old"值检索的值。

例如

{!! Form::text('name') !!}

将被替换为

<input
    type="text"
    name="name"
    id="name"
    value="{!! e(old('name'), false) !!}"
>

如果您有名称为数组的字段,转换器将像LaravelCollective一样将数组语法替换为点语法,用于old辅助函数。

例如

{!! Form::text('name[0]') !!}

将被替换为

<input
    type="text"
    name="name[0]"
    value="{!! e(old('name.0'), false) !!}"
>

如果您已经在Form::语法中使用了old辅助函数,转换器将检测它并不会重复使用"old"辅助函数。

警告1:如果名称的一部分在变量中(例如Form::text('name['.$index.']')),转换器将像这样将替换函数集成到输出结果中

<input
    type="text"
    name="name[0]"
    value="{!! e(old(str_replace(['.', '[]', '[', ']'], ['_', '', '.', ''], 'name['.$index.']')), false) !!}"
>

警告 2:如果你有名称为数组但没有显式键的字段(例如 name[]),转换器无法确定使用哪个索引来获取正确的值,将简单地渲染 old('name') 而不是 old('name.<index>')。你可能需要检查这些情况,手动设置获取值的方式(例如:old('name.0'))。

自动确定单选按钮和复选框的选中状态

与获取值类似,转换器仅处理从“旧”值中获取的选中状态。如果“旧”值是多个,则使用 in_array

例如

{!! Form::checkbox('name[]') !!}

将被替换为

<input
    type="checkbox"
    name="name[]"
    value="1"
    @checked (in_array('1', (array) old('name')))
>

如果指定了默认选中状态,例如

{!! Form::checkbox('name[]', '1', true) !!}

它将显示为这样

<input
    type="checkbox"
    name="name[]"
    value="1"
    @checked (! old() ? true : in_array('1', (array) old('name')))
>

使用 optgroup 选择

Form::select 方法接受选项的分组数组以渲染 <optgroup>

这个功能太复杂,无法实现:这需要在 HTML 替换中添加大量代码,而这些代码 99% 的时间都是不必要的(除非你大量使用 optgroups)。转换器无法检测 list 参数是否包含组,因此无法检测使用 optgroups 的情况。你可能需要手动审查这些情况。

然而,转换器可以检测 Form::builderoptionsAttributesoptgroupsAttributes 参数是否已使用。如果是这样,相应的 Form::select 不会替换。

注释

如果原始语法中有注释,转换器将删除这些注释,但原始语法将以注释形式保留以供手动检查。你可以通过搜索 @TODO CHECK COMMENTS 来检索这些情况。

例如

{!! Form::text('name', null, [
    'class' => 'form-control',
    // 'required',
]) !!}

将被替换为

{{-- @TODO CHECK COMMENTS: {!! Form::text('name', null, [
    'class' => 'form-control',
    // 'required',
]) !!} --}}
<input
    type="text"
    name="name"
    id="name"
    value="{!! e(old('name'), false) !!}"
>

选项不是常规数组语法

如果选项参数不是常规数组,转换器将处理替换 Form:: 语法,但将选项保留在注释中以供手动检查和手动替换 HTML 标签属性。你可以通过搜索 @TODO CHECK OPTIONS 来检索这些情况。

例如

{!! Form::text('name', null,
    array_merge($defaultOptions, [
        'size' => 50,
        'required',
    ])
) !!}

将被替换为

<input
    type="text"
    name="name"
    id="name"
    value="{!! e(old('name'), false) !!}"
    {{-- @TODO CHECK OPTIONS: array_merge($defaultOptions, [
        'size' => 50,
        'required',
    ]) --}}
>

日期字段

LaravelCollective 的 datetimedatetimeweekmonth 方法支持使用 DateTime 实例作为值并内部格式化这些值。转换器无法检测值类型,因此如果你使用这些方法的值参数为 DateTime 实例,你可能需要审查这些情况。