Переписываю по-взрослому модуль на 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: Если  что не так - пишите в коменты.

RSSAdd to Google

Обсуждение:

Как вам материальчик? *



















Тема:

Мысль:

Как звать-то:

Почта:

PS: Комментарии публикуются только после проверки модератором.

PPS: E-mail'ы не публикуются.

* обязательные поля