Итак начну с того, что все контроллеры в Default-е лежат у нас в папке
application\classes\controller
Создадим новый
php файлик в этой папочке и назовём его myhello.
phpapplication\classes\controller\myhello.php
И в начинке напишем:
<?php
defined('SYSPATH') or die('No direct script access.');
class Controller_Myhello extends Controller {
public function action_privet() {
echo "HELLO WORLD";
}
}
И вернёмся к 2-ому уроку, в файле bootstrap находим строки
и перед ними напишем:
Route::set('myhello', 'myhello(/<action>')
->defaults(array(
'controller' => 'myhello',
'action' => 'privet',
));
Так мы сделали / указали правила для нашего контроллера:
т.е. теперь мы можем
работать с
http://мой_сайт/myhello/privetmyhello(/<action>)
<action> говорит о том, какой action может быть вызван в контроллере.
->defaults(array(
'controller' => 'myhello',
'action' => 'privet',
в default-s указываем параметры по умолчанию.
Сохраняем переходим в
http://мой_сайт/myhello/privetНаблюдаем HELLO WORLD
ДА и чуть не забыл, у вас должен быть включен RewriteMode.
Если что потребуется дописать открывайте .htaccess и модифицируйте его:
Например мой выглядит так в тестовом project-e:
AddDefaultCharset utf-8
AddCharset utf-8 *
<IfModule mod_charset.c>
CharsetSourceEnc utf-8
CharsetDefault utf-8
</IfModule>
RewriteEngine On
RewriteBase /
<Files .*>
Order Deny,Allow
Deny From All
</Files>
RewriteRule ^(?:application|modules|system)\b.* index.php/$0 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT]
В след уроке будем это переносить в шаблон
Спустя 2 месяца, 1 день, 3 часа, 42 минуты, 19 секунд (19.05.2011 - 14:37) Krevedko написал(а):
почитаю вечерком. спасибо за твой труд
Спустя 6 часов, 7 минут, 36 секунд (19.05.2011 - 20:45) Семён написал(а):
Могу продолжить там по идее след. можно краткий по View сделать
Спустя 2 часа, 48 минут, 3 секунды (19.05.2011 - 23:33) Krevedko написал(а):
не совсем понятно, зачем в роутере прописывать дефолт, когда мы заходим по адресу
http://мой_сайт/myhello/privetоно ведь и так с
работает.
чтобы это же срабатывало при заходе на
http://мой_сайти то что там уже есть дефолт в виде
Route::set('default', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'welcome',
'action' => 'index',
));
? может надо тут поменять на твои ?
Просто в КИ несколько по другому.
Там дефолт пишется просто
$route['default_controller'] = "main";
а роуты что-то типа
$route['(:num)/(:num)/(:num)/([a-z]+)'] = "main/index/$1/$2/$3/$4";
Спустя 15 минут, 43 секунды (19.05.2011 - 23:49) Семён написал(а):
У тебя стандратный роутер просто написан, вот и работают такие конструкции
<controller>(/<action>(/<id>)), однако я стараюсь таких динамических правил избегать и указывать жёсткие пути )
Спустя 11 дней, 15 часов, 19 минут, 52 секунды (31.05.2011 - 15:09) Krevedko написал(а):
просмотрел пару видео курса Морковина. смотрю, что он наследует не просто контроллер, а controller_template.
а что обычный контроллер как-то по другому с темплейтами работает ?
Спустя 28 минут, 34 секунды (31.05.2011 - 15:37) Семён написал(а):
На сколько я помню, это пережитки Ko2, где явно вызывался render
Спустя 6 часов, 38 минут, 11 секунд (31.05.2011 - 22:15) Krevedko написал(а):
продолжение уроков будет ?
Спустя 10 часов, 30 минут, 46 секунд (1.06.2011 - 10:07) Krevedko написал(а):
Спустя 6 дней, 11 часов, 4 минуты, 14 секунд (7.06.2011 - 21:11) AmberLEX написал(а):
Если нужно контроллер засунуть в папку, например adm/welcome.php, то имя класса будет выглядеть по идее так: class Controller_Adm_Welcome, но че-то не работает. Набираем адрес сайта и ошибка, как сделать-то?
Спустя 12 часов, 53 минуты, 55 секунд (8.06.2011 - 10:05) Семён написал(а):
У вас вложенный контроллер лежит в папке application\classes\controller ?
Если так проверьте свой Router
Спустя 9 часов, 51 минута, 30 секунд (8.06.2011 - 19:56) AmberLEX написал(а):
В общем нужно примерно так:
В папке application/classes/controller расположить например еще две папки:
adm - для контроллеров админки
cmn - для контроллеров сайта
а в папке controller - могут быть еще файлы (2-3 штуки), общие.
Например, cmn.php в котором есть методы before() и after() которые будут выполняться перед и после экшена, какие-то установки для шаблонов, мета-данные для страницы, че-то однотипное в общем и т.п.
Я примерно так мыслю приложение строить. Ну это когда усложняться будет.
Вот.
Если мы набираем в адресе mysite.ru/welcome/ - то сработать должен контроллер из папки cmn, а если mysite.ru/adm/welcome/ - то из папки adm Можно так сделать?
Спустя 7 дней, 17 часов, 33 минуты, 15 секунд (16.06.2011 - 13:30) AmberLEX написал(а):
Автор запропастился куда-то(
Спустя 54 минуты, 11 секунд (16.06.2011 - 14:24) Семён написал(а):
Честно говоря бредовая идея, корень есть корень он итак подразумевает под собой папку cmn:
Вот пример роута для adm
Route::set('adm', '<directory>(/<controller>(/<action>))', array('directory'=>'adm(/\w+?)?'))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
Аналогично потребуется сделать для cmn, добавив в исключения те 2-3 файла, которые должны лежать в корне.
Извиняй, но это откровенный бред.
Спустя 5 часов, 57 минут, 40 секунд (16.06.2011 - 20:22) AmberLEX написал(а):
Ладно, корень так корень. А куда тогда положить мои классы, например, которые расширяют (наследуют) кохановские? Не будут же они лежать тоже в корне, для них тогда папка нужна какая-то?
Спустя 12 часов, 3 минуты, 20 секунд (17.06.2011 - 08:25) Семён написал(а):
Ну я кладу сторонние / свои библиотеки/классы в Modules затем их прописываю в bootstrap, например:
Kohana::modules(array(
'database' => MODPATH . 'database',
'kminify' => MODPATH . 'kminify',
));
Однако тотже самописный Paginator лежит в APP_DIR/classes/pagination.
phpи в контроллерах вызывается просто:
$pagination = new Pagination;
Хочешь загрузить из папки APP_DIR/classes/my/class/name.
phpKohana::auto_load("My_Class_Name");
$myClass = new Name;
Если у Вас статистически классы то просто
My_Class_Name::method