2015-05-11 13 views
9

Về cơ bản trong default.ctp Tôi có điều này cho tiêu đề của tôi:

<title> 
    <?= $this->fetch('title') ?> 
</title> 

Và bên trong của bộ điều khiển tôi có dòng này:

$this->set('title', 'Test-Title'); 

Nhưng nó không làm gì, nó vẫn hiển thị điều khiển tên (Jobs, bộ điều khiển tên đầy đủ os JobsController.ctp)

Nhưng nếu tôi đặt bên trong tệp này quan điểm của tôi:

$this->assign('title', 'Test-Title'); 

Nó thay đổi tiêu đề. Vậy điều gì sai với $ this-> set ('title', $ title) ?

Trả lời

11

Bạn có thể chỉ set() biến trong điều khiển của bạn:

// View or Controller 
$this->set('title', 'Test-title'); 

Sau đó, sử dụng nó như là một biến giữa các ý kiến ​​trong cách bố trí hoặc xem của bạn:

<!-- Layout or View --> 
<title> 
    <?php echo $title; ?> 
</title> 

chi tiết ở đây: http://book.cakephp.org/3.0/en/views.html#setting-view-variables

Sử dụng assign() là khác nhau, đó là lý do tại sao nó hoạt động với fetch(). assign() được sử dụng với các khối xem: http://book.cakephp.org/3.0/en/views.html#using-view-blocks

+0

Vâng, tôi biết rằng tôi có thể làm bên này xem, nhưng tôi muốn làm điều đó bên trong điều khiển, nó sẽ hoạt động bên trong của bộ điều khiển là tốt, nhưng nó không – Tachi

+0

Cùng đi cho bộ điều khiển - không 'fetch()' nó, chỉ cần sử dụng nó. – Dave

17

fetch() trả lại nội dung của một khối không phải là một biến. Sử dụng set() trong điều khiển của bạn là thiết lập một biến mà có thể được xuất ra trong Xem mẫu của bạn bằng cách lặp lại các biến: -

<?php echo $title; ?> 

Nếu bạn muốn sử dụng fetch() bạn cần phải sử dụng nó kết hợp với assign() trong Xem mẫu để xác định khối. Ví dụ trong của bạn Xem mẫu sử dụng: -

<?php $this->assign('title', $title); ?> 

Và sau đó trong layout template: -

<title><?php echo $this->fetch('title'); ?></title> 

Trong CakePHP 3 ý tưởng là để thiết lập các tiêu đề trang bằng cách gán cho nó trong Xem như nó liên quan đến việc hiển thị trang. Điều này khác với cách xử lý ban đầu trong CakePHP 2 nơi bạn định nghĩa title_for_layout trong bộ điều khiển của mình và sau đó lặp lại biến số $title_for_layout trong mẫu bố cục (điều này đã không được chấp nhận theo cách tiếp cận CakePHP 3 trong các phiên bản sau của Bánh 2).

+1

Lưu ý phụ, giá trị khối 'title' mặc định được gán trong [**' Cake \ View \ View :: renderLayout() '**] (http://api.cakephp.org/3.0/source-class-Cake .View.View.html # 477-513), nó được bắt nguồn từ giá trị 'View :: $ viewPath'. – ndm

+0

công việc được chỉ định khi cần thiết, cảm ơn – mewc

0

Chỉ cần hoàn thành, tôi tình cờ gặp một tình huống mà một .js kịch bản bị thay đổi với các biến không xác định tham chiếu giữa <head></head> dẫn đến việc <title></title> thẻ đang được đưa lên DOM (cho thấy trong mã nguồn trang web) nhưng Chrome, Firefox và (từ bộ nhớ) MSIEtất cả không thể phân phối nội dung của tiêu đề cho giao diện người dùng APP, một lần nữa từ bộ nhớ - iOS mobile không bị ảnh hưởng.

0

Nếu bạn muốn dính vào mã của bạn, sau khi cài đặt "title" biến chỉ đơn giản là viết này:

<?= __('Main Project Name') ?> 
    <?php if(isset($title)) $this->assign('title', $title); ?> 
    <?= ' - ' . $this->fetch('title') ?> 
0

Tôi đã làm điều này, theo cách này trong default.ctp

<?php 
    $cakeDescription = __d('cake_dev', 'Your Title'); 
?> 

<title> 
    <?php echo $cakeDescription ?>: <?php echo $title_for_layout; ?> 
</title> 

Trong tập tin quan điểm của tôi , Tôi đã làm điều này.

<?php $this->assign('title', 'Your Title');?> 
Các vấn đề liên quan