5

好的,所以我正在尝试自学 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。

谁能指出我会怎么做,好吗?

注意:我知道在应用程序中设置此类数据的位置存在普遍分歧,但对我来说,这是与数据相关的。

4

10 回答 10

5

这些操作与模型无关,因此可以放在您的 app/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];
    }
}
?>

将您的浏览器指向 /guitars 将调用您的吉他控制器索引操作,该操作不存在,因此将运行 AppController(GuitarsController 继承自)中的操作。视图操作也是如此。这也适用于您的 DrumsController、KeyboardsController 等。

于 2008-10-11T09:37:09.380 回答
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 ); ?>
于 2008-10-10T19:26:44.090 回答
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 用户输入。

于 2008-10-12T21:16:10.670 回答
1

从 CakePHP 1.3 开始,设置页面标题已更改。

$this->pageTitle = "Title"; //deprecated

$this->set("title_for_layout",Inflector::humanize($this->name)); // new way of setting title

注意:关于 Inflector 的更多信息:http ://api13.cakephp.org/class/inflector#method-Inflector

于 2011-07-24T04:46:19.343 回答
0
$this->pageTitle = $this->Guitar->Name;

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

于 2008-10-10T18:58:52.087 回答
0

它应该进入控制器。看到这个

于 2008-10-10T19:21:40.917 回答
0

“但我想做一些比基本的在线帮助显示更多的事情。”

不总是这样吗?如此多的文档都是针对最低限度的,实际上并没有多大帮助。您可以完成许多可用的教程,但是只要您从预订中走 1 步,就会出现混乱。嗯,它要么是最低限度,要么是专业开发人员最高限度,但很少能达到轻松、清晰和深度的最佳点。

我目前正在重写一些 Zend Framework 文档以供我自己使用,这样我就可以消除不一致之处,澄清被掩盖的假设,并获得理解它的核心“最佳实践”方式。我的口头禅:轻松、清晰、深度。轻松,清晰,深度。

于 2008-10-10T20:11:47.337 回答
0

啊,不明显的答案如下……

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

我通过将以下代码放入控制器中发现了这一点(老实说,这是一个成功的远射)

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

感谢所有试图提供帮助的人。

于 2008-10-10T20:26:25.810 回答
0
echo "<pre>"; print_r($this);echo "</pre>";

怎么样

pr( $this );
于 2009-03-23T07:44:20.023 回答
0

好的,我真的想在控制器中设置页面标题,而不是在视图中。所以这就是我所做的:

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.

于 2011-05-14T20:17:29.043 回答