Обновление:
Версия обновлена!
Теперь одним Врап-блоком можно определить несколько блоков,
для этого необходимо определить переменные $info,$cache и $title как массивы,
и обработку блоков определять в зависимости от параметра $delta.
$delta - это внутренняя дельта врап-блока равная индексу в элементе массива $info;
т.е. 0 , 1 ...
Более подробную информацию можно получить на сайте http://www.hotel-prog.ru/wrap-blocks
Обновление:
Версия обновлена, в шаблон описания блока добавлена
Необязательная функция init.
Вызывется из block_wrapper при инициализации модуля - hook_init()
Вызов данной функции произойдет если данный блок виден на данной странице.
Это может быть полезным например для вызова drupal_add_js или других действиях
для инициализации блока.
WrapperBlocks - модуль формирования блоков
ОПИСАНИЕ
Давно озадачился мыслью, как хранить и управлять своими PHP-сниппетами. Хранить их в
базе не совсем кошерно, можно хранить в файлах и вызывать через Include, то же есть
определенные недостатки, поэтому собрался и написал не большой модуль WrapperBlocks.
Суть модуля в том, что он предоставляет Друпалу стандартные блоки, содержимое которых,
формируется PHP-сниппетом оформленным определенным образом.
Т.е. вы оформляете сниппет по определенному шаблону, сохраняете шаблон в файле с
определенным именем, бросаете этот файл в поддиректорию block-extra в директории модуля
и далее стандартными методами друпала размещаете этот блок в нужном регионе.
Я не знаю, возможно, такой модуль уже есть (я честно говоря не искал), но может, будет
кому полезно.
Маленькое замечание: если формат шаблона приживется, то можно будет обмениваться сниппетами
в данном формате, и устанавливать их с минимальными усилиями.
Поиск ошибок и пожелания по улучшению модуля приветствуются.
ИНСТАЛЛЯЦИЯ
1. Распакуйте модуль в директорию sites/all/modules
2. Включите модуль "WrapperBlocks" (Administer -> Site building -> Modules (admin/build/modules))
3. Настройте на странице конфигурации доступность используемых блоков
Administer -> Site configuration -> Wrapper Blocks (admin/settings/block_wrapper)
4. Добавьте файл(ы) с определением ваших блоков в директорию sites/all/modules/block_wrapper/block-extra
(Файлы должны иметь расширение .inc)
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
1. Формат файла описания блока можно посмотреть в тестовом файле template_block.inc
ПРЕДУПРЕЖДЕНИЯ
1. Я не уверен будет ли это работать с PHP версии ниже 5.0
2. Это не будет работать на Drupal 5.x и ниже, но после не значительных переделок,
я думаю, это можно будет заставить работать на D5
3. После добавления нового файла с описанием блока в директорию block-extra повторите настройку доступности блоков на странице конфигурации
Administer -> Site configuration -> Wrapper Blocks (admin/settings/block_wrapper)
---
Автор Ковальчук Олег, псевдоним olk на Drupal.ru (Helg на drupal.org)
http://www.hotel-prog.ru/
Ну и шаблон описания блока (по сути он представляет собой небольшой класс, по имени совпадающий с наименованием файла (без расширения))
<?php
/*
* file: template_block.inc
* Шаблон блока
* наименование класса должно совпадать с наименованием файла (без расширения)
* соответственно в наименование файла не должно быть символов недопустимых
* в наименовании классов php (таких как - + и т.п
* Кроме того расширение файла дожно быть строго inc
*/
class template_block {
var $cache = BLOCK_CACHE_GLOBAL;
/**
* The block should not get cached. This setting should be used:
* - for simple blocks (notably those that do not perform any db query),
* where querying the db cache would be more expensive than directly generating
* the content.
* - for blocks that change too frequently.
**** BLOCK_NO_CACHE
* The block can change depending on the roles the user viewing the page belongs to.
* This is the default setting, used when the block does not specify anything.
**** BLOCK_CACHE_PER_ROLE
* The block can change depending on the user viewing the page.
* This setting can be resource-consuming for sites with large number of users,
* and thus should only be used when BLOCK_CACHE_PER_ROLE is not sufficient.
**** BLOCK_CACHE_PER_USER
* The block can change depending on the page being viewed.
**** BLOCK_CACHE_PER_PAGE
* The block is the same for every user on every page where it is visible.
**** BLOCK_CACHE_GLOBAL
*/
var $title;
var $info;
/*
* Необязательный конструктор, Инициализирует Заголовок блока и Название блока в списке блоков
* вы можете их проинициализировать сразу
* Например var $title = 'test', но при этом вы не сможете использовать функцию t()
*/
function __construct() {
$this->title = t('Template block title');
$this->info = t('Template block info');
}
/*
* Необязательная функция init
* Вызывется из block_wrapper при инициализации модуля - hook_init()
* Вызов данной функции произойдет если данный блок виден на данной странице
* Это может быть полезным например для вызова drupal_add_js или других действиях
* для инициализации блока
*/
function init() {
}
/*
* Необязательная функция генерации дополнительных параметров в форме настройки блока
* возвращает форму которрая будет добавлена в форму настройки блока
*/
function get_settings(){
$form = array();
$form['block_wrapper_template_block_param'] = array(
'#type' => 'select',
'#title' => t('Count print strings'),
'#default_value' =>variable_get('block_wrapper_template_block_param',3),
'#options' => array(1,4,8,12,16,20),
'#description' => t('Inmput number count strings, for print into block.'),
);
return $form;
}
/*
* Необязательная функция сохранения дополнительных параметров в форме настройки блока
* в качестве парметра пинимает массив значений формы настройки блока
*/
function set_settings($edit) {
variable_set('block_wrapper_template_block_param',$edit['block_wrapper_template_block_param']);
}
/*
* Относительно не обязательная :) функция определения контекста блока.
* Если вы ее не определите, то ошибки не будет, но и блок соответственно выводиться не будет
* Собственно эта функция и есть ваш сниппет
* Важное отличие от PHP-сниппета записываемого в обычный блок !!!
* Вы ничего не должны выводить в данной функции (при помощи print или echo),
* вы должны сформировать контент блока и вернуть его из этой функции
*/
function content() {
/* получим значение сохраненное при настройке данного блока */
$options = array(1,4,8,12,16,20);
$number = $options[variable_get('block_wrapper_template_block_param',3)];
$items = array();
/*
* Формируем массив строк
*/
for ($i = 1; $i <= $number ; $i++) {
$items[] = 'Template_block test string '.$i;
}
/*
* Возвращаем контент блока
*/
return theme('item_list',$items);
}
}
?>
Вложение | Размер |
---|---|
![]() | 6.67 КБ |
Комментарии
Смысл, чтоб еще добавить записей в таблицу variables?
Мое мнение - это велосипед на гусеничном ходу.
Ну мне казалось, что мотивацию я объяснил
Вот в качестве бонуса WrapBlock - прямого эфира - все что нужно сделать, это распаковать архив в директорию block-extra, модуля и в настройках появившегося блока подогнать его под себя и разместить в нужном регионе
<?php
/*
* file: last_comments.inc
* WrapBlock last_comments
* Показывает последние комментарии
* со ссылкой на этот комментарий (с учетом перехода на правильную страницу при многостраничном комментарии)
* в настройках можно указать количество показываемых комментариев
* Показывать ли автора и дату комментария
* Вид даты комментария (Default,small,medium,large,interavl)
* Показывать общее количество комментариев
* Показывать количество новых комментариев (для зарегистрированных пользователей)
* Если установлен модуль ccfilter то во всплывающем окне будет показано содержание последнего комментария
* Eсли вы включили в настройках показ новых комментариев, то переменную
* $caсhe лучше установить в BLOCK_CACHE_PER_USER
*/
class last_comments {
var $cache = BLOCK_CACHE_GLOBAL;
var $title;
var $info;
function __construct() {
$this->title = 'Последние комментрии';
$this->info = 'Последние комментрии (WrapBlock)';
}
private function
_get_param() {$param =variable_get('block_wrapper_last_comments',array());
$p = array(
'count_comments' => isset($param['count_comments'])?$param['count_comments']: 3,
'is_user' => isset($param['is_user'])?$param['is_user']: 1,
'is_date' => isset($param['is_date'])?$param['is_date']: 1,
'format_date' => isset($param['format_date'])?$param['format_date']: 0,
'is_all_comments' => isset($param['is_all_comments'])?$param['is_all_comments']: 1,
'is_new_comments' => isset($param['is_new_comments'])?$param['is_new_comments']: 1,
);
return $p;
}
function
get_settings(){$form = array();
$param = $this->_get_param();
$form['block_wrapper_last_comments']['count_comments'] = array(
'#type' => 'select',
'#title' => 'Количество комментариев в блоке',
'#default_value' =>$param['count_comments'],
'#options' => array(1,4,8,12,16,20,24),
'#description' => 'Выберите максимальное количество комментариев в выводимом блоке.'
);
$form['block_wrapper_last_comments']['is_user'] = array(
'#type' => 'checkbox',
'#title' => 'Показывать автора комментария',
'#default_value' => $param['is_user'],
);
$form['block_wrapper_last_comments']['is_date'] = array(
'#type' => 'checkbox',
'#title' => 'Показывать дату комментария',
'#default_value' => $param['is_date'],
); $form['block_wrapper_last_comments']['format_date'] = array(
'#type' => 'select',
'#title' => 'Формат даты',
'#default_value' => $param['format_date'],
'#options' => array(0=>t('Default'),1=>t('Small'),2=>t('Medium'),3=>t('Large'),4=>t('Interval')),
'#description' => 'Выберите выводимый формат даты.',
);
$form['block_wrapper_last_comments']['is_all_comments'] = array(
'#type' => 'checkbox',
'#title' => 'Показывать общее количество комментариев',
'#default_value' => $param['is_all_comments'],
);
$form['block_wrapper_last_comments']['is_new_comments'] = array(
'#type' => 'checkbox',
'#title' => 'Показывать количество новых комментариев',
'#default_value' => $param['is_new_comments'],
);
return
$form;}
function
set_settings($edit) {variable_set('block_wrapper_last_comments',$edit);
if(module_exists('ccfilter')) {
$js = '$(".ccfilter.tooltip-l-comments").tooltip({showURL: false, extraClass: "l-comments", showBody: " + "});';
$var = variable_get('ccfilter_filter_tooltip_rule','');
if( !strpos($var,$js) ){
$var .=$js;
variable_set('ccfilter_filter_tooltip_rule',$var);
cache_clear_all('variables', 'cache');
}
}
}
function
content() {$options = array(1,4,8,12,16,20,24);
$param = $this->_get_param();
$count_comments = $options[$param['count_comments']];
$is_user = $param['is_user'];
$is_date = $param['is_date'];
$fd = array('','small','medium','large','interval');
$format_date = $fd[$param['format_date']];
$is_all_comments = $param['is_all_comments'];
$is_new_comments = $param['is_new_comments']; $result=db_query("select c.cid,c.cnt,cs.*,n.title,n.type from node n inner join (
select DISTINCT(nid) as nid,max(cid) as cid,count(cid) as cnt
from comments where status=0 group by nid order by cid desc,nid desc limit 0,".$count_comments.
") as c on c.nid=n.nid inner join comments cs ON cs.cid=c.cid WHERE n.status=1");
$items=array();
while($comment=db_fetch_object($result)){
$comment->comment = check_markup($comment->comment, $comment->format, FALSE);
//$query = '';
$query = comment_new_page_count($comment->cnt, 1, $comment);
$num_comments = '';
if($is_all_comments == 1 || $is_new_comments == 1) {
$num_comments .= '<div class="last-comments-num-comments>"';
if($is_all_comments == 1) {
$num_comments .= '<span class="last-comments-all-comments">'.
l('Всего комментариев : '.$comment->cnt,"node/$comment->nid",
array(
'query' => $query,
'fragment' => 'comment-'.$comment->cid,
'html' => TRUE,
'attributes'=>array('title'=>'Перейти к последнему комментарию','class'=>'ccfilter tooltip')
)
).'</span>';
}
if(
$is_new_comments == 1 ) {$new = comment_num_new($comment->nid);
if(!empty($new)){
$num_comments .= ' / <span class="new">'.
l('Новых : '.$new,"node/$comment->nid",
array(
'query' => comment_new_page_count($node->comment_count, $new, $node),
'fragment' => 'new',
'html' => TRUE,
'attributes'=>array('title'=>'Перейти к первому новому комментарию','class'=>'ccfilter tooltip new')
)
).'</span>';
}
}
$num_comments .= '</div>';
}
if($is_user == 1 || $is_date == 1) {
$prefix .= '<div class="last-comments-user-date">';
if($is_user == 1 ) {
$prefix .= '<strong>'.theme('username',$comment).': </strong>';
}
if( $is_date == 1) {
if($format_date == 'interval'){
$prefix .= t('!time ago', array('!time' => format_interval(time() - $comment->timestamp)));
}
else {
$prefix .= format_date($comment->timestamp,$format_date);
}
}
$prefix .= '</div>';
}
if(module_exists('ccfilter')) {
$ccfilter_tooltip = $prefix.' + '.$comment->comment;
}
else {
$ccfilter_tooltip = 'Перейти к последнему комментарию';
}
$title=l($comment->title, "node/$comment->nid",
array(
'query'=>$query,
'fragment' => 'comment-'. $comment->cid,
'html' => TRUE,
'attributes'=>array('title'=>$ccfilter_tooltip,'class'=>'ccfilter tooltip-l-comments')
)
);
$items[] = $prefix.$title.$num_comments;
}
if(count($items)){
return theme('item_list',$items);
}
}
}
?>
WrapBlock profile
Данный Врап-блок формирует два блока:
1. Блок вывода профиля автора материала
2. Блок вывода профиля залогиненого пользователя
Первый блок отличается от стандартного (формируемого модулем profile),
проверкой на анонимуса - как автора материала (что в стандартном блоке приводет к некорректной ссылке на полный профиль пользователя)
Для корректной работы блоков необходимо, что бы был задействован стандартный модуль profile а так-же произведена настройка блоков на вывод нужных полей.