Laravel admin form tab表單插入html

版本

"encore/laravel-admin": "^1.8",

問題及需求

需要在 laravel admin form tab 裡面純 HTML 顯示,如下圖所示,想要在橘色框裡直接顯示 HTML 而不是 laravel admin 表單組件的 HTML 顯示。

懶人包

  1. 創建一個新的組件,如 htmlCustom ,並繼承 Encore\Admin\Form\Field\Html
  2. 修改組件的 render 方法,以便直接返回要渲染的 HTML 而不是包含在框架中
  3. app\Admin\bootstrap.php 中註冊組件
  4. 在您的代碼中使用該組件,可以是實現了 Htmlable、Renderable 或實現了 __toString() 方法的類或者是閉包,以便在表單中插入 HTML 內容。

具體示例代碼請往下查看。

自訂義組件

Laravel admin 中有一個類似表單組件 Encore\Admin\Form\Field\Html ,程式碼如下,但他會被限縮在 render function 裡所撰寫的 html

<?php

namespace Encore\Admin\Form\Field;

use Encore\Admin\Form\Field;
use Illuminate\Support\Arr;

class Html extends Field
{
/**
* Htmlable.
*
* @var string|\Closure
*/
protected $html = '';

/**
* @var string
*/
protected $label = '';

/**
* @var bool
*/
protected $plain = false;

/**
* Create a new Html instance.
*
* @param mixed $html
* @param array $arguments
*/
public function __construct($html, $arguments)
{
$this->html = $html;

$this->label = Arr::get($arguments, 0);
}

/**
* @return $this
*/
public function plain()
{
$this->plain = true;

return $this;
}

/**
* Render html field.
*
* @return string
*/
public function render()
{
if ($this->html instanceof \Closure) {
$this->html = $this->html->call($this->form->model(), $this->form);
}

if ($this->plain) {
return $this->html;
}

$viewClass = $this->getViewElementClasses();

return <<<EOT
<div class="{$viewClass['form-group']}">
<label class="{$viewClass['label']} control-label">{$this->label}</label>
<div class="{$viewClass['field']}">
{$this->html}
</div>
</div>
EOT;
}
}

繼承並改寫組件

<?php

namespace App\Admin\Extensions;

use Encore\Admin\Form\Field\Html;

class htmlCustom extends Html
{
/**
* Render html field.
*
* @return string
*/
public function render()
{
if ($this->html instanceof \Closure) {
$this->html = $this->html->call($this->form->model(), $this->form);
}

if ($this->plain) {
return $this->html;
}

return <<<EOT
{$this->html}
EOT;
}
}

註冊組件

修改app\Admin\bootstrap.php

use App\Admin\Extensions\htmlCustom;

Form::extend('htmlCustom', htmlCustom::class);

使用組件

插入html內容,參數可以是實現了 Htmlable、Renderable 或者實現了 __toString() 方法的類

$form->htmlCustom(function () use ($store_id) {
$parameter;
return view('admin.your_blade', compact('parameter'));
}, null);

來源

組件管理->擴展自訂義組件