📅  最后修改于: 2023-12-03 15:02:37.271000             🧑  作者: Mango
在使用 Laravel 构建 Web 应用程序时,我们经常需要在表单中使用输入框。其中一种输入框类型是文本区域(textarea),它可以让用户输入多行文本。当用户提交表单时,我们可能需要在下一个页面上保留用户在文本区域中输入的值。为了实现此功能,Laravel 提供了一个方便的助手函数 old()。
然而,有时候我们可能会遇到一个问题,即 Laravel 旧值在 textarea 中不起作用。在本文中,我们将讨论这个问题以及如何解决它。
在使用 Laravel 表单构建器创建一个包含文本区域的表单时,在提交表单而没有通过验证返回到表单页面之后,文本区域中的旧值没有被保留。此时,文本区域将会被清空。
这是因为 Laravel 表单构建器默认会为 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 值或创建一个自定义表单字段。