[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: JSRoute
Invis1ble
Представляю вашему вниманию модуль JSRoute для фреймворка Kohana 3.2. Архив внизу поста. код на гитхабе https://github.com/Invis1ble/kohana-jsroute

Для чего?

Модуль позволяет писать более гибкий client-side код, формируя необходимые URI и URL на основе правил маршрутизации, определенных на сервере.

Как пользоваться?

Использовать его очень просто:
1. Разархивируйте и скопируйте папку в %MODPATH%
2. Подключите модуль стандартными средствами
Kohana::modules(array(
// ...
'jsroute' => MODPATH.'jsroute', // JSRoute
// ...

));

3. Включите в страницу jquery-плагин после jquery, например:
<script type="text/javascript" src="/media/js/jquery.kohana.router-0.1.js"></script>

4. Использование, пример:
$.kohanaRouter({onload: function(router) {
var uri = router.get('category/index').uri({id: 2}),
url = router.url('category/index', {id: 2}),
absUrl = router.url('category/index', {id: 2}, true);

console.log(uri, url, absUrl);
}});

Предполагается, что на сервере зарегистрирован такой маршрут
Route::set('category/index', 'category/<id>', array(
'id' => '\d+',
))
->
defaults(array(
'controller' => 'catalog',
'action' => 'index',
'id' => null,
));

Иначе будет выброшен объект $.kohanaRouter.Error, в котором сказано, что маршрут не найден.

Как это работает?

Схема работы:
1. При создании объекта $.kohanaRouter производится ajax-запрос на сервер, где контроллер модуля подготавливает массив всех правил и отправляет этот массив клиенту в JSON-формате.
2. $.kohanaRouter принимает ответ от сервера и создает коллекцию маршрутов
3. по завершению обработки данных kohanaRouter вызывает функцию onload (передав туда свой инстанс), переданную при создании объекта в качестве одного из свойств объекта-аргумента. После этого можно выполнять необходимые действия по формированию урлов.
При попытке вызова одного из методов до загрузки данных с сервера будет брошено исключение.


Надеюсь, кому-то он окажется полезным :)



Спустя 5 минут, 44 секунды (5.05.2012 - 15:43) Invis1ble написал(а):
Критика и пожелания приветствуются.
Не стесняемся, комментируем smile.gif

Спустя 8 минут, 26 секунд (5.05.2012 - 15:51) Игорь_Vasinsky написал(а):
ты писал модуль?

Спустя 1 минута, 23 секунды (5.05.2012 - 15:53) Invis1ble написал(а):
да

Спустя 14 минут, 4 секунды (5.05.2012 - 16:07) johniek_comp написал(а):
Чего-то я не понял, а зачем?

Спустя 3 минуты, 14 секунд (5.05.2012 - 16:10) Invis1ble написал(а):
johniek_comp
Цитата
Для чего?

Модуль позволяет писать более гибкий client-side код, формируя необходимые URI и URL но основе правил маршрутизации, определенных на сервере.


Без модуля в js тебе прийдется писать http://domain/category/2 явно, и при смене правил маршрутизации url будет невалидным. Следовательно прийдется переписывать все урлы в js-коде каждый раз.
При использовании модуля jquery-плагин сам позаботится о смене url'ов, синхронизируясь с сервером.

Спустя 6 минут, 36 секунд (5.05.2012 - 16:17) johniek_comp написал(а):
Invis1ble
та же настройка роутинга что в index.php, только ещё и на js? и её не надо настраивать? она сама берет данные какие у меня там маршруты?

Спустя 58 секунд (5.05.2012 - 16:18) Invis1ble написал(а):
Цитата
та же настройка роутинга что в index.php, только ещё и на js? и её не надо настраивать? она сама берет данные какие у меня там маршруты?

Да. Ничего дополнительно настраивать не надо. Подключаешь модуль, плагин и пользуешься.

Спустя 1 день, 7 часов, 20 минут, 2 секунды (6.05.2012 - 23:38) Invis1ble написал(а):
Удалил архив. Теперь код запилен на гитхаб https://github.com/Invis1ble/kohana-jsroute
Кто качал - обновитесь, исправлено пару багов и произведена небольшая оптимизация плагина.

Спустя 4 часа, 15 минут, 18 секунд (7.05.2012 - 03:53) Invis1ble написал(а):
Добавлена новая фича - фильтры. Подробнее см. в README

Спустя 7 часов, 39 минут, 53 секунды (7.05.2012 - 11:33) vital написал(а):
А че, в кохане нету штуки в шаблонизаторе, типа как в Yii::
$this->createUrl('controller/action');

Ну и соответсвенно в яваскрипте
$.ajax({url:'<?php echo $this->createUrl('controller/action'); ?>'})

Это если у меня 50 ссылок на стрнице, будет 50 запросов к серверу?
При хотя бы 100 пользователях- онлайн - это уже мамммамиа..

Спустя 2 часа, 40 минут, 43 секунды (7.05.2012 - 14:13) sharki написал(а):
И на symfony тоже всё лаконично
Есть файл роутера, где производяться все настройки, типа

test_well:
pattern: /
defaults: { _controller: AcmeDemoBundle:Welcome:index }

Вызвать из пакета AcmeDemoBundle - Класс Welcome и в нем метод index

И в шаблоне
<a href="<?php echo $view['router']->generate('test_well') ?>">Home</a>


Ну или использовав встроенный шаблонизатор
<a href="{{ path('test_well') }}">Home</a>

Спустя 36 минут, 10 секунд (7.05.2012 - 14:50) Invis1ble написал(а):
vital
Цитата
А че, в кохане нету штуки в шаблонизаторе, типа как в Yii

Есть.
Цитата
Это если у меня 50 ссылок на стрнице, будет 50 запросов к серверу?

В том то и дело, что нет. При создании инстанса $.kohanaRouter будет сделан один запрос на сервер и получены все роуты, не внесенные в "черный" список. А потом можно уже формировать любые урлы на js.

sharki
Цитата
на symfony тоже всё лаконично

я в курсе, как в симфони. В кохане по сути тоже самое.

Вобщем вы не поняли прикола. На javascript можно писать без php-шных вставок, т.е. $.kohanaRouter - как бы отражение кохановского Route.

На php пишем
Route::url('media', array('file' => 'img/logo.png'));

на js
router.url('media', {file: 'img/logo.png'})

синопсис тот же, что и в php-шном Route

PS. Если не ошибаюсь, для symfony существует аналогичный бандл. Но я его не смотрел, признаюсь.

Спустя 59 минут, 23 секунды (7.05.2012 - 15:49) Семён написал(а):
Проще js генерировать через php, чтобы в нужных местах была произведена замена. У меня так реализовано.

Спустя 4 минуты, 49 секунд (7.05.2012 - 15:54) Invis1ble написал(а):
Семён
Расскажи, как именно ты генерируешь. Не совсем понятно, что конкретно ты имеешь ввиду.

Спустя 4 минуты, 43 секунды (7.05.2012 - 15:59) Семён написал(а):
Зачем обращаться из JS к PHP когда в процессе генерации итак известны все роуты, я имею ввиду в странице:
<script type="text/javascript" src="myJs.php"></script>
в которой
request : #(route)#;

меняем на нужный нам роут, в итоге у тебя будет js уже с подставленными всеми роутами без лишнего фонового запроса

Спустя 4 минуты, 30 секунд (7.05.2012 - 16:03) Invis1ble написал(а):
А, понял. Как вариант - да. Но у тебя в любом случае будет задействован пых, как и у меня.
При моём подходе удается полностью отделить javasript от php, и цена этому - да, фоновый запрос.

Спустя 3 минуты, 9 секунд (7.05.2012 - 16:06) Семён написал(а):
Да тут, просто весь смысл как раз упирается в этот самый 1 фоновый запрос)

Спустя 31 минута, 34 секунды (7.05.2012 - 16:38) Invis1ble написал(а):
Справедливое замечание. Естественно есть обратная сторона медали.
В принципе, я и не говорил, что изобрел что-то мегаохренительное, просто удобный вариант (для меня по крайней мере) писать код.

Спустя 1 час, 16 минут, 34 секунды (7.05.2012 - 17:54) Семён написал(а):
Invis1ble
Согласен, если теоретически ты сделаешь кеширование роутов, то 1 запрос не критичен

Спустя 17 дней, 4 часа, 45 минут, 21 секунда (24.05.2012 - 22:40) Invis1ble написал(а):
Отрефакторен jquery-плагин (фактически переписан заново).
Добавлен коллбэк onerror.
Добавлена новая фича - получение определенных роутов.
Подробнее в README.md


_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.