Новый модуль WrapperBlocks

Главные вкладки

Аватар пользователя olk olk 15 января 2009 в 13:21


Обновление:
Версия обновлена!
Теперь одним Врап-блоком можно определить несколько блоков,
для этого необходимо определить переменные $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);
}

}

?>
ВложениеРазмер
Иконка пакета block_wrapper.zip6.67 КБ

Комментарии

Аватар пользователя olk olk 10 ноября 2015 в 11:46

Ну мне казалось, что мотивацию я объяснил Smile
Вот в качестве бонуса 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->formatFALSE);
  
//$query = '';
  
$query comment_new_page_count($comment->cnt1$comment);
  
$num_comments '';
  if(
$is_all_comments == || $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 == ) {
  
$new comment_num_new($comment->nid);
  if(!empty(
$new)){
  
$num_comments .= '&nbsp;/&nbsp;<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>';
  }

  

$prefix '';
  if(
$is_user == || $is_date == 1) {
      
$prefix .= '<div class="last-comments-user-date">';
      if(
$is_user == ) {
      
$prefix .= '<strong>'.theme('username',$comment).':&nbsp;</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);
 }
}
}
?>
Аватар пользователя olk olk 10 ноября 2015 в 11:46

WrapBlock profile

Данный Врап-блок формирует два блока:
1. Блок вывода профиля автора материала
2. Блок вывода профиля залогиненого пользователя
Первый блок отличается от стандартного (формируемого модулем profile),
проверкой на анонимуса - как автора материала (что в стандартном блоке приводет к некорректной ссылке на полный профиль пользователя)
Для корректной работы блоков необходимо, что бы был задействован стандартный модуль profile а так-же произведена настройка блоков на вывод нужных полей.