CakePHP 3 View Cells

View Cells to takie mini kontrolery, które posiadają własną logikę i renderują templaty. View Cells są idealne do tworzenia komponentów strony wielokrotnego użytku, które wymagają interakcji z modelami.

W celu utworzenia cella należy utworzyć klasę w src/View/Cell oraz plik ctp w src/Template/Cell/. Nasza klasa to LoginCell. Będzie ona ustawiać zmienną user na aktualnie zalogowanego użytkownika. Należy ją umieścić w pliku src/View/Cell/LoginCell.php. Widać, że dziedziczy ona po klasie Cell Caka. Metoda display() jest domyślną metodą wywoływaną poczas renderowania cella.
namespace App\View\Cell;

use Cake\View\Cell;

class LoginCell extends Cell
{

    public function display()
    {
		$this->set('user', $this->request->session()->read('Auth.User'));
    }

}
Plik templatu dla tego cella widnieje poniżej. Powinien znaleźć się w pliku src/Template/Cell/Login/display.ctp
<ul class="nav navbar-nav navbar-right">
	<?php
		if(!empty($user)) {
			echo '<li class="dropdown">';
			echo '<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">'.$user['username'].' <span class="caret"></span></a>';
				echo '<ul class="dropdown-menu">';
					echo '<li>'.$this->Html->link(__('Settings'), ['controller' => 'users','action' => 'edit', $user['id']]).'</li>';
					echo '<li>'.$this->Html->link(__('Logout'), ['controller' => 'users','action' => 'logout']).'</li>';
				echo '</ul>';
			echo '</li>';
		} else {
			echo '<li>'.$this->Html->link(__('Log in'), ['controller' => 'users','action' => 'login']).'</li>';
		}
		?>
</ul>
Aby wywołać cella w pliku widoki piszemy.
echo $this->cell('Login');
Powyższy kod załaduje cella Login i wykona metodę display(). Można wywołać inną metodę na starcie, korzystając z poniższego kodu. Wywoła on metodę o nazwie other().
echo $this->cell('Login::other');
Można również przekazywać parametry do cella.
W widoku:
echo $this->cell('Favourites::recent', ['-3 days']);
Funkcja recent() w klasie cella przyjmie wtedy argument.
public function recent($since)
{
}