Виджеты в блоголёте - это блоки контента в сайтбарах. Пример таких виджетов - список категорий, архив по месяцам, список свежих комментариев и постов. С стандартным списком виджетов и их настройками вы можете ознакомится в панели администрирования блоголёта на странице виджеты - далее настройки стандартных. Вы может самостоятельно добавлять свои собственные виджеты. Если будущий виджет будет иметь статичный текст и не нуждается в обработки событий блоголёта, то для этого подойдет виджет с редактируемым текстом. Редактируемых виджетов вы можете добавить неограниченное количество, как впрочем потом их перемещать между сайтбарами или удалять. Если же вам потребуется програмируеммый виджет, то для этого нужны небольшие инструкции.

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


public function GetWidgetContent($id)

где $id - это id запрошенного виджета (в большинстве случаев оно игнорируется), который должен возвращать законченный html текст. Полученный от GetWidgetContent контент используется классом TTemplate, который собственно и вызывает GetWidgetContent и потом распоряжается по своему усмотрению, а точнее в зависимости от настроек виджета: либо сразу включает его в генерируемую html страницу, сохраняет контент виджета в кеше - чтобы каждый раз не дергать GetWidgetContent и так далее. настройки для виджета устанавливаются в методе класса TTemplate


public function AddWidget($class, $echotype, $order = -1, $index = 0)

где $class - имя вашего класса с методом GetWidgetContent, $echotype - может принимать одно из следующих значений:

  • echo - выводить контент сразу, контент кешируется
  • include - выводить контент через php функцию include, внедренную в генерируемый html код страницы, контент кешируется. Пример такого типа - виджет свежих комментариев, когда новые комментарии появляются часто, но при этом вся html страница каждый раз не создается - в ней есть php вставка с включением виджета
  • nocache - самый редкий случай, контент виджета не кешируется, а каждый раз запрашивается у класса

другие значения $echotype являются недопустимыми. $order - порядок в каком виджет будет вставлен в сайтбар, значение -1 означает в конец списка виджетов в сайтбаре. $index - номер сайтбара, куда вы вставляете виджет, индексация начинается с нуля и не может превышать количество сайтбаров в теме, но поскольку хотя бы один сайтбар в теме есть, то рекомендуется вставлять в сайтбар = 0. Пример добавления виджета рубрик:


$Template->AddWidget('TCategories', 'echo', 0, 0);

понятно, что внутри класса удобнее использовать get_class($this) В приведенном примере добавляется виджет на первое место.

Как же реализовывать метод GetWidgetContent в своем классе? Практически все виджет реализуют этот метод следующим образом:


public function GetWidgetContent($id) {
  global $Template;
  $result = $Template->GetBeforeWidget('', 'заголовок');
...какой то контент
  $result .= $Template->GetAfterWidget();
  return $result;
}

обратим внимание на используемый метод GetBeforeWidget класса TTemplate:


public function GetBeforeWidget($name, $title = '')

этот метод возвращает готовую html шапку для виджета. Эта шапка берется из файла theme.ini текущей темы. Если виджет стандартный и для него есть уже подготовленная шапка, то следует передать имя этой шапки, то есть например categories. Если вы создаете свой новый виджет, то очевидно, что ни в одной из существующих тем для вашего виджета не будет подготовлена специальная шапка, поэтому будет использована стандартная шапка для виджета и поэтому первый аргумент для метода GetBeforeWidget следует ставить пустой строкой. Второй же аргумент следует передать заголовок виджета, рекомендуется его брать из файла локализации - чтобы ваш виджет мог работать в других языках. После получения шапки создаем контент для виджета, в конце к которому добавляем GetAfterWidget - чтобы закрыть html теги, открытые ранее в GetBeforeWidget. Все - ваш виджет готов к употреблению. После добавления виджета он появится в списке виджетов, где его можно будет свободно перемещать между сайтбарами, так и внутри одного сайтбара. Теперь при смене темы в блоголёте оформление всех виджетов подстроится под новую тему - будут заново сгенерированы шапки и окончания виджетов так, как это предусматривалось создателем темы

Следует также соблюдать еще одно очевидное правило - в методе Uninstall вашего класса обязательно добавьте пару строк:


  $Template = &TTemplate::Instance();
  $Template->DeleteWidget(get_class($this));

Это позволит в случае удаления вашего плагина из блоголёта также и удалить ваш виджет из списка виджетов.