CakePHP - Как мне установить заголовок страницы для имени элемента? - PullRequest
4 голосов
/ 10 октября 2008

ОК, поэтому я пытаюсь научить себя фреймворку 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.
    }
}
?>

Объект «Гитара» содержит атрибут «Имя», и я хотел бы иметь возможность установить его в качестве заголовка страницы для отдельных просмотров страниц.

Кто-нибудь может указать, как я это сделаю, пожалуйста?

NB : я знаю, что существует общее разногласие относительно того, где в приложении указываются такие данные, но для меня это связано с данными.

Ответы [ 10 ]

5 голосов
/ 11 октября 2008

Эти действия не зависят от модели, поэтому их можно поместить в файл 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 и т. Д. И т. Д.

4 голосов
/ 10 октября 2008

Вы можете установить это в контроллере:

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

Или в виде:

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

Значение, установленное в представлении, переопределит любое значение, которое, возможно, уже было установлено в контроллере.

В целях безопасности вы должны убедиться, что ваш макет / представление, отображающее HTML-код страницы, кодирует эти произвольные данные, чтобы избежать атак с использованием инъекций и взлома HTML-кода

<?php echo h( $title_for_layout ); ?>
1 голос
/ 24 июля 2011

Начиная с CakePHP 1.3, заголовок страницы настроек был изменен.

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

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

Примечание: Подробнее об инфлекторе: http://api13.cakephp.org/class/inflector#method-Inflector

1 голос
/ 13 октября 2008

В ответ на ваш собственный ответ по поводу парадигмы. Это так:

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

Кстати, вы должны проверить, установлен ли и действителен ли идентификатор и т. Д., Поскольку это URL-адрес пользователя.

0 голосов
/ 15 мая 2011

ОК, я действительно хочу установить заголовок страницы в контроллере вместо этого в представлении. Итак, вот что я сделал:

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.

0 голосов
/ 23 марта 2009
<code>echo "<pre>"; print_r($this);echo "
";

как насчет

pr( $this );
0 голосов
/ 11 октября 2008

Ах, неочевидный ответ таков ...

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

Я нашел это, поместив следующий код в контроллер (если честно, это был долгий выстрел)

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

Спасибо всем, кто пытался помочь.

0 голосов
/ 11 октября 2008

"но я хочу сделать что-то немного большее, чем показывает основная онлайн-справка."

Разве это не всегда проблема? Столько документации ориентировано на минимальный уровень, что на самом деле мало помогает. Вы можете завершить многие из доступных учебных пособий, но как только вы сделаете 1 шаг от резервирования, возникает путаница. Что ж, это либо минимум, либо максимум разработчика, но он редко попадает в эту точку легкости, ясности и глубины.

В настоящее время я переписываю некоторую документацию Zend Framework для своего собственного использования просто для того, чтобы я мог сгладить несоответствия, прояснить мельчайшие предположения и найти суть "наилучшей практики" понимания этого. Моя мантра: легкость, ясность, глубина. Легкость, ясность, глубина.

0 голосов
/ 10 октября 2008

должно идти в контроллере. Смотри это

0 голосов
/ 10 октября 2008
$this->pageTitle = $this->Guitar->Name;

Это должно идти в View, хотя я не PHP или cakePHP, но это то, что должен делать вид, а не контроллер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...