ФорумПрограммированиеПыхнуть хотите?Готовые решения → Велосипедные библиотеки

Велосипедные библиотеки

  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 13 марта 2010 г. 17:22, спустя 30 дней 15 часов 6 минут

    доделываю роутер. С документацией пока бока. Это все из-за глючного Zend_Markup. Заебалсо уже им багрепорты слать.

    Ссылка в 1 сообщении
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 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.
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 13 марта 2010 г. 18:32, спустя 14 минут 53 секунды

    Насколько я понял , чтоб добавить новый контроллер, нужно сначало конфиг роутинга править ? А как же модульность, вкинул файл и готово ?

    з.ы. я параноик
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 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 можно только руками. Обратная генерация будет, но пока я не знаю как ее сделать.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 13 марта 2010 г. 20:05, спустя 1 час 19 минут 51 секунду

    ебана
    Спустя 49 сек.
    обожаю теория за то, что она только теория, на практике - геморой и лишние действия.

    вот подумал, чем всех index.php?action=add_page не устроил? всякую хуйню придумывают на протяжении лет :-D
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 13 марта 2010 г. 20:18, спустя 13 минут 17 секунд

    мне наоборот сложнее работать со стройой?парамтер=значение&еще_параметр=хх&еще=фф

    ну че вам не нравится? вроде нормально ж. Я около 8 месяцев использую такое. Просто раньше оно было не так тсруктурированно
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 13 марта 2010 г. 21:03, спустя 44 минуты 25 секунд

    а не легче юзать urlmaper? с помощью паттерна "Chain of Responsibility"
    Спустя 55 сек.
    а там уже как хочешь, хоть ?inages=pyha хоть images/pyha
    Спустя 63 сек.
    единственный минус, это сложность в отладке )
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 13 марта 2010 г. 21:24, спустя 20 минут 47 секунд

    я не шарю. Это как?
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 13 марта 2010 г. 21:28, спустя 4 минуты 11 секунд


    я не шарю. Это как?
    что именно не понял? :)
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 13 марта 2010 г. 21:37, спустя 8 минут 57 секунд

    про URL-mapper не понял. А цепочка обязанностей у меня в принципе и так выстраивается: если BL_Router_Static не нашел соответствия начинает работать BL_Router_SemiDynamic. Если и он не нашел соответствие - передает работу BL_Router_Database.
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 13 марта 2010 г. 21:41, спустя 4 минуты 37 секунд


    про URL-mapper не понял. А цепочка обязанностей у меня в принципе и так выстраивается: если BL_Router_Static не нашел соответствия начинает работать BL_Router_SemiDynamic. Если и он не нашел соответствие - передает работу BL_Router_Database.
    позже напишу, щас беда случилась :(
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 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'
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 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-файлов - то, что они могут быть расположены на серверах Гугла или Яндекса, мы можем указывать какую версию использовать (версия != не ревизия), с какого сервера грузить.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 16 марта 2010 г. 14:42, спустя 4 минуты 32 секунды

    Абырвалг, не понял смысла в твоей хуйне
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 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 , просто написанный самостоятельно с учетом моих нужд.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!