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

Where can I store, and how can i load Widget string templates in CakePHP 3.9?

我想创建一个 CakePHP 小部件以创建自定义表单控件。最终目标是使它成为一个插件,但现在我正在尝试确定一个 Widget 的一般结构。我在 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 加载它?这样做的首选方法是什么?

谢谢!

我认为你应该使用 Cells。

看看:https://book.cakephp.org/3/en/views/cells.html

如果您希望小部件带有默认字符串模板,那么您可以在小部件本身中定义它们,方法是将其添加到传递给小部件构造函数的字符串模板实例中。虽然你会在小部件的 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()templates 选项设置自定义模板来覆盖模板FormHelper::control().