Welcome to the Cookbook

loading...

3.5.5 Kaedah Controller

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

Untuk senarai penuh controller methods dan keterangannya sila lawat CakePHP API. Sila rujuk http://api.cakephp.org/1.2/class_controller.html.

3.5.5.1 Berinteraksi dengan Views

3.5.5.1.1 set

set(string $var, mixed $value)

Method set() adalah cara utama untuk hantar data dari controller kepada view. Sebaik anda menggunakan set(), variable boleh diakses pada view.

<?php
    
//First you pass data from the controller:

$this->set('color', 'pink');

//Then, in the view, you can utilize the data:
?>

You have selected <?php echo $color; ?> icing for the cake.
  1. <?php
  2. //First you pass data from the controller:
  3. $this->set('color', 'pink');
  4. //Then, in the view, you can utilize the data:
  5. ?>
  6.  
  7. You have selected <?php echo $color; ?> icing for the cake.

Method set() mengambil associative array sebagai parameter pertama. Ini selalunya adalah cara yang cepat untuk meletakkan maklumat kepada view.

Array keys akan diubah sebelum diletakkan pada view ('underscored_key' becomes 'underscoredKey', dan lain lain.):

<?php
    
$data = array(
    'color' => 'pink',
    'type' => 'sugar',
    'base_price' => 23.95
);

//make $color, $type, and $basePrice 
//available to the view:

$this->set($data);  

?>
  1. <?php
  2. $data = array(
  3. 'color' => 'pink',
  4. 'type' => 'sugar',
  5. 'base_price' => 23.95
  6. );
  7. //make $color, $type, and $basePrice
  8. //available to the view:
  9. $this->set($data);
  10. ?>

3.5.5.1.2 render

render(string $action, string $layout, string $file)

Method render() dipanggil secara automatik pada setiap akhir controller action yang dipanggil. Method ini menjalankan semua view logic (menggunakan data yang anda beri melalui set() method), menempatkan view di dalam layout dan memapar kembali kepada pengguna akhir.

Fail default view yang digunakan render ditetapkan dengan convention. Jika search() action pada RecipesController dipanggil, fail view di /app/views/recipes/search.ctp akan dipapar.

class RecipesController extends AppController {
...
    function search() {
        // Render the view in /views/recipes/search.ctp
        $this->render();
    }
...
}
  1. class RecipesController extends AppController {
  2. ...
  3. function search() {
  4. // Render the view in /views/recipes/search.ctp
  5. $this->render();
  6. }
  7. ...
  8. }

Walaupun CakePHP secara automatik akan memanggilnya (kecuali anda ada set $this->autoRender kepada false) selepas setiap action’s logic, anda boleh menggunakannya untuk menetapkan fail view yang lain dengan menetapkan action name di controller menggunakan $action.

Jika $action bermula dengan '/' ia diandaikan sebagai fail view atau element berhubungan dengan /app/views folder. Ini membenarkan paparan terus sesuatu elements, sangat berguna dalam ketika memanggil ajax.

// Render the element in /views/elements/ajaxreturn.ctp
$this->render('/elements/ajaxreturn');
  1. // Render the element in /views/elements/ajaxreturn.ctp
  2. $this->render('/elements/ajaxreturn');

Anda juga boleh menetapkan fail view atau element alternative menggunakan parameter ketiga, $file. Bila menggunakan $file, jangan lupa untuk guna beberapa CakePHP’s global constants (seperti VIEWS).

Parameter $layout membenarkan anda untuk menetapkan layout yang sedang dipaparkan.

3.5.5.2 Kawalan Aliran

3.5.5.2.1 redirect

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

redirect(string $url, integer $status, boolean $exit)

Method kawalan aliran (baca: flow control) yang akan kerap anda gunakan ialah redirect(). Method ini mengambil parameter pertama pada URL yang berhubung dengan CakePHP. Bila pengguna selesai menempatkan pesanan, anda mungkin mahu redirect mereka pada receipt screen.

function placeOrder() {

    //Logic for finalizing order goes here

    if($success) {
        $this->redirect(array('controller' => 'orders', 'action' => 'thanks'));
    } else {
        $this->redirect(array('controller' => 'orders', 'action' => 'confirm'));
    }
}
  1. function placeOrder() {
  2. //Logic for finalizing order goes here
  3. if($success) {
  4. $this->redirect(array('controller' => 'orders', 'action' => 'thanks'));
  5. } else {
  6. $this->redirect(array('controller' => 'orders', 'action' => 'confirm'));
  7. }
  8. }

Parameter kedua pada redirect() membenarkan anda menetapkan kod status HTTP untuk menemani redirect. Mungkin anda mahu 301 (pindah kekal) atau 303 (lihat lain), bergantung pada situasi redirect.

Method ini akan menjalankan exit() selepas redirect melainkan anda set parameter ketiga sebagai false.

3.5.5.2.2 flash

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

flash(string $message, string $url, integer $pause)

Method flash() digunakan untuk direct pengguna kepada halaman baru selepas satu operasi. Method flash() berbeza di mana ia memaparkan mesej sebelum menghantar pengguna pada URL lain.

Parameter pertama memegang mesej yang akan dipaparkan, parameter kedua pula ialah URL yang berhubung dengan CakePHP. CakePHP akan papar $message dalam $pause detik sebelum melencongkan pengguna ke halaman lain.

Untuk mesej flash dalam-halaman, pastikan rujuk method SessionComponent’s setFlash() .

3.5.5.3 Callbacks

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

CakePHP controllers disertakan bersama callbacks yang boleh anda gunakan untuk masukkan logic sebelum atau selepas controller actions dibaca.

beforeFilter()

Fungsi ini dijalankan sebelum setiap action dalam controller. Ia adalah tempat yang baik untuk menyemak active session atau memastikan user permissions.

beforeRender()

Dipanggil selepas controller action logic, tetapi sebelum view dibaca. Ia tidak digunakan selalu, tetapi mungkin diperlukan jika anda memanggil render() secara manual sebelum akhir action yang diberi.

afterFilter()

Dipanggil selepas setiap controller action.

afterRender()

Dipanggil selepas action dibaca.

CakePHP juga menyokong callbacks yang berhubungkait dengan scaffolding.

_beforeScaffold($method)

nama $method yang dipanggil contoh index, edit, etc.

_afterScaffoldSave($method)

nama $method yang dipanggil sama ada edit atau update.

_afterScaffoldSaveError($method)

nama $method yang dipanggil sama ada edit atau update.

_scaffoldError($method)

nama $method yang dipanggil contoh index, edit, etc.

3.5.5.4 Kaedah lain yang berguna

3.5.5.4.1 constructClasses

Method ini memuatkan model-model yang diperlukan controller. proses pemuatan biasanya dijanakan oleh CakePHP, tetapi method ini ada gunanya bila mengakses controllers daripada sudut yang berbeza. Jika anda perlukan CakePHP pada skrip command-line atau kegunaan lain, constructClasses() mungkin membantu.

3.5.5.4.2 referer

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

Mengembalikan URL yang dirujuk untuk request semasa.

3.5.5.4.3 disableCache

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

Digunakan untuk memberitahu browser yang digunakan oleh pengguna supaya tidak cache result pada request semasa. Ini berbeza dengan view caching, yang akan dijelaskan pada bab seterusnya.

3.5.5.4.4 postConditions

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

postConditions(array $data, mixed $op, string $bool, boolean $exclusive)

Guna method ini untuk set POSTed model data (dari input HtmlHelper-compatible) menjadi satu set carian conditions bagi sebuah model. Fungsi ini menawarkan jalan pintas untuk membina logic carian. Sebagai contoh, seorang pengguna pentadbiran (baca: administrative) mungkin mahu mencari beberapa arahan untuk mengetahui item mana yang perlu dihantar. Anda boleh menggunakan borang CakePHP- dan HtmlHelpers untuk membuat borang berdasarkan Order model. Kemudian controller boleh menggunakan data yang diposkan dari borang tersebut untuk menggubah keadaan carian:

function index() {
    $o = $this->Orders->findAll($this->postConditions($this->data));
    $this->set('orders', $o);
}
  1. function index() {
  2. $o = $this->Orders->findAll($this->postConditions($this->data));
  3. $this->set('orders', $o);
  4. }

Jika $this->data[‘Order’][‘destination’] equals “Old Towne Bakery”, postConditions menukarkan keadaan menjadi satu array yang compatible untuk digunakan pada Model->findAll() method. Dalam hal ini, array(“Order.destination” => “Old Towne Bakery”).

Jika anda mahu menggunakan SQL operator yang berbeza diantara terms, isikan ia pada parameter kedua.

/*
Contents of $this->data
array(
    'Order' => array(
        'num_items' => '4',
        'referrer' => 'Ye Olde'
    )
)
*/

//Let’s get orders that have at least 4 items and contain ‘Ye Olde’
$o = $this->Order->findAll($this->postConditions(
    $this->data,
    array('>=', 'LIKE')
));
  1. /*
  2. Contents of $this->data
  3. array(
  4. 'Order' => array(
  5. 'num_items' => '4',
  6. 'referrer' => 'Ye Olde'
  7. )
  8. )
  9. */
  10. //Let’s get orders that have at least 4 items and contain ‘Ye Olde’
  11. $o = $this->Order->findAll($this->postConditions(
  12. $this->data,
  13. array('>=', 'LIKE')
  14. ));

Kunci untuk mengenalpati operator ialah perintah pada kolum di $this->data array. Memandangkan num_items adala yang pertama, operator >= operator disikan padanya.

Parameter ketiga membenarkan anda memberitahu CakePHP apa SQL boolean operator gunakan diantara keadaan carian. String macam ‘AND’, ‘OR’ and ‘XOR’ semuanya adalah sah.

Akhirnya, jika parameter terakhir di set kan true, dan $op parameter adalah array, ruangan yang tidak dimasukkan $op tidak akan dimasukkan pada keadaan yang dikembalikan.

3.5.5.4.5 paginate

Method ini digunakan untuk membahagikan dalam bentuk halaman hasil yang dicapai oleh model anda. Anda boleh menetapkan saiz halaman, keadaan carian model dan seadanya. Sila lihat bab pagination untuk keterangan lanjut.

3.5.5.4.6 requestAction

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

requestAction(string $url, array $options)

Fungsi ini memanggil controller's action dari mana mana lokasi dan memulangkang data dari action tersebut. $url yang dilepaskan ialah CakePHP-relative URL (/controllername/actionname/params). Untuk melepaskan data tambahan kepada controller action penerimaan tambah pada array $options .

Anda boleh guna requestAction() untuk mendapatkan paparan data penuh dengan melepaskan 'return' pada options: requestAction($url, array('return'));

Jika ia digunakan tanpa caching requestAction boleh menyebabkan perfomance yang teruk. Ia jarang digunakan pada controller atau model.

requestAction adalah terbaik bila digunakan pada (cached) elements – sebagai cara untuk mendapatkan data bagi sesuatu element sebelum rendering. Mari gunakan contoh meletakkan "latest comments" element pada layout. Mula-mula kita perlu cipta satu fungsi controller yang akan mengembalikan data.

// controllers/comments_controller.php
class CommentsController extends AppController {
    function latest() {
        return $this->Comment->find('all', array('order' => 'Comment.created DESC', 'limit' => 10));
    }
}
  1. // controllers/comments_controller.php
  2. class CommentsController extends AppController {
  3. function latest() {
  4. return $this->Comment->find('all', array('order' => 'Comment.created DESC', 'limit' => 10));
  5. }
  6. }

Sekarang kita cipta satu element ringkas untuk memanggil fungsi tersebut:

// views/elements/latest_comments.ctp

$comments = $this->requestAction('/comments/latest');
foreach($comments as $comment) {
    echo $comment['Comment']['title'];
}
  1. // views/elements/latest_comments.ctp
  2. $comments = $this->requestAction('/comments/latest');
  3. foreach($comments as $comment) {
  4. echo $comment['Comment']['title'];
  5. }

Sekarang kita boleh menempatkan element tersebut di mana mana sahaja untuk mendapatkan output dengan menggunakan:

echo $this->element('latest_comments');
  1. echo $this->element('latest_comments');

Ditulis dengan begini, apabila element dibaca, request akan dibuat kepada controller untuk mendapatkan data, data akan diproses, dan dikembalikan. Walau bagaimana pun bersesuaian dengan amaran di atas adalah lebih baik menggunakan element caching untuk mencegah proses yang tidak dikehendaki. Dengan mengubah panggilan kepada element untuk melihat seperti ini:

echo $this->element('latest_comments', array('cache'=>'+1 hour'));
  1. echo $this->element('latest_comments', array('cache'=>'+1 hour'));

The requestAction call will not be made while the cached element view file exists and is valid.

Sebagai tambahan, requestAction sekarang akan mengambil url berasaskan array (gaya cake ):

echo $this->requestAction(array('controller' => 'articles', 'action' => 'featured'), array('return'));
  1. echo $this->requestAction(array('controller' => 'articles', 'action' => 'featured'), array('return'));

Ini membolehkan panggilan ke requestAction untuk melepasi penggunaan Router::url di mana ia akan membebankan perfomance. Array yang berasaskan URL adalah sama dengan HtmlHelper::link gunakan dengan satu perbezaan. Jika anda menggunakan params yang dinamakan pada url jadi requestAction url array mesti meliputi params yang dinamakan pada kunci 'named'. Ini kerana requestAction cuma menggabungkan named args array ke dalam ahli array Controller::params dan tidak menempatkan named args pada kunci 'named'.

echo $this->requestAction('/articles/featured/limit:3');
  1. echo $this->requestAction('/articles/featured/limit:3');

Array pada requestAction boleh jadi begini:

echo $this->requestAction(array('controller' => 'articles', 'action' => 'featured', 'named' => array('limit' => 3)));
  1. echo $this->requestAction(array('controller' => 'articles', 'action' => 'featured', 'named' => array('limit' => 3)));

Tidak seperti yang lain di mana array urls setanding dengan string urls, requestAction melayan mereka berbeza.

Bila menggunakan array url bersama requestAction() anda mesti menetapkan semua parameters yang akan anda perlukan pada requested action. Ini termasuklah parameters seperti $this->data dan $this->params['form']

3.5.5.4.7 loadModel

ada perubahan tertangguh untuk seksyen ini. More information about translations

loadModel(string $modelClass, mixed $id)

The loadModel function comes handy when you need to use a model which is not the controller's default model or its associated model.

$this->loadModel('Article');
$recentArticles = $this->Article->find('all', array('limit' => 5, 'order' => 'Article.created DESC'));
  1. $this->loadModel('Article');
  2. $recentArticles = $this->Article->find('all', array('limit' => 5, 'order' => 'Article.created DESC'));
$this->loadModel('User', 2);
$user = $this->User->read();
  1. $this->loadModel('User', 2);
  2. $user = $this->User->read();