Переписываю по-взрослому модуль на Drupal для управления фильтрами вьюса
Вот и пришло время переписать по-взрослому ранее написанный модуль на Drupal для управления фильтрами вьюса.
Добавлю более правильную интеграцию в систему Drupal и возможность пользователю настроить модуль.
Что модуль будет делать: будет для одного конкретного вьюса делать из него почти два. На первом этапе нужно оставить два их четырёх заэкспоуженых фильтра и вывалить соглашение по пользованию сайта в футере вьюса. После принятия пользователем соглашения показать полный вьюс со всеми фильтрами, причём первый один или два требуется немного подчистить. Плюс на всё это накладыается многоязыность: соглашение существует в количестве, равном количеству языков на сайте. И нужно дать пользователю возможность это самое соглашение редактировать не пуская его в дебри views'ов, ибо сломать там чего как два пальца об асфальт.
Итак. Вот собственно готовый модуль с коментами с переименованными полями в целях некоторой секюрности и большей наглядности.
Hint: для просмотра кода справа за экраном используйте горизонтальный скролинг или клик на код и стрели влево-вправо.
<?php
/**
* Display help and module information
* @param path which path of the site we're displaying help
* @param arg array that holds the current path as would be returned from arg() function
* @return help text for the path
*/
function mydisclamer_help($path, $arg) { //Выводим помощь по модулю
$out = ''; //declare your output variable
switch ($path) {
case 'admin/help#mydisclamer':
$out.= '<p>'. t("The My Disclaimer module help disclamer page work at My web-site") .'</p>';
break;
}
return $out;
}
/**
* Implementation of hook_perm().
*/
function mydisclamer_perm() { //Разбираюсь с правами доступа
return array('administer mydisclamer');
}
/**
* Implementation of hook_menu().
*/
function mydisclamer_menu() { //Создаю менюшку для настройки своего модуля
$items = array();
$items['admin/settings/mydisclamer'] = array(
'title' => 'My Disclamer',
'description' => 'Set Disclaimer texts',
'page callback' => 'drupal_get_form',
'page arguments' => array('mydisclamer_admin'),
'access arguments' => array('access administration pages'),
'type' => MENU_NORMAL_ITEM,
);
return $items;
}
/**
* Implementation of hook_admin().
*/
function mydisclamer_admin() { //Функция для настройки моего модуля
$form = array();
$aLanguage = language_list(); //Добываю список языков
if(count($aLanguage)>0){
//Добываю список нод типа Page для вывода пользователю в <SELECT>
$sql = "SELECT node.title, node.nid FROM {node} WHERE node.type = 'page' ORDER BY node.title";
$result = db_query($sql);
$aNode=array(''=>'');
while ($node = db_fetch_object($result)) {
$aNode[$node->nid]=$node->title;
}
foreach($aLanguage as $key=>$aValue){
if($aValue->enabled!=1){ //Отключённые языки игнорирую
unset($aLanguage[$key]);
}else{
//Формирую выпадающий список на базе списка нод, сделанного ранее
$form['mydisclamer_node_'.$key] = array(
'#type' => 'select',
'#title' => t($aValue->name.' disclaimer'),
'#default_value' => variable_get('mydisclamer_node_'.$key,0),
'#options'=>$aNode,
'#description' => t('Node with Disclaimer text in '.$aValue->name.' ('.$aValue->native.')'),
'#required' => TRUE,
);
//Более ранний вариант, где юзер тупо вбивал ID'шники ноды
// $form['mydisclamer_node_'.$key] = array(
// '#type' => 'textfield',
// '#title' => t('Node ID'),
// '#default_value' => variable_get('mydisclamer_node_'.$key,0),
// '#size' => 2,
// '#maxlength' => 5,
// '#description' => t('Node ID with Disclaimer text in '.$aValue->name.' ('.$aValue->native.')'),
// '#required' => TRUE,
// );
}
}
}
return system_settings_form($form);
}
/**
* Implementation of module_form_views_exposed_form_alter().
*/
function mydisclamer_form_views_exposed_form_alter(&$form, $form_state) { //Перерабатываю заэкпоженный вьюс
if($form_state['view']->name=='fund_products'){
foreach($form['term_node_field_name_1']['#options'] as $key=>$value){ //fix taxonomy translation
$form['term_node_field_name_1']['#options'][$key]=t($form['term_node_field_name_1']['#options'][$key]);
}
foreach($form['field_name_2']['#options'] as $key=>$value){ //fix taxonomy translation
$form['field_name_2']['#options'][$key]=t($form['field_name_2']['#options'][$key]);
}
if(!isset($form_state['view']->exposed_input['term_node_field_name_1']) //Вьюс юзер ещё не видел - показать disclaimer
or !isset($form_state['view']->exposed_input['field_name_2'])
or $form['term_node_field_name_1']['#default_value']==$form_state['view']->exposed_input['term_node_field_name_1']
or $form['field_name_2']['#default_value']==$form_state['view']->exposed_input['field_name_2']){
//Выкинуть остальные фильтры, пока не принят disclaimer
unset($form['field_name_3']);
unset($form['#info']['filter-field_name_3']);
unset($form['field_name_4']);
unset($form['#info']['filter-field_name_4']);
//Добываю вьюс
$view = views_get_current_view();
//Устанавливаю нужный мне display
$view->set_display('page_1');
//Текущий язык
global $language;
//Достаю параметры моего модуля для текущего языка
$nNodeId=variable_get('mydisclamer_node_'.$language->language,0);
if($nNodeId>0){ //Есть чё?
$disclamer=node_load($nNodeId);
if(isset($disclamer->title)){ //Есть чё? Переписываю заголовок
$view->display_handler->set_option('title', $disclamer->title);
}
if(isset($disclamer->body)){ //Есть чё? Запихиваю соглашение в футер
$view->display_handler->set_option('footer', $disclamer->body);
//Ставлю флаг вьюсу, что в футере чего-то есть
$view->display_handler->set_option('footer_empty', 1);
}
}
//Переписываю вывод субмита (не забываю перевести строку в переводе интерфейса друпала)
$form['submit']['#value'] = t('Disclaimer accepted');
}else{ //disclamer is applied successufully
foreach($form['term_node_field_name_1']['#options'] as $key=>$value){ //оставить только текущий вариант выбора
if($key!=$form_state['view']->exposed_input['term_node_field_name_1']){
unset($form['term_node_field_name_1']['#options'][$key]);
}
}
if($form_state['view']->exposed_input['term_node_field_name_1']!=36){
//Если юзер выбрал не самый крутой вариант, то оставляю только текущий вариант выбора
foreach($form['field_name_2']['#options'] as $key=>$value){
if($key!=$form_state['view']->exposed_input['field_name_2']){
unset($form['field_name_2']['#options'][$key]);
}
}
}
}
}
}
PS: Если что не так - пишите в коменты.




Обзор AgeStar NSB3AS1T NAS для 3.5" SATA HDD
Комментариев и оценок: 186
Обзор AgeStar NSB3AS1T NAS для 3.5" SATA HDD - сетевого хранилища на базе 3.5" SATA HDD с возможностью подключения по USB. 10/100 Mbit, SATA 3.5"
AgeStar FUBCP USB2.0 to IDE/SATA Adapter
Комментариев и оценок: 99
AgeStar FUBCP - подключение IDE или SATA 2.5",3.5" или 5.25" устройств через USB
Обзор жесткого диска HDD 2ТБ Western Digital WD20EARS
Комментариев и оценок: 74
Краткий обзор жесткого диска HDD 2ТБ Western Digital WD20EARS-00MVWB0 с фотографиями и тестами производительности.Многофункциональное устройство Canon LaserBase MF3228
Комментариев и оценок: 57
Многофункциональное устройство Canon LaserBase MF3228. Описание, впечатления от работы, ссылка на драйвера.
AgeStar SUB2O1 2.5" SATA External Enclosure
Комментариев и оценок: 54
Обзор с картинками и тестами AgeStar SUB201 - внешней USB коробки для 2.5" SATA винчестеров.