Форум → Программирование → Пыхнуть хотите? → Готовые решения → Велосипедные библиотеки
Велосипедные библиотеки
-
13 марта 2010 г. 17:22, спустя 30 дней 15 часов 6 минут
доделываю роутер. С документацией пока бока. Это все из-за глючного Zend_Markup. Заебалсо уже им багрепорты слать.
Ссылка в 1 сообщении -
13 марта 2010 г. 18:17, спустя 54 минуты 52 секунды
итак, немного о роутинге. В принципе он уже работает. Как получить код - написано на 1 странице (нужен mercurial). Будет 5 парсеров:
1 общий (обрезает по бокам "/", index.php и все такое) - готов. Есть мысли внести его в главный класс.
1 для админки в виде /модуль.подмодуль/1/редактировать - ожидает реализации (*)
3 для фронтенда - 2 из них уже готово
Естественно можно добавлять свои или удалять уже существующие. (**)/* Пример работы с роутером: */
// в начале приложения
BL_Settings::setPathes(array(
'database' => 'config/database.php',
'routers' => array( // указываем пути с настройками для роутинга
'static' => 'config/routers/static.php',
'semiDynamic' => 'config/routers/semiDynamic.php'
)
));
BL_Database::setInstance();
BL_Router::parse();
// URL распарсили, если что-то совпало - в Request добавляются переменные со значениями
$_request = BL_Request::instance();
// что-то типа
var_dump($_request->m, $_request->do, $_request->fileId, $_request->slug);
// Если нихренашеньки не совпало - константа POSSIBLE_404 будет иметь значение true. Еще нужно сделать константу: на IS_FIRST_PAGE
BL_Router::parse(); может принимать 2 аргумента: $url и набор парсеров. Таким образом и достигается (**). В дальнейшем будет вложенный роутинг, тут то это и пригодится.
Почему парсеров так много?
Напишу о них в том порядке, в котором они вызываются
1) BL_Router_Common - просто чистит URL. Если он отрабатывает успешно - то мы на первой странице. Роутинг прекращается
2) BL_Router_Static - самый быстрый и простой парсер. Не поддерживает никаких параметров.
если что-то совпало - прекращаем роутинг<?php
// пример настроек этого парсера ('config/routers/static.php')
return array(
'url1' => array('m' => 'module1', 'do' => 'action1'),
'url1/suburl' => array('m' => 'module1_submodule1'),
);
// теперь при открытии в браузере "site.com/url" или "site.com/url/" или "site.com/index.php/url" BL_Request будет содержать m=module1, do=action1
3) BL_Router_SemiDynamic - парсер на основе регулярок. Поддерживает маски (:any, :num, еще будет год, месяц, день)
если что-то совпало - прекращаем роутинг (все как обычно=))<?php
// пример настроек этого парсера ('config/routers/SemiDynamic.php')
return array(
'files/:num/edit' => array('m' => 'files.manager', 'do' => 'edit', 'params' => array('fileId')),
'files/:num/:any' => array('m' => 'files', 'do' => 'view', 'params' => array('fileId', 'slug')),
'files/:num' => array('m' => 'files', 'do' => 'view', 'params' => array('fileId')),
);
// открываем "site.com/files/a" - нихрена не совпало, так как "а" не есть :num
// "site.com/files/319/edit" - совпало, в BL_Request отправили fileId=319
4) BL_Router_Database - а это для абсолютно любых URL'ов. В стиле site.com/countries/ukraine. Еще не готов. Вернее он есть у меня в старой системе (с него собственно говоря все и начиналось), но пока он не адаптирован под новую систему. Вы можете написать его сами
5) BL_Router_AdminPanel - еще не готов. Будет очень простым, в стиле (**). А админке бОльшего и не нужно.
Далi буде…
Ругайте, критикуйте. Да, мне самому не нравятся константы FIRST_PAGE, POSSIBLE_404. -
13 марта 2010 г. 18:32, спустя 14 минут 53 секунды
Насколько я понял , чтоб добавить новый контроллер, нужно сначало конфиг роутинга править ? А как же модульность, вкинул файл и готово ?
з.ы. я параноик -
13 марта 2010 г. 18:45, спустя 13 минут 30 секунд
можно сделать Installer для твоего модуля, который будет делать так:$config = "config/routers/static.php";
$urls = include $config;
$urls['my_new_url'] = array('m' => 'my_new_module');
$urls['my_new_url/do_smth'] = array('m' => 'my_new_module', 'do' => 'smth');
$urls = var_export($urls, true);
file_put_contents($config, $urls);Спустя 157 сек.да, еще: сгенерировать URL можно только руками. Обратная генерация будет, но пока я не знаю как ее сделать. -
13 марта 2010 г. 20:05, спустя 1 час 19 минут 51 секунду
ебанаСпустя 49 сек.обожаю теория за то, что она только теория, на практике - геморой и лишние действия.
вот подумал, чем всех index.php?action=add_page не устроил? всякую хуйню придумывают на протяжении лет :-DСапожник без сапог -
13 марта 2010 г. 20:18, спустя 13 минут 17 секунд
мне наоборот сложнее работать со стройой?парамтер=значение&еще_параметр=хх&еще=фф
ну че вам не нравится? вроде нормально ж. Я около 8 месяцев использую такое. Просто раньше оно было не так тсруктурированно -
13 марта 2010 г. 21:03, спустя 44 минуты 25 секунд
а не легче юзать urlmaper? с помощью паттерна "Chain of Responsibility"Спустя 55 сек.а там уже как хочешь, хоть ?inages=pyha хоть images/pyhaСпустя 63 сек.единственный минус, это сложность в отладке ) -
-
-
13 марта 2010 г. 21:37, спустя 8 минут 57 секунд
про URL-mapper не понял. А цепочка обязанностей у меня в принципе и так выстраивается: если BL_Router_Static не нашел соответствия начинает работать BL_Router_SemiDynamic. Если и он не нашел соответствие - передает работу BL_Router_Database. -
13 марта 2010 г. 21:41, спустя 4 минуты 37 секунд
позже напишу, щас беда случилась :(
про URL-mapper не понял. А цепочка обязанностей у меня в принципе и так выстраивается: если BL_Router_Static не нашел соответствия начинает работать BL_Router_SemiDynamic. Если и он не нашел соответствие - передает работу BL_Router_Database. -
15 марта 2010 г. 12:09, спустя 1 день 14 часов 27 минут
сделал, но еще не залил апдейт Request. Вложенный __get/__set:
$_POST['foo'] = 'bar';
$_GET['a'] = 1;
$_r = BL_Request::instance();
$_r->get->foo; // NULL
$_r->post->foo; // 'bar'
$_r->foo; // 'bar' (from request)
$_r->post->c = 'd';
$_r->post('c'); // 'd' -
16 марта 2010 г. 14:38, спустя 1 день 2 часа 29 минут
Добавил Page. Это примерно как Response в sf.
// у нас есть константа REVISION (config/main.php) - общая версия проекта. Пусть она равна 7
$_page->addStylesheet('reset');
$stylesheets = array(
'reset',
'main' => 5, // версия файла
'typo'
);
$_page->addStylesheet($stylesheets); // т.е можно пихать сразу целый массив стилей а не добавлять по одному
$_page->addStylesheet('reset', 10); // версия файла.
$s = $_page->getStylesheetsAsString();
/*
<link rel="stylesheet" type="text/css" href="css/reset.css?10" />
<link rel="stylesheet" type="text/css" href="css/main.css?5" />
<link rel="stylesheet" type="text/css" href="css/typo.css?7" />
*/
// примерно тоже самое и для JS. Папки с JS и css-файлами можно указывать.
$_page->template('main'); // загрузить шаблон /templates/main.htm . Загрузка отложенная (инстанция шаблонизатора не создается)
$tplName = $_page->template(); // 'main'
что хочу еще сделать:
- addSmth - ну, нам нужно добавить ссылку на RSS
- типы для стилей (media, print)
- meta-теги
- JS-библиотеки. Отличие от простых js-файлов - то, что они могут быть расположены на серверах Гугла или Яндекса, мы можем указывать какую версию использовать (версия != не ревизия), с какого сервера грузить. -
16 марта 2010 г. 14:42, спустя 4 минуты 32 секунды
Абырвалг, не понял смысла в твоей хуйнеСапожник без сапог -
16 марта 2010 г. 14:49, спустя 6 минут 28 секунд
есть виджет, которому нужен js-файл на странице. В коде этого виджета пишем $page->addJavascript('file1'); - и этот файл подключается.
Через месяц вышла новая версия виджета, js-код тоже обновился. А файлик-то с js у пользователя закеширован. Мы заменяем
$page->addJavascript('file1');
на
$page->addJavascript('file1', 'версия виджета');
и пользователь получит свежий файл. + Тут работают такие плюшки, как отсутствие дублирующихся файлов (когда 2 виджета подключают один и тот же файл - getStylesheetsAsString вернет файлы без дубликатов)
Ну короче, это почти клон http://trac.symfony-project.org/browser/branches/1.4/lib/response/sfWebResponse.class.php , просто написанный самостоятельно с учетом моих нужд.
Пожалуйста, авторизуйтесь, чтобы написать комментарий!