2015-02-05 98 views
0

我有多个模型,我想将变量$section添加到,然后在sidenav.ctp中使用该值来动态更改边栏。例如,我的型号有:如何在CakePHP模型中设置变量并在视图中访问它?

class Resource extends AppModel { 
    public $section = 'section1'; 
    public $displayField = 'name'; 
    public $order = 'modified DESC'; 

    //validation, relationships, etc. 
} 

然后,我有另一种模式,如:

class Topic extends AppModel { 
    public $section = 'section2'; 
    public $tablePrefix = ''; 

    //validation, relationships, etc. 
} 

所以在sidenav.ctp我想要做的事,如:

<?php if ($this->section == 'section1') { ?> 
    <li><?php echo $this->Html->link(__('Resources'), array('controller' => 'resources', 'action' => 'index')); ?></li> 
    <li><?php echo $this->Html->link(__('Topics'), array('controller' => 'topics', 'action' => 'index')); ?> </li> 
    <li><?php echo $this->Html->link(__('Log Out'), array('controller' => 'users', 'action' => 'logout')); ?> </li> 
<?php } ?> 

<?php if ($this->section == 'section2') { ?> 
    <li><?php echo $this->Html->link(__('Resources1'), array('controller' => 'resources', 'action' => 'index')); ?></li> 
    <li><?php echo $this->Html->link(__('Topics1'), array('controller' => 'topics', 'action' => 'index')); ?> </li> 
    <li><?php echo $this->Html->link(__('Log Out1'), array('controller' => 'users', 'action' => 'logout')); ?> </li> 
<?php } ?> 

但访问$section这样不起作用。我无法弄清楚如何在模型中设置值,然后在视图中访问它。我知道我可以在控制器中设置值,然后通过$section访问它,但这需要我将它放在每个函数中。

+0

为什么模型?我认为没有必要。 – Salines 2015-02-05 21:30:14

+0

如果我将它放在控制器中,我将如何设置它,因此我不需要将它分别放在每个函数中? – WOUNDEDStevenJones 2015-02-05 21:31:14

+0

你会为不同的模型显示不同的菜单? – Salines 2015-02-05 21:34:26

回答

0

尝试在你的视图文件$this->name == 'ModelName'

这样的例子:

<li <?php if($this->name == 'Users'){?> class="active" <?php } ?> > 
      <a href="<?php echo $this -> Html -> url(array('plugin' => false, 'controller' => 'pages', 'action' => 'dashboard')); ?>"> 
       <i class="fa fa-dashboard"></i> 
       <span><?php echo __('Dashboard', true); ?></span> 
       <span class="label label-warning pull-right">1</span> 
      </a> 
     </li> 

OR

在控制器

beforeFilter或beforeRender方法:

//access variable from model 
$this->set('sections',$this->User->section); 

//or set direct  
$this->set('sections','section1'); 
+0

'$ this-> name'会给我模型本身的名称,但我试图在每个模型中设置一个自定义变量,以便我可以在视图中访问它们。 – WOUNDEDStevenJones 2015-02-05 21:41:35

+0

是的,它会给你模型的名称。你可以像我所说的那样使用它。但是由于你坚持使用自己的变量,我在我的答案中编辑和添加了这些功能。 – Salines 2015-02-05 22:36:00

+0

我知道我可以做一些类似于if($ model =='Model1'|| $ model =='Model2'|| $ model =='Model3'){/ * show menu1 * /} else if($ model''Model4'){/ * show menu2 * /}',但我希望能够定义每个模型属于哪个“部分”,而不必将这些长条件置于任何想要具有此功能的位置。 – WOUNDEDStevenJones 2015-02-06 15:33:31

0

查看的/元素可以由任何控制器调用并呈现,所以它们不会自动理解你想要引用的数据,除非你将它从模型传递到视图。 最近你可以做什么没有任何用处会回应路由器模型的方法,但结果取决于你的网址。

+0

“除非你将它从模型传递到视图” - 这就是我想要做的。到目前为止,我的最大努力是在控制器中使用'beforeFilter'并在那里设置变量。 – WOUNDEDStevenJones 2015-02-06 15:27:23

0

可以节省定义全球变量

Configure::write('my_var','this is model variable'); 

访问您的视图文件这个变量这样

echo Configure::read('my_var'); 
相关问题