Вдохновленный другими вики сообществами, мне интересно узнать о менее известных советах, трюках и особенностях Kohana.
Это сообщество wiki .
$options = ORM::factory('model') ->order_by('title','ASC') ->find_all() ->as_array('id','title'); $select = Form::select('name', $options);
Следует отметить, что это не ограничивается ORM и может использоваться для всех результатов базы данных (все они поддерживают as_array). Дополнительную информацию см. В информации о результатах базы данных .
Если вы хотите добавить опцию по умолчанию:
$options = Arr::merge(array('Please select a value.'), $options);
echo Database::instance()->last_query
Взятый из « Коханы 3», как вы определяете ошибки, сделанные во время запроса? ,
Вставьте эти строки в ваш .htaccess
:
SetEnvIf SERVER_ADDR "^(127\.0\.0\.1|::1)$" KOHANA_ENV=development SetEnvIf SERVER_ADDR "^((?!127\.0\.0\.1|::1).)*$" KOHANA_ENV=production
теперь, если вы находитесь на локальном хосте, вы находитесь в режиме разработки, иначе вы находитесь в режиме производства
Изменить: добавлена поддержка IPv6
Разница между this->request->route->uri()
и this->request->uri()
(Kohana 3)
// Current URI = welcome/test/5 // Using default route ":controller/:action/:id" // This returns "welcome/test/5" echo $this->request->uri(); // This returns "welcome/test1/5" echo $this->request->uri(array( 'action' => 'test1' )); // This returns "welcome/index" echo $this->request->route->uri(); // This returns "welcome/test1" echo $this->request->route->uri(array( 'action' => 'test1' ));
Как вы можете видеть, $ this-> request-> route-> uri () использует текущие значения по умолчанию для маршрута (id равно null), а $ this-> request-> uri () применяет текущие сегменты uri.
Функция add
ORM add
третий параметр, в котором вы можете указать дополнительные данные для сохранения в таблице 1pivot1.
Например, если у пользователя много ролей, а у роли много пользователей (через таблицу с именем 1roles_users1), вы можете сохранить информацию в таблице 1pivot1, передав массив ключей столбца и значения данных в качестве третьего аргумента методу add
.
Не поддерживается. Альтернативой было бы загрузить pivot table
и добавить данные так же, как и в любую другую таблицу.
$user->add('role', $role, array('date_role_added' => time()));
где $role
– ORM::factory('role', array('name' => 'user'));
Эти примеры кода предполагают, что вы расширяетесь от контроллера шаблона.
public function before() { parent::before(); if (Request::current()->is_ajax()) { $this->auto_render = FALSE; } }
public function before() { parent::before(); if (Request::$is_ajax) { $this->auto_render = FALSE; } }
Вместо привязки привязки к жесткому кодированию в вашем HTML и PHP, это хорошая идея, чтобы отменить маршрутизацию. Это по сути означает, что вы определяете местоположения маршрутов, а затем используйте их; Если вам когда-либо понадобится изменить местоположение, это будет сделано в одном месте, а не в сотнях.
Маршруты можно определить в любом месте, но это хорошая практика, чтобы поместить их в бутстрап приложения или загрузочный модуль (init.php).
Они устанавливаются следующим образом:
Route::set('name', '<controller>(/<action>)', array('action' => 'login|logout');
<part>
. Когда часть окружена скобками, эта часть является необязательной. Если пользователь не предоставил часть и вы хотите указать значение по умолчанию, используйте метод по умолчанию для указания значений.
->defaults(array('action' => 'login'));
Следующий код теперь используется для обратимых маршрутов. Путь URL-адреса может быть обновлен, и все ваши URL-адреса должны работать по-прежнему.
Route::url('name', array('controller' => 'user', 'action' => 'login'));
Установите base_url
автоматически:
Kohana::init(array( // ... 'base_url' => dirname($_SERVER['SCRIPT_NAME']), // ... ));
Если ваш сайт размещен в 1 и 1, вы должны использовать:
Kohana::init(array( // ... 'base_url' => substr($_SERVER["SCRIPT_NAME"], 0, strpos($_SERVER["SCRIPT_NAME"], basename($_SERVER["SCRIPT_FILENAME"]))); // ... ));
(взято из файла конфигурации Gallery3 )
Они известны как суб-запросы. Взгляните на статью Сэма де Фрейсинеса: Масштабирование веб-приложений с помощью HMVC для более глубокого объяснения. Обратите внимание на начальную разницу между экземплярами vs.
if (Request::initial() !== Request::current()) { print 'Internal called made with Request::factory'; }
if (Request::instance() !== Request::current()) { print 'Internal called made with Request::factory'; }
Эта функция проверяет как внутренние, так и AJAX-запросы. Это может быть удобно, если некоторые части страницы изначально загружаются с использованием техники HMVC и могут быть перезагружены с помощью AJAX. Поместите это с некоторым базовым контроллером, из которого вы расширите все свои правильные контроллеры (я называю это «базовым контроллером»):
public function is_remote() { if ($this->request->is_initial()) { if ($this->request->is_ajax()) { return TRUE; } else { return FALSE; } } else { return TRUE; } }
Более короткий (эквивалентный) способ написания:
public function is_remote() { return ( ! $this->request->is_initial() || $this->request->is_ajax()); }
Надеюсь это поможет.
Если вам нужно отобразить страницу с ошибкой, у Kohana есть исключения для нее. После того как вы выбрали исключение, вы можете создать собственный обработчик исключений и показать страницу с ошибкой HTML. Вам понадобится переключатель, чтобы показать реальную ошибку в разработке.
throw new HTTP_Exception_404('The article :article was not found', array(':article' => $article->name));
Второй аргумент дает вам возможность заменить строки в сообщении об ошибке.
Не содержит HTTP-исключений. Вы должны создавать свои собственные исключения и обрабатывать их. В Kohana есть учебник для этого: Kohana – Custom Error Pages
Чтобы выполнить SQL-запрос, например TRUNCATE mytable
с подготовленными операторами , передать null
качестве первого параметра для метода DB::query()
. Полезно, когда запрос не подходит для любой из операций CRUD.