📜  laravel 旧值在 textarea 中不起作用 - PHP (1)

📅  最后修改于: 2023-12-03 15:02:37.271000             🧑  作者: Mango

Laravel 旧值在 textarea 中不起作用 - PHP

在使用 Laravel 构建 Web 应用程序时,我们经常需要在表单中使用输入框。其中一种输入框类型是文本区域(textarea),它可以让用户输入多行文本。当用户提交表单时,我们可能需要在下一个页面上保留用户在文本区域中输入的值。为了实现此功能,Laravel 提供了一个方便的助手函数 old()。

然而,有时候我们可能会遇到一个问题,即 Laravel 旧值在 textarea 中不起作用。在本文中,我们将讨论这个问题以及如何解决它。

问题

在使用 Laravel 表单构建器创建一个包含文本区域的表单时,在提交表单而没有通过验证返回到表单页面之后,文本区域中的旧值没有被保留。此时,文本区域将会被清空。

这是因为 Laravel 表单构建器默认会为 textarea 标签设置一个双向绑定值,而这个双向绑定值将覆盖掉旧值。

解决方案

有两种可行的解决方案可以解决这个问题。

方案一:手动设置 textarea 值

在传递给文本区域的值中包含旧值。我们可以通过以下方式实现:

<textarea name="description">{{ old('description', $post->description) }}</textarea>

这里,我们使用两个参数调用 old() 函数。第一个参数是字段名称,第二个参数是默认值。如果没有传递旧值,则使用默认值。

方案二:使用自定义表单字段

可以创建一个自定义表单字段,将其用于 textarea 元素,该自定义字段将处理文本区域的值并保留旧值。以下是自定义表单字段的示例:

namespace App\Forms\Fields;

use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\View\View;
use Kris\LaravelFormBuilder\Fields\FormField;

class TextArea extends FormField
{
    /**
     * The default value.
     *
     * @var mixed
     */
    protected $defaultValue = '';

    /**
     * The field type.
     *
     * @var string
     */
    protected $type = 'textarea';

    /**
     * The field template.
     *
     * @var string
     */
    protected $template = 'fields.textarea';

    /**
     * The field options.
     *
     * @var Collection
     */
    protected $options;

    /**
     * Set the field options.
     *
     * @param array $options
     * @return $this
     */
    public function setOptions(array $options)
    {
        $this->options = collect($options);

        return $this;
    }

    /**
     * Get the field options.
     *
     * @return Collection
     */
    public function getOptions()
    {
        return $this->options ?? collect([]);
    }

    /**
     * Set the default value.
     *
     * @param mixed $value
     * @return $this
     */
    public function setDefaultValue($value)
    {
        $this->defaultValue = $value;

        return $this;
    }

    /**
     * Get the default value.
     *
     * @return mixed
     */
    public function getDefaultValue()
    {
        return $this->defaultValue;
    }

    /**
     * Get the field value.
     *
     * @return mixed
     */
    public function getValue()
    {
        $name = $this->getNameKey();
        $value = $this->getOption('value');
        $default = $this->getDefaultValue();

        return Arr::get(old(), $name, $value ?? $default);
    }

    /**
     * Render the field.
     *
     * @return View
     */
    public function render()
    {
        $this->setupTranslation();
        $this->setupLabel();
        $this->setupErrors();

        return view($this->template, [
            'name' => $this->getNameKey(),
            'value' => $this->getValue(),
            'attributes' => $this->attributes,
            'options' => $this->getOptions(),
            'label' => $this->getLabel(),
            'errors' => $this->getErrors(),
        ]);
    }
}

在自定义表单字段中,我们从 FormBuilder 基类继承了一个 textarea 表单字段。该表单字段重载了 getValue() 方法,该方法首先检查旧值是否存在,如果存在则返回它,否则返回默认值。这样就可以处理文本区域的值并保留旧值。

结论

在使用 Laravel 构建 Web 应用程序时,我们可能会遇到旧值在 textarea 中不起作用的问题。这是因为 Laravel 提供的默认 textarea 绑定会覆盖旧值。要解决此问题,我们可以手动设置 textarea 值或创建一个自定义表单字段。