在CakePHP 3.9中,我可以在哪里存储,以及如何加载Widget字符串模板?

rseugnpd  于 2022-11-12  发布在  PHP
关注(0)|答案(2)|浏览(148)

我想创建一个CakePHP小部件来创建一个自定义的表单控件。最终目标是使它成为一个插件,但现在我正在尝试确定一个小部件的一般结构。我在src/View/Widget/DateTimeWidget. php中创建了一个文件,包含

<?php
namespace App\View\Widget;

use Cake\View\Form\ContextInterface;
use Cake\View\Widget\WidgetInterface;

class DateTimeWidget implements WidgetInterface
{

    protected $_templates;

    public function __construct($templates)
    {
        $this->_templates = $templates;
    }

    public function render(array $data, ContextInterface $context)
    {
        $data += [
            'name' => '',
        ];
        return $this->_templates->format('DateTime', [
            'name' => $data['name'],
            'attrs' => $this->_templates->formatAttributes($data, ['name'])
        ]);
    }

    public function secureFields(array $data)
    {
        return [$data['name']];
    }
}
?>

我使用代码在视图中加载小部件

$this->Form->addWidget(
    'datetime',
    ['DateTime']
);

然后使用它创建一个窗体控件

echo $this->Form->control('end_time', ['type' => 'datetime']);

但是,我得到了错误Cannot find template named 'DateTime'
我已经创建了基本模板代码

<?php
$this->Form->setTemplates([
    'DateTime' => '<p {{attrs}}>Test template</p>'
]);

但是我不知道把它放在文件夹结构的什么地方?在我看过的大多数插件中,它都在一个帮助文件中,但是我想知道这是否是默认的方式?我有什么选择?我如何告诉CakePHP加载它?什么是首选的加载方式?
谢谢你,谢谢你

ulydmbyx

ulydmbyx1#

如果你想让你的小部件带有默认的字符串模板,那么你可以在小部件本身定义它们,比如把它添加到传递给小部件构造函数的字符串模板示例中。你可以在小部件的render()方法中定义它,但它在构造函数中不能正常工作,因为小部件示例被重用,也就是说它们只被构造一次,例如:

public function render(array $data, ContextInterface $context)
{
    if (!array_key_exists('customDateTime', $this->_templates->getConfig())) {
        $this->_templates->add([
            'customDateTime' => '<p {{attrs}}>Test template</p>',
            // ...
        ]);
    }

     // ...
}

另一种方法是将字符串模板放在配置文件中:

// in path_to_your_plugin/config/form_helper_templates.php
<?php
return [
    'customDateTime' => '<p {{attrs}}>Test template</p>',
    // ...
];

并要求用户在使用小部件时在他们的视图模板中加载表单帮助器字符串模板:

$this->Form->templater()->load('YourPluginName.form_helper_templates');

这两个选项都将与表单帮助器正确集成,因此用户仍然可以通过FormHelper::setTemplates()StringTemplate::load()/add()FormHelper::control()templates选项设置自定义模板来覆盖模板。

相关问题