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

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

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

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

и так далее.

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

Комментарии

Аватар пользователя jason32 jason32 17 июня 2009 в 11:45

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

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

Аватар пользователя gorr gorr 17 июня 2009 в 12:12

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

Аватар пользователя jason32 jason32 17 июня 2009 в 15:25

"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] => Жилая недвижимость
                        )

                )

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

Аватар пользователя jason32 jason32 17 июня 2009 в 16:36

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

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

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

Аватар пользователя goodboy goodboy 17 июня 2009 в 21:48

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

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

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

Аватар пользователя Char0Day Char0Day 22 июня 2009 в 6:58

В 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.
И никакого яваскрипт не нужно в данном случае.

Аватар пользователя Char0Day Char0Day 10 ноября 2010 в 4:00

Тут у человека возник вопрос, выкладываю обновленный код
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 необходимого словаря.