Работаем с видом — Часть 2

Комментарии: 28  Просмотры: 36 663

Использование метода set()

Следующий способ передачи данных в Вид, который мы рассмотрим, будет использование метода set, который есть у класса View. Он принимает два значения, причем первым будет имя, а вторым — значение переменной в файле Вида. Поменяйте метод action_index:

public function action_index()
{
    $view = View::factory('welcome')
          ->set('name', 'Васька')
          ->set('age', 25);
    $this->response->body($view);
}

Сохраните и обновите свою страничку. Использование метода set делает код более читабельным, так как все находится в одном месте.

Использование метода bind()

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

public function action_index()
{
    $view = View::factory('welcome')
          ->bind('name', $name)
          ->bind('age', $age);
    $name = 'Васька';
    $age = 25;
    $this->response->body($view);
}

Запустите. Ничего не поменялось. А теперь уберите строчку $name = ‘Васька’; и запустите снова. И хотя имя уже не выведется, но и сообщения об ошибке мы не получим. Чего нельзя сказать о первых трех способах. Возможно где-то его будет удобнее использовать, чем метод set с последующей проверкой переменной на существование (PHP-функция isset).

Иногда для удобства можно использовать сразу несколько способов передачи данных:

public function action_index()
{
    $view = View::factory('welcome')
          ->bind('age', $age);
    $age = 'больше 18';
    $view->name = 'Васька';
    $this->response->body($view);
}

А теперь добавим в Вид тернарный оператор, как дополнительную проверку:

<h2>Привет! </h2> Меня зовут, <?php echo isset($name)? $name : 'Гость'; ?>. 
Мне <?php echo $age; ?> лет.

и удалим в Контроллере строчку $view->name = ‘Васька’;. Запускайте. Вы получите не ошибку, а Гостя. Кстати это практически готовый скрипт для залогиненого/незалогиненого пользователя :)

На этом пока все. В следующем уроке мы рассмотрим Контроллер шаблонов Template Controller, который позволяет более удобно с ними работать.

<< Назад | Вперед >> | Обсудить на форуме


К записи оставлено 28 коммент.

Почему не биндится определенный элемент массива?
$this->template->bind(‘errors’, $response['errors']);

Вопрос снимается, ковырнул исходник — все стало ясно.
public function bind($key, & $value)
{
$this->_data[$key] =& $value;

return $this;
}

Я уже говорил, что фреймворк весьма хорошо самозадокументирован. Поэтому иногда вместе/вместо мануала смотрю исходники.

Я уже оценил всю мощь и удобство документации/исходников.

От себя скажу, что даже поверхностного английского должно хватать на первое время.

Можете пояснить для тех, кому не ясно — почему нельзя забиндить элемент массива?

Не хочу показаться совсем дремучим, но мне не совсем понятен следующий синтаксис

$view = View::factory(‘welcome’)
->set(‘name’, ‘Васька’)
->set(‘age’, 25);

Это какой-то внутренний синтаксис Коханы, или это просто отформатированная строка
$view = View::factory(‘welcome’)->set(‘name’, ‘Васька’) ->set(‘age’, 25); ?
Если так то не совсем понятно — метод factory имеет метод set который в свою очередь имеет метод set т.д.? Как такое может быть?

это просто строка
$view = View::factory(‘welcome’)->set(‘name’, ‘Васька’) ->set(‘age’, 25);
разбитая на строки для наглядности. Это чтобы не писать например
$view = View::factory(‘welcome’);
$view = $view->set(‘name’, ‘Васька’);
$view = $view->set(‘age’, 25);
Это не только в Кохане так. Вроде в пхп5 появилось, в 4 кажется только как я тут написал можно было (не уверен, но что-то такое читал).

Т.к. метод set класса View возвращает объект, то можно вешать сколько угодно set`ов :
View::factory(‘welcome’)->set(‘name’, ‘Igor’) ->set(‘age’, 21)-> и т.д.

Просто View::factory метод для вида, а set что в нём,так, я начинаю понимать;Жёлтенький не бойтесь со временем методы ещё перебирать будем если не потонем )

factory — это статический метод Фабрика. Если вам это ничего не говорит (можете почитать про паттерн Фабрика), скажу, что он возвращает объект класса View. В котором потом в нашем случае через метод set собираются различные параметры. Как в массив параметры добавляем, только в данном случае в объект.

У меня проблема с View, в результате такого просто когда, от View мне в ответ приходит объект.
Код:

// Модель — загрузка списка уроков в Выпуске
$list_lesson = Model::factory(‘Journal’)->getLessonThem($id_them);
// Вид — шаблон списка тем Выпуска
$list_lesson_them = View::factory(‘journal/them_list_lesson’)
->set(‘list_lesson’, $list_lesson);

печатаю переменную $list_lesson_them через print_r

получаю:
View Object ( [_file:protected] => D:\Program Files\xampp\htdocs\mykohana.ru\application\views\journal/them_list_lesson.php [_data:protected] => Array ( [list_lesson] => Array ( [0] => Array ( [id] => 23 [title] => Нюансы использования CSS ….. и тд

>>> $them_list_lesson — содержит простой ассоциированный массив, объект появляется как раз после использования View

разобрался, мой косяк был, так правда и не понял в чём была проблема(

Я ничего не понял. View::factory и должен возвращать объект.

isset($name)? $name : ‘Гость’;

Меня очень сильно заинтересовала вот эта строка, вернее ее часть, не могли бы Вы пояснить именно этот способ использования isset()? К сожалению ничего толком не нашел.

echo isset($name)? $name : 'Гость';

это тоже самое, что

if(isset($name))
    echo $name 
else
    echo 'Гость';

Просто записывается короче. Погуглите тернарный оператор. isset проверяет существование переменной.

Я понял что это замена, но думал что тут замешан сам фреймворк, спасибо, честно говоря это для меня открытие.

Обычный php. Не за что.

Автор, а вы специально в коде Вида сделали ошибку? Кстати весьма правильно, я считаю. Ведь в таком виде, если убрать строчку $view->name = ‘Васька’; кохана выдаст ошибку, о том, что вид пытается вывести не существующую переменную. Вы ведь биндом только $age передаете, т.е. её значение по умолчанию можно не передавать. Вы в общем-то правильно сделали, покопавшись немного, я сам понял в чем разница между виндом и сетом и в чем заключается приемущество bind над методом set.

Да. Пытался показать разницу между bind и set.

Здравствуйте.
У меня вопрос,
аналогичен ли этот способ
public function action_index()
{
$view = View::factory(‘pages/show’)
->set(‘name’, ‘Васька’)
->set(‘age’, 25);

моему варианту
public function action_index()
{
$View=View::factory(‘pages/show’);
$View->name=’васька’;
$View->age=’25′;

мой вариант работает, но может ли он быть неправильным?

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

Денис Васильевич, подскажите как вывести массив с контролера в вид, чтобы потом можно было форычить например? Выпадает ошибка что массив не может быть конвертирован в строку или что то подобное. Извиняюсь за столь тривиальный вопрос, в доках что читал видать примеры для старой версии, да и только знакомлюсь с коханой.

А как вы передаете, что не получается ?
Ну как вариант можно так

$content = View::factory('/pages/show')
    ->set('articles', $articles);

где $articles — это массив. И в виде его форичим. Вы дальше почитайте уроки, там есть примеры.



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.