Таксономия и псевдоподпункты

16 июня 2009 в 18:48
Аватар пользователя jason32 jason32 0 10

Стандартная ситуация - есть двух уровневый словарь:
Первый
-подпервый
-подпервая
Второй
-подвторой
-подвторая
Третий
-
-

и так далее.

Делается фильтр по этому словарю через Views. Необходимо запретить выбирать словари первого уровня( так как это фактически только контейнеры для боолее удобного представления таксономии) как при вводе материала, так и при его фильтрации. Пробовал через form_alter, но что-то не вижу возможности - там тупо одноуровневый уже сформированный массив, где ключи - значения, а уровень вложенности показывает только количество минусов перед словом( "-подпервый","- -подподпервый" и тд ). Как сделать Верхний уровень словаря невыбираемым?

Комментарии

"gorr" wrote:
В form_alter заменяете массив опций для селекта термов на свой.

Это и так понятно. На какой свой? В каком формате надо написать пункт, чтобы его нельзя было выбрать?

17 июня 2009 в 11:45

Если в качестве массива #options в селект передать массив двойной вложенности, то есть если опции верхнего уровня сделать массивами, то элемент select воспримет это как команду сформировать optgroup - контейнеры для options, а в качестве опций в контейнер разместит вложенные в него элементы.
http://www.htmlbook.ru/html/optgroup.html
http://api.drupal.ru/api/function/form_select_options/6

17 июня 2009 в 12:12

"gorr" wrote:
Если в качестве массива #options в селект передать массив двойной вложенности, то есть если опции верхнего уровня сделать массивами, то элемент select воспримет это как команду сформировать optgroup - контейнеры для options, а в качестве опций в контейнер разместит вложенные в него элементы.
http://www.htmlbook.ru/html/optgroup.html
http://api.drupal.ru/api/function/form_select_options/6[/quote]

            [0] => stdClass Object
                (
                    [option] => Array
                        (
                            [1] => Жилая недвижимость
                        )

                )

И во что превратить подобный код? Вот этот элемент кручу верчу - всё равно не выходит.

17 июня 2009 в 15:25

"Goodboy" wrote:
Попробовать применить свойство disabled - http://htmlbook.ru/html/option.html[/quote]
Quote:
Описание
Блокирует элемент списка для его выбора. Не поддерживается браузером Internet Explorer.

уже не походит ((

Вроде временно решил, заменил на  [Жилая недвижимость] => Array() , вроде работает, но конечно это костыль

17 июня 2009 в 16:36

"jason32" wrote:
Цитата:
Описание
Блокирует элемент списка для его выбора. Не поддерживается браузером Internet Explorer.

уже не походит ((

Народ лечит это дело яваскриптом: http://elmicoxcodes.blogspot.com/2007/05/activating-option-disabled-in-i..., http://hulinada.livejournal.com/2705.html

17 июня 2009 в 21:48

В template.php

<?php
function НазваниеМодуля_form_alter(&$form$form_state$form_id) {
switch (
$form_id) {
    case 
'Ид_формы':
    
$op1=array();
    
$op2=array();
    
$op3=array();
    
$rootterms=array();
    
//$tree =taxonomy_get_tree(_image_gallery_get_vid(),$max_depth=0);
    
$tree =taxonomy_get_tree($vid_словаря,$max_depth=0);
    foreach (
$tree as $term) {
        if (
$term->depth<1){
            
$rootterms[$term->name]=$term->tid;
        }
    }
    foreach(
$rootterms as $rootterm => $rvalue){
        
$tree =taxonomy_get_tree(_image_gallery_get_vid(),$parent=$rvalue);
        foreach(
$tree as $term) {
            
$op3['option'][$term->tid]=$term->name;
            
$op2[]=(object)$op3;
            unset(
$op3);
        }
        
$op1['------']="-----"//добавил пустышку
        
$op1[$rootterm]= $op2;
        
//print krumo_ob($op2);
        
unset($op2);
    }
        
//записываем в массив #options наши значения
    
$form['taxonomy']['$vid_словаря']['#options']=$op1
    break;
    }
 }
?>

Вуаля. У меня работает.
Код неоптимален, надо циклов поменьше и промежуточные массивы поубирать. Ну и недавно я в друпале,
возможно, можно красивше сделать.
Термины без предков становятся не option, а optgroup, соответственно их нельзя выбрать.
У меня работает в форме добавления изобрадения в модуле image.
И никакого яваскрипт не нужно в данном случае.

22 июня 2009 в 6:58

Тут у человека возник вопрос, выкладываю обновленный код
UPD:

Иногда необходимо запретить выбор корневых терминов словаря в форме добавления материала. Тогда в файл template.php вашей темы нужно добавить следующий код:

function имятемы_theme() {
    return array(
        'gallery_node_form'=> array(
                    // Forms always take the form argument.
            'arguments' => array('form' => NULL),
        ),     
        'comment_form'=> array(
                    // Forms always take the form argument.
            'arguments' => array('form' => NULL),
        ),

        'Ид_необходимой_формы'=> array(
                    // Forms always take the form argument.
            'arguments' => array('form' => NULL),
        ),
    );
}

//function имятемы_ИД_формы($form) {
function имятемы_gallery_node_form($form) {
    $op1=array();
    $op2=array();
    $op3=array();
    $rootterms=array();
    $vocvid=6; //здесь ИД_необходимого_словаря;
    $tree =taxonomy_get_tree($vocvid,$max_depth=0);
    foreach ($tree as $term) {
        if ($term->depth<1>name]=$term->tid;
        }
    }
    foreach($rootterms as $rootterm => $rvalue){
        $tree =taxonomy_get_tree( $vocvid,$parent=$rvalue);
        foreach($tree as $term) {
            $op3['option'][$term->tid]=$term->name;
            $op2[]=(object)$op3;
            unset($op3);
        }
        $op1['------']="-----"; //добавил пустышку
        $op1[$rootterm]= $op2;
        unset($op2);
    }
        //записываем в массив #options наши значения
    $form['taxonomy']['$vocvid']['#options']=$op1;

    $output .= drupal_render($form);
    return $output;
}

Ну и конечно не забудьте поменять "Имя_Темы" на название Вашей темы, "ИД_Формы" на конкретный идентификатор формы и подставить в переменную $vocvid vid необходимого словаря.

10 ноября 2010 в 4:00