Использование метода 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, который позволяет более удобно с ними работать.
<< Назад | Вперед >> |
Пожалуйста, зарегистрируйтесь для комментирования.
Почему не биндится определенный элемент массива?
$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()? К сожалению ничего толком не нашел.
это тоже самое, что
Просто записывается короче. Погуглите тернарный оператор. 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′;
мой вариант работает, но может ли он быть неправильным?
Это просто один из альтернативных вариантов. Кому как нравится и кому как удобнее.
Денис Васильевич, подскажите как вывести массив с контролера в вид, чтобы потом можно было форычить например? Выпадает ошибка что массив не может быть конвертирован в строку или что то подобное. Извиняюсь за столь тривиальный вопрос, в доках что читал видать примеры для старой версии, да и только знакомлюсь с коханой.
А как вы передаете, что не получается ?
Ну как вариант можно так
где $articles — это массив. И в виде его форичим. Вы дальше почитайте уроки, там есть примеры.