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);

來源

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