View (Представления)

Представления в парадигме MVC получают информацию от контроллеров и визуализируют её. Представления не могут быть напрямую связаны с моделями.

Создание представлений

Файлы представлений хранятся как обычные файлы php в директориях views/. При создании представления, Kohana производит поиск этого файла согласно файловой системе, передает параметры и запускает. Пример файла представления:

<html>
<head>
<title><?=$title?></title>
</head>
<body>
<?=$content?>
</body>
</html>

Использование

Для создания представлений используется статический метод View::factory($file, $data), где $file — имя файла представления, $data — массив значений, которые будут переданы представлению. Пример создания представления:

$view = View::factory('content/advertisment');

Генерация

Генерация представления не происходит сразу же после его создания, а после вызова метода render():

$generated_view = View::factory('ads')->render();

Либо после echo (используется магический метод php __toString):

echo View::factory('ads');

Параметры

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

Передача через set

Первый из методов — set($key, $value), где $key — название параметра, $value — значение параметра:

// Обычный способ - передача каждого параметра через set()
$view = View::factory('content/advertisment')
	->set('message', 'Услуги снайпера')
	->set('link', 'http://localhost/');
// Передача массива параметров через метод set
$view = View::factory('content/advertisment')->set(array(
	'message' => 'Услуги снайпера',
	'link' => 'http://localhost/',
));

Прямое обращение к переменным объекта идентично методу set:

$view = View::factory('content/advertisment');
$view->message = 'Услуги снайпера';
$view->link = 'http://localhost/';

Также, метод set будет использован, если передавать переменные прямо при создании:

$view = View::factory('content/advertisment', array(
	'message' => 'Услуги снайпера',
	'link' => 'http://localhost/',
));

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

// Передача одного параметра
View::set_global('pagename', 'Стиральные машины');
// Либо массива параметров
View::set_global(array('pagename' => 'Стиральные машины'));

Передача через bind

Помимо простой передачи значений, можно передать переменную по ссылке методами bind($key, $value) и View::bind_global($key, $value):

// Глобальная передача
View::bind_global('product', $product);
// Передаем по ссылке
$view = View::factory('content/product')
	->bind('product', $product);
// Устанавливаем переменную
$product = array('title' => 'Стиральная машина');

Передать массив переменных по ссылке нельзя.

Передача переменных по ссылке более удобна и предпочтительна, с помощью неё можно создавать следующие конструкции:

// Создаем представление
$view = View::factory('content/product')->bind('product', $product)->bind('category', $category);
// Создаем переменные
$products = array('Bosch', 'Karcher', 'Microsoft');
$category = 'Стиральные машины';
// В цикле генерируем представления с разными значениями $product
foreach($products as $product)
{
	echo $view->render();
}

При наличии представления content/product, после выполнения конструкции результат выглядит следующим образом:

Стиральные машины Bosch
Стиральные машины Karcher
Стиральные машины Microsoft

Доступ к параметрам

После установки переменных, они становятся доступными через метод get($key), либо через прямое обращение к переменным объекта:

$product = 'Стиральная машина';
// Создание представления
$view = View::factory('content/advertisment')->set(array(
	'message' => 'Услуги снайпера',
	'link' => 'http://localhost/',
))->bind('product', $product);
// Получение параметра через get:
echo $view->get('product');
// Получение через обращение к свойствам объекта:
echo $view->message;

Доступ к параметрам из представления

Доступ к параметрам изнутри представления осуществляется напрямую через переменные:

echo $product;

Практическое использование

Пример практического использования представлений:

Контроллер welcome.php:

class Controller_Welcome extends Controller {
 
	public function action_index()
	{
		$menu = array('Главная', 'Загрузки', 'Контакты');
		View::bind_global('menu', $menu);
		$page = 'Главная';
		$this->response->body(View::factory('index')
			->bind('page', $page)
		);
	}
 
} // End Welcome

Представление index.php:

Текущая страница: <?=$page?>.
Меню:
<? foreach($menu as $item) { ?>
- <?=$item?>
 
<? } ?>

Результат:

Текущая страница: Главная.
Меню:
- Главная
- Загрузки
- Контакты

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *