【问题标题】:Cakephp 3 multiple custom template formhelpersCakephp 3 多个自定义模板formhelpers
【发布时间】:2014-09-26 21:49:08
【问题描述】:

所以我在工作(为了后代的缘故,我可能会添加敏感数据),并且决定我们需要使用 Cakephp 3.0(此时为测试版)提供的所有强大且记录最少的新工具的权力。

编辑:我的目标是为表单创建几个不同的模板,以通过 formhelper 模板或输入法调用。这方面真的没有太多好的例子。 自定义 FormHelper 使用的模板: 正如书中所见(以及互联网上其他任何地方),非常短的文档如下: http://book.cakephp.org/3.0/en/core-libraries/helpers/form.html#customizing-the-templates-formhelper-uses

网站说可以使用模板方法,然后给一个模糊的“使用”:

$myTemplates = [
    'inputContainer' => '<div class="form-control">{{content}}</div>',
];

$this->Form->templates($myTemplates);

然后它说你可以使用它没有给出示例的 input() 方法。 最后但并非最不重要的一点是,自定义模板 FormHelper 应该允许您根据需要“制作”或“创建”任意数量的自定义表单助手,但它们没有给出如何做到这一点的示例!?卢武特?

我可以像他们的示例一样轻松使用它,但是单个自定义模板的威力在哪里?这对我没有任何好处。

所以通过一个新的可能解决方案,我尝试得到一个新的错误。

我收到此错误(在我看来)(来自以下代码):

致命错误 错误:找不到类“配置”

//within bootstrap.php
Configure::write('templates', [
    'shortForm' => [
        'formstart' => '<form class="" {{attrs}}>',
        'label' => '<label class="col-md-2 control-label" {{attrs}}>{{text}}</label>',
        'input' => '<div class="col-md-4"><input type="{{type}}" name="{{name}}" {{attrs}} /></div>',
        'select' => '<div class="col-md-4"><select name="{{name}}"{{attrs}}>{{content}}</select>    </div>',
        'inputContainer' => '<div class="form-group {{required}}" form-type="{{type}}">{{content}}    </div>',
        'checkContainer' => '',],
    'longForm' => [
        'formstart' => '<form class="" {{attrs}}>',
        'label' => '<label class="col-md-2 control-label" {{attrs}}>{{text}}</label>',
        'input' => '<div class="col-md-6"><input type="{{type}}" name="{{name}}" {{attrs}} /></div>',
        'select' => '<div class="col-md-6"><select name="{{name}}"{{attrs}}>{{content}}</select>    </div>',
        'inputContainer' => '<div class="form-group {{required}}" form-type="{{type}}">{{content}}    </div>',
        'checkContainer' => '',],
    'fullForm' => [
        'formstart' => '<form class="" {{attrs}}>',
        'label' => '<label class="col-md-2 control-label" {{attrs}}>{{text}}</label>',
        'input' => '<div class="col-md-10"><input type="{{type}}" name="{{name}}" {{attrs}} />    </div>',
        'select' => '<div class="col-md-10"><select name="{{name}}"{{attrs}}>{{content}}</select>    </div>',
        'inputContainer' => '<div class="form-group {{required}}" form-type="{{type}}">{{content}}    </div>',
        'checkContainer' => '',]
]);

//within my view
<?php
    $this->Form->templates(Configure::read('templates.shortForm')); 
?>

旧更新:我添加了

use "Cake\Core\Configure;" 

在我看来,一切都很好,但我想将它添加到层次结构中的适当文件中,这样我就不必将它添加到每个视图中,

当然,除非它会导致整个应用程序整体出现效率问题。有谁知道它应该进入哪个文件?问候和 TIA!

最新更新:我刚刚想通了。很简单!在下面检查我的答案!希望这对某人有所帮助

【问题讨论】:

  • 那你想要什么?这听起来像是一个很长的抱怨,但甚至没有告诉我们你的目标是什么?此外,如果您仔细阅读文档,这不是关于单个模板,而是您可以使用 templates() 方法通过传递一组模板来自定义任何输出。
  • 正如我所说,是的,我同意这是文档所说的,因为它是显而易见的。我的问题是……怎么办?你如何创建这些模板。他们甚至没有在他们给出的示例中创建任何模板。他们只是以单一的股票默认值为例。如果我想创建三个或四个单独的自定义模板,这是如何完成的?我找到了一个网站:sanisoft.com/blog/2014/08/11/twitter-bootstrap-forms-cakephp-3 他做了类似的事情,但解释说由于缺乏文档,他选择通过 FormHelper 创建自定义小部件作为自定义模板输入表单。

标签: templates cakephp formhelper cakephp-3.0


【解决方案1】:

此修复程序的作用是允许您使用引导程序拥有自定义模板表单(来自 cakephp 3 !!!!!!)。如果您想使用表单助手设置大小,并且所有这些都很好(安全性和其他方面)。

Cakephp 的 Jose Zap 告诉我尝试引导插件和小部件等等,但真正的方法应该是:

第 1 步:创建 config/templatesConfig.php 并添加您的自定义表单内容。

<?php
$config = [
    'Templates'=>[
        'shortForm' => [
            'formStart' => '<form class="" {{attrs}}>',
            'label' => '<label class="col-md-2 control-label" {{attrs}}>{{text}}</label>',
            'input' => '<div class="col-md-4"><input type="{{type}}" name="{{name}}" {{attrs}} /></div>',
            'select' => '<div class="col-md-4"><select name="{{name}}"{{attrs}}>{{content}}</select></div>',
            'inputContainer' => '<div class="form-group {{required}}" form-type="{{type}}">{{content}}</div>',
            'checkContainer' => '',],
        'longForm' => [
            'formStart' => '<form class="" {{attrs}}>',
            'label' => '<label class="col-md-2 control-label" {{attrs}}>{{text}}</label>',
            'input' => '<div class="col-md-6"><input type="{{type}}" name="{{name}}" {{attrs}} /></div>',
            'select' => '<div class="col-md-6"><select name="{{name}}"{{attrs}}>{{content}}</select></div>',
            'inputContainer' => '<div class="form-group {{required}}" form-type="{{type}}">{{content}}</div>',
            'checkContainer' => '',],
        'fullForm' => [
            'formStart' => '<form class="" {{attrs}}>',
            'label' => '<label class="col-md-2 control-label" {{attrs}}>{{text}}</label>',
            'input' => '<div class="col-md-10"><input type="{{type}}" name="{{name}}" {{attrs}} /></div>',
            'select' => '<div class="col-md-10"><select name="{{name}}"{{attrs}}>{{content}}</select></div>',
            'inputContainer' => '<div class="form-group {{required}}" form-type="{{type}}">{{content}}</div>',
            'checkContainer' => '',]
    ]
];

第 2 步:从控制器内部的正确视图方法调用此行。

别忘了在你的控制器顶部添加这个

use Cake\Core\Configure;

$this->set('form_templates', Configure::read('Templates'));

第 3 步:在 bootstrap.php 文件中添加它

// Load an environment local configuration file.
// You can use this file to provide local overrides to your
// shared configuration.

Configure::load('templatesConfig','default'); //fixed

第 4 步(最后):将这一行加上你想要的模板名称 Bam!。

<?php $this->Form->templates($form_templates['shortForm']); ?>

【讨论】:

    【解决方案2】:

    假设您需要所有输入以在表单中使用自定义标记以在输入之后显示标签(默认为之前),并为硬编码 error-message 使用不同的类以显示错误:

    $this->Form->create($entity, ['templates' => [
        'formGroup' => '{{input}}{{label}}',
        'error' => '<div class="error">{{content}}</div>'
    ]]);
    

    如果您只想自定义单个输入,请将相同的“模板”键传递给 FormHelper::input() 选项,如下所示:

    $this->Form->input('fieldname', ['templates' => [
        'formGroup' => '{{input}}{{label}}',
        'error' => '<div class="error">{{content}}</div>'
    ]]);
    

    如果您需要定义多个模板并在需要时重新使用它们,您可以尝试以下方法(注意我在这里写它,以前从未使用过):

    // in bootstrap (as this is a config i believe
    Configure::write('templates', [
        'foo' => [....],
        'bar' => [....]
    ]);
    
    // in any view
    $this->Form->templates(Configure::read('templates.foo'));
    $this->Form->create(...);
    ....
    

    您还可以创建自己的助手并在那里定义模板等。

    这实际上完全取决于您想要实现的目标,但这应该能让您很好地了解模板的工作原理(顺便说一下,不仅仅是在表单中)。

    【讨论】:

    • 我试过你的最后一个例子,但它给出了一个奇怪的错误。和我们一样,我对 Cake 3.0 beta 还比较陌生。 “找不到类配置”让我感到困惑。
    • 更新:我添加了使用“Cake\Core\Configure;”在我看来,一切都很好,但我想将它添加到层次结构中的适当文件中,这样我就不必将它添加到每个视图中,除非它当然会导致整个应用程序作为一个整体出现效率问题.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多