2008-10-10 106 views
4

好的,所以我试图自学CakePHP框架,我正在尝试为自己敲一个简单的演示应用程序。CakePHP - 如何将页面标题设置为项目名称?

我有控制器,视图和模型的所有设置和工作,但我想做的事情比基本的在线帮助显示略多。

我有一个guitars_controller.php文件如下...

<?php 
class GuitarsController extends AppController { 
    var $name = 'Guitars'; 
    function index() { 
     $this->set('Guitars', $this->Guitar->findAll()); 
     $this->pageTitle = "All Guitars"; 
    } 
    function view($id = null) { 
     $this->Guitar->id = $id; 
     $this->set('guitar', $this->Guitar->read()); 
     // Want to set the title here. 
    } 
} 
?> 

的“吉他”的对象包含了一个名为“名称”的属性,我希望能够设置为PAGETITLE为单个页面查看。

任何人都可以指出我该怎么做,请吗?

NB:我知道在设置这种数据的应用程序的哪个位置存在一般意见分歧,但对我而言,它与数据有关。

回答

5

这些行为模型无关,从而可以把你的应用程序/文件app_controller.php

<?php 
class AppController extends Controller { 
    function index() { 
     $this->set(Inflector::variable($this->name), $this->{$this->modelClass}->findAll()); 
     $this->pageTitle = 'All '.Inflector::humanize($this->name); 
    } 
    function view($id = null) { 
     $data = $this->{$this->modelClass}->findById($id); 
     $this->set(Inflector::variable($this->modelClass), $data); 
     $this->pageTitle = $data[$this->modelClass][$this->{$this->modelClass}->displayField]; 
    } 
} 
?> 

浏览器指向/吉他将调用你的吉他控制器的索引行为,不存在这样的一个在AppController(GuitarsController从中继承)将会运行。视图操作相同。这也适用于你的DrumsController,KeyboardsController等等。

0
$this->pageTitle = $this->Guitar->Name; 

它应该在视图中,虽然我不PHP或CakePHP,但这是一个视图应该做的事情,而不是控制器。

+0

它可以* *也可以在视图中设置。 但是,CakePHP将数据公开为关联数组而不是对象。 $ this-> pageTitle = $ guitar ['Guitar'] ['name'] – Cheekysoft 2008-10-14 14:50:32

+0

$ this-> pageTitle = $ this-> Guitar-> Name;这也是我的想法,但它不起作用。它在面向对象的范例中非常有意义,但显然不在CakePHP中。 – ZombieSheep 2008-10-10 19:01:52

+0

重要的是要明白,与Rails不同,CakePHP不会将模型数据生成为对象。应用/模型中的模型类几乎只是DAO。数据始终可用作关联数组。 – Cheekysoft 2008-10-14 14:09:29

0

它应该放在控制器中。见this

+0

你也可以在视图中设置 – Cheekysoft 2008-10-14 14:31:52

4

您可以在控制器中设置这样的:

function view($id = null) { 
    $guitar = $this->Guitar->read(null, $id); 
    $this->set('guitar', $guitar); 
    $this->pageTitle = $guitar['Guitar']['name']; 
} 

或者视图:

<? $this->pageTitle = $guitar['Guitar']['name']; ?> 

视图中的设置将覆盖可能已经在设置的任何值值控制器。

为了安全起见,你必须确保你的布局/视图,显示PAGETITLE HTML编码这个任意数据以避免注入攻击和损坏的HTML

<?php echo h($title_for_layout); ?> 
0

“,但我想要做的事稍比基本的在线帮助节目。“

难道那不是总是擦吗?这么多的文档都是针对最低限度的,它确实没有什么帮助。您可以完成许多教程,但是只要您离开预留一步,就会产生混淆。但是,它不是最低限度就是最低限度,或者最低限度是专业开发人员,但很少有轻松,清晰和深度的甜点。

我目前正在为我自己的使用重写一些Zend Framework文档,以便我可以消除这些不一致之处,澄清对假设的掩饰并获取理解它的核心“最佳实践”方式。我的口号:轻松,清晰,深度。易用性,清晰度,深度。

0

啊,没有明显的答案如下...

$this->pageTitle = $this->viewVars['guitar']['Guitar']['Name']; 

我发现这个通过将以下代码控制器(是一个长镜头是还清了,说实话)

echo "<pre>"; print_r($this);echo "</pre>"; 

感谢所有那些试图帮助。

1

回应你自己对oo范式的回答。它是这样的:

function view($id) { 
    $this->Guitar->id = $id; 
    $this->Guitar->read(); 
    $this->pageTitle = $this->Guitar->data['Guitar']['name']; 
    $this->set('data', $this->Guitar->data); 
} 

顺便说一句,你应该检查一下ID设置和有效等,因为这是URL用户输入。

0
echo "<pre>"; print_r($this);echo "</pre>"; 

怎么样

pr($this); 
0

OK,我真的要设置在控制器中的网页标题中,而不是视图。因此,这里是我所做的:

class CustomersController extends AppController { 

    var $name = 'Customers'; 

    function beforeFilter() { 
     parent::beforeFilter(); 
     $this->set('menu',$this->name); 
     switch ($this->action) { 
      case 'index': 
      $this->title = 'List Customer'; 
      break; 
      case 'view': 
      $this->title = 'View Customer'; 
      break; 
      case 'edit': 
      $this->title = 'Edit Customer'; 
      break; 
      case 'add': 
      $this->title = 'Add New Customer'; 
      break; 
      default: 
      $title = 'Welcome to '.$name; 
      break; 
     } 
     $this->set('title',$this->title); 
     } 

的技巧是,你可以不设置$this->title任何动作里面,它不会工作。在我看来,网页在渲染后达到了动作,但是您可以在beforeFilter中执行此操作。

相关问题