Menu

whishlist

2008-06-02
2013-04-18
  • Vladimir Berkutov

    Этот проект сделан, что бы можно было не мучаться с контролем версий, а так же с отсутствием возможности регулярно встречаться. В этой теме я бы хотел обсудить список того, чего хочется. Пока у меня следующие идеи (в стиле мыслепоток - сортировка будет не сдесь):

    * Модульное (компонентное) построение библиотеки/движка. Каждый компонент несёт свою функциональность, например - работа с текущим пользователем (вход, авторизация, аутентификация, сохранение данных,...). При этом каждый компонент - класс с набором статических методов. Так же каждый компонент обладает специальным полем protected static $settings = array(); - массивом настроек компонента. При обновлении компонента, содержимое этого поля сохраняется, тогда как всё остальное (методы, документация, т.п.) обновляются. Так же очень желательно, что бы компоненты имели логичные зависимости друг от друга. Лишних же зависимостей нужно избегать.
    Компонент хранится в файле engine/<name>.component.php, где <name> - название компонента.

    * Стиль кода: все имена - маленькими буквами, без подчёркиваний. Желательно, что бы имена состояли из одного слова. Отступы - в php - табами, в html, js - одним пробелом.

     
    • Vladimir Berkutov

      * Компонент database:

      function query($request, $getresult = true)
      Выполняет SQL-запрос $request с текущим соединением. Возвращает: false при ошибке запроса; true при успешном выполнении запроса; массив (строки индексированы числами 0..N-1, столбцы - именами столбцов из ответа), если запрос вернул данные (например, запрос SELECT) и установлен флаг $getresult (по умолчанию установлен).

      function lasterror()
      Возвращает полседнюю ошибку sql-сервера.

      (продолжение следует)

       
    • Vladimir Berkutov

      Component: design
      Компонент отвечает за шаблоны оформления. Каждый шаблон - кусок html-разметки со специальными тегами. Есть два типа тегов - теги, указывающие на другой шаблон (template) и теги, указывающие на placeholder-ы. У каждого шаблона есть уникальный ключ - строка. По этой строке и осуществляется идентификация шаблона.

      Тег шаблона: ключ, заключённый в парные фигурные скобки ('{' и '}'). На месте этого тега при генерации страницы будет вставлен соответствующий шаблон. Тег placeholder-а - ключ, заключённый в квадратные скобки ('[' и ']'). При обработке шаблона используется массив значений key => value. Все тэги placeholder-ов будут заменены на значения из массива с соответствующими ключами.

      Пример шаблона блока комментариев:

      <div class="comments">
        <!-- Вместо этого тега будет вставленна форма быстрого ответа из шаблона components::quickreply -->
        {comments::quickreply}
        <!-- А вместо этого тега будет выведен список комментариев. Рендеринг (генерация кода) этого списка осуществляется компонентом comments, ключ переменной - list. -->
        [list]
      </div>

      *** Методы ***

      render($template, $placeholders)
      Производит рендеринг шаблона с ключём $template, используя переменные из $placeholders. В начале производится "сборка" шаблона - рекурсивная обработка всех тегов шаблонов - используя метод design::assembly, в потом производится обработка тегов переменных (замена их на соответствующие значения из $placeholders.

      assembly($template, $cacheable = true)
      Собирает шаблон, действуя следующим образом:
      1. Если $cacheable - истинно, и кэш содержит уже собранный шаблон, то выдаём кэшированныю копию.
      2. Для каждого шаблонного тега собираем соответствующий шаблон. Промежуточные сборки не кэшируются.
      3. Заменяем теги шаблонами.
      4. Если нужно кэширование - кэшируем.
      5. Возвращаем результат.

      template($key, $code = null)
      Если второй аргумент не задан, то возвращает код шаблона без какой-либо обработки или false, если шаблон с таким именем не существует. Если второй аргумент задан, то создаёт/заменяет шаблон с ключём $key и кодом $code.
      @note Возможно понадобятся ещё параметры шаблонов. Но пока метод работает таким образом.

       
      • Vladimir Berkutov

        Небольшое дополнение. Возможно стоит испоьзовать 3 типа вставок - шаблоны (templates), переменные (placeholders) и исполняемые (executives). Формат вставок:
        {t:<key>}
        {p:<key>}
        {e:<key>}
        <key> - Ключ вставки. Для этих трёх типов вставок пространства имён - разные (то есть одновременно могут существовать шаблон bar и исполняемая вставка bar).

        Подробнее про вставки:
        1. Шаблоны - куски html с, возможно, тегами вставок. Лежат в sql таблице templates.
        2. Переменные - частично аккумулируются компонентом design при инициализации/получении информации других компонент, а частично передаются при рендеринге.
        3. Исполняемые вставки - php-код. Исполняется функцией eval().

        Остаётся открытым вопрос с кэшированием (компонент cache). Понятно, как кэшировать шаблоны - в собранном (assembled) виде. Исполняемые вставки видимо надо либо складывать в кэш и вызывать с помощью include, либо с помощью eval - первое (в силу скорости) предпочтительнее.
        Больное место - переменные. Иногда они меняются (current user info), а иногда - нет (site info). Наверное, их не стои кэшировать - всё равно те же настройки сайта лежат в соотв. компоненте.

         
    • Dmitriy Belokurov

      Насчёт пожеланий. Я думаю, что стоит создать компонент, который будет собирать статистику на каждого пользователя( а может даже на гостей сайта). После этого можно будет составить некий ретинг пользоватеей по таким показателям как время, проведённое на сайте, колличество постов и т.д.
      ЗЫ. Вообще идея появилась уже давно, во время администрирование юкозовского сайта.

       
      • Vladimir Berkutov

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

        Кстати, возможно, часть методов будет в user компоненте. Этот компонент будет инициализироваться при каждой генерации страницы. С другой стороны, возможно, стоит сделать надстройку на user (и даже больше, чем настроку) - что то-типа ещё одного компонента log - для сбора всех логов действий пользователей.

         

Log in to post a comment.