Собственные опции шаблона

Рубрика: MaxSite CMS -> Ход работ
Метки:
Суббота, 24 мая 2008 г.
Просмотров: 2430
Подписаться на комментарии по RSS
]]>
]]>

Как я уже писал, опции я реализовал в виде ini-файла. Основные преимущества такого подхода в том, что можно с помощью простого ini-файла создать или поменять любые настройки сайта. То есть вместо «вшивания» настроек в «движок» мы выносим их в отдельный описательный файл.

Точно такой же способ я реализовал и для настройки шаблона. Попробую объяснить что я хотел добиться на примере WordPress.

Для примера можно рассмотреть такую настройку как количество записей для вывода на главной. В WordPress данная опция определена в самой админке. Кажется, что все логично, но предположим я хочу выводить разное количество записей для главной и для страницы рубрик. Что делать? В WordPress нужно лезть в шаблон и прописывать query_posts(). Согласитесь, малоэлегантное решение.

Когда-то я понял, что многие админские настройки WordPress - это прежде всего настройки самого шаблона. И вот добавление своих опций в админ-панель в WordPress'е сделано крайне сложно. Для того, чтобы добавить одну опцию придется дополнительно заниматься программированием и самого шаблона и «обслуживающего» файла (например, плагина).

Всё это меня совершенно не устраивало и в своей системе я решил, что настройки шаблона должны реализовываться гораздо проще и легче. Итак, как это работает сейчас.

  1. Вначале активируем плагин «Template options». Он как раз и подключает опции шаблона в админку. Этот плагин ищет в шаблоне файл options.php, где и реализуется нужный функционал.
  2. Теперь указываем в options.ini нужные нам настройки
  3. В шаблоне прописываем вызов настроки mso_get_option().
Вот пример ini-файла (рабочий):

  1.  [Количество записей на главной]
  2.  options_type = templates
  3.  options_key = limit_post_home
  4.  type = textfield
  5.  description = "Укажите количество записей, которые будут выводиться на главной странице сайта."
  6.  default = 5
  7.  [Количество записей на остальных]
  8.  options_type = templates
  9.  options_key = limit_post
  10.  type = textfield
  11.  description = "Укажите количество записей, которые будут выводиться на остальных страницах (рубрики, архивы и т.д.)"
  12.  default = 5

Файл options.php нет смысла описывать - он будет типовой и состоит из нескольких строчек.

В самом шаблоне, например в home.php в функции, которая получает вывод записей мы допишем нужную нам опцию:

  1.  $par = array( 'limit' => mso_get_option('limit_post_home', 'templates', '7') );

То есть мы просто получаем опцию (ключ, тип) и её значение по-умолчанию (если нет).

Здесь важный момент состоит в том, что все опции хранятся в единой таблице БД и у них единый механизм работы. Все опции автоматически кэшируются (в памяти и на диске), поэтому лишних запросов к БД не генерируется. Конечно же в опции не следует «загонять» большие значения, как это сделано в WordPress - из-за этого кэш получается слишком большим и способен уже притормаживать.

Получение же любой опции осуществляется с помощью функции:

  1.  mso_get_option('ключ', 'тип/группа', 'значение если нет')
]]>twitter.com Google Buzz google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru]]>

Комментариев: 10

  1. 2008-05-24 в 14:04:46 | Аноним

    А почему бы не использовать вместо ini файла базу данных? А вместо ручного добавления в ini файл админку? Кстати, очень быстро сессия заканчивается:

    Ошибка сессии! Обновите страницу

  2. 2008-05-24 в 14:08:36 | Максим
    ]]>]]>

    ini-файл очень просто редактировать и работать с ним. А данные так и хранятся - в базе.

  3. 2008-05-24 в 14:26:51 | Роман

    Забыл имя указать. Я понимаю, что легче работать с ini-файлом, чем непосредственно с кодом, но ведь удобнее редактировать в html интерфейсе, вынесенного в админку.

    Если честно, я не понимаю смысл ini-файла, если

    [quote]

    данные так и хранятся - в базе

    [/quote]

    smile

  4. 2008-05-24 в 19:32:36 | Максим
    ]]>]]>

    Не уловил... Что редактировать?

  5. 2008-05-24 в 21:40:52 | Sam

    А зачем ini, если в CI уже есть нативные конфиги и они прекрасно работают?

  6. 2008-05-24 в 23:18:07 | Максим
    ]]>]]>

    Видимо я плохо объяснил. ;)

    Ini-файл служит для того, чтобы указать саму опцию и форму для вывода этой опции. Проще ini уже ничего не придумать.

    Что касается встроенного config, то толку от него как с козла молока: с таким же успехом можно просто задать массив и не морочить голову.

  7. 2008-05-25 в 11:26:22 | Роман

    Я бы сделал немного по-другому.

    В админке есть пункт «Дополнительные поля», там добавляется поле с параметрами (пример):

    «Название поля» — mood

    «Описание поля» — Настроение

    «Категория» — edit_news

    «Тип поля» — выпадающее меню

    «Значение» — Отличное | Нормальное | Ужасное

    «Использовать при желании» — да (если поле останется пустым, то будет использовано дефолтное значение)

    После создания поля, в категории edit_news («Редактирование новости») в самом низу добавляется выпадающее меню для выбора настроения.

    Для вывода настроения в шаблоне используется функция get_metafiled('mood', $id), где переменная id — идентификатор новости с настроением.

    Кстати, какой будет дефолтный шаблон?

  8. 2008-05-25 в 13:20:33 | Максим
    ]]>]]>

    То есть ini-файл вынести в админку? Честно говоря, я не уверен в такой необходимости. Но, если сложилось мнение, что опциями можно управлять только через ini-файл, то это ошибка.

    В данном случае я исхожу из того, что ini-файлом проще описать нужные нам опции/формы и не более того. Если нужно отредактировать сам файл, то несложно сделать редактор в файл-менеджере. Это если нужно править через админку.

    Другой вариант - это добавить отдельный плагин, который будет выдавать/создавать/редактировать опции.

    Что касается мета-полей к страницам, то тут немного сложней, поскольку это уже не таблица опций, а таблица meta. Я исходил из того, что в WordPress'е есть настрока метаполей, но а) многие мета являются служебными и их не требуется отображать; б) с ними неудобно работать; в) уже из своего опыта я выяснил, что в 99% случаев клиенту не требуются какие-то «сверх-поля» - обычно все ограничивается стандартным «источник», «title», «путь к миниатюре». То есть это один и тот же набор мета для всех записей. И тут, конечно же проще всего задать их один раз в файле, чем администрировать через панель управления.

    Но, еще раз подчеркну, можно сделать плагин, который будет позволять управлять опциями/мета/ini через админку. Но в моих планах пока он не значится. ;)

    Дефолтный шаблон - это который сейчас на этом сайте.

  9. 2009-07-11 в 10:50:25 | Антон Кокин
    ]]>]]>

    Максим, здравствуйте.

    Максим, я пользуюсь этим файлом и мне он кажется очень удобным. Но у меня возник вопрос. Дело в том, что после добавления своих данных в файл, эти данные подключаются к общему ini-файлу и отображаются на общей же странице настроек. В этом случае не так быстро находятся "свои" опции (да, они в конце, но без отделения от дефолтных).

    Вопрос: а не планируется ли сделать что-то типа отдельно странички для дефолтных опция и пользовательских?

    Могу сказать лишь за себя, что мне было бы так удобно управлять опциями и различать их.

    Спасибо.

  10. 2009-07-11 в 15:07:40 | Максим
    ]]>]]>

    Нет, Антон, не планирую. wink Для того, чтобы отключить дефолтные опции нужно объявить их с пустой секцией. Например:

    [Текст для «Далее»]
    [Количество записей на главной]
    [Количество записей на остальных]
    [Количество записей в RSS]
    [Полные записи в RSS]
    

    отключит соответствующие опции в админке.

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)



grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)