2017-09-13 18:08:15 1959次浏览 1条回答 0 悬赏 10 金钱

想在Controller生成器中自定义layout。
于是我进行了如下操作:

在blog/vendor/yiisoft/yii2-gii/generators/controller/Generator.php里面加入如下代码

    /**
     * @var string 自定义样式名称,默认就是继承原有的父模板
     */
    public $layouts = 'default';

    /**
     * @inheritdoc
     */
    public function getLayouts()
    {
        return $this->layouts;
    }

在form.php里面加入如下代码

echo $form->field($generator, 'layouts');

将blog/vendor/yiisoft/yii2-gii/generators/controller/default/controller.php修改为

<?php
/**
 * This is the template for generating a controller class file.
 */

use yii\helpers\Inflector;
use yii\helpers\StringHelper;

/* @var $this yii\web\View */
/* @var $generator yii\gii\generators\controller\Generator */

echo "<?php\n";
?>

namespace <?= $generator->getControllerNamespace() ?>;

class <?= StringHelper::basename($generator->controllerClass) ?> extends <?= '\\' . trim($generator->baseClass, '\\') . "\n" ?>
{
<?php foreach ($generator->getActionIDs() as $action): ?>
    public function action<?= Inflector::id2camel($action) ?>()
    {
        <?=$generator->getLayouts()=='default'?'':'$layouts = \''.$generator->getLayouts().'\''; ?>
        return $this->render('<?= $action ?>');
    }

<?php endforeach; ?>
}

主要是加入了这一句话

<?=$generator->getLayouts()=='default'?'':'$layouts = \''.$generator->getLayouts().'\''; ?>

虽然界面有了我的选项,并且POST传值成功,但是获取的值一直不对,生成的代码也一直是默认值。不是我POST过去的内容。
QQ图片20170913175600.png

QQ图片20170913175608.png

补充于 2017-09-13 18:11

如果有更好的办法,欢迎指正。刚开始学习yii,难免有好多不了解yii的地方。

补充于 2017-09-16 10:34

导致这个问题是。。我没重启服务器。。有缓存。。。

  • 回答于 2017-09-14 08:51 举报

    我想你使用 Gii 的方法存在问题。如果你要自定义 Gii, 不要在 vendor/yiisoft/yii2-gii 内直接修改,而是参照官方的建议去做,具体参考一下 YiiChina 上这个贴子:大家在实际开发中经常用Gii生产代码吗?如果用了一些后台模板,那生产的代码样式怎么处理?

    从你描述看,你是想针对某些特定的动作使用特定的 layout, 这个需求还没到使用 Gii 的地步。手动在对应的动作方法内声明一下即可:

    public function actionIndex()
    {
        $this->layout = 'xxx';
    
        // ...
    }
    

    如果你想让控制器下所有动作都使用该自定义 layout, 设置如下:

    class OrderController extends Controller
    {
        public $layout = 'xxx';
    }
    
    1 条回复
    回复于 2017-09-14 20:34 回复

    手动改是可以改的。就是觉得修改gii比较方便。而且添加自定义变量,会让gii变得更加应用广泛。可能现在不了解gii的具体文件调用结构组织。我觉得我这样使用问题不大,反而是个新奇的尝试。前辈之前回答的那个帖子 我已经预览过了。和我的想法不太一样。不过还是感谢。

您需要登录后才可以回答。登录 | 立即注册
x9-sec
助理

x9-sec

注册时间:2017-09-13
最后登录:2020-09-18
在线时长:6小时22分
  • 粉丝0
  • 金钱100
  • 威望0
  • 积分160

热门问题