powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Checkbox в Tree Region (Apex 4)
9 сообщений из 9, страница 1 из 1
Checkbox в Tree Region (Apex 4)
    #36865108
lokift
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В финальном релизе Apex 4 отсутствует checkbox tree template (а в Early Adopter был). Видимо решили его в релиз не включать.

В Apex 3 можно было решить эту проблему примерно так: APEX_ITEM.CHECKBOX(...) as name

Кто знает как checkbox вставить в дерево в Apex 4?
...
Рейтинг: 0 / 0
Checkbox в Tree Region (Apex 4)
    #36868164
noname11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lokift,

Реализовать как плагин с использованием JQuery плагина.
...
Рейтинг: 0 / 0
Checkbox в Tree Region (Apex 4)
    #36877832
sanya_88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно уточнить , как это сделать?
...
Рейтинг: 0 / 0
Checkbox в Tree Region (Apex 4)
    #36877840
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanya_88,

STWF .
...
Рейтинг: 0 / 0
Checkbox в Tree Region (Apex 4)
    #36879750
lokift
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот реализация такого плагина для моей ситуации (вариант пока что ток тестовый, писалось на коленке и под мою задачу, надеюсь кому-нибудь поможет):
Я решил для такого дерева использовать родную библиотеку jstree .

Создаем плагин с типом Region.
Render Function Name: apexplugin_render
Attributes: Region Source is SQL Statement
Source плагина:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
FUNCTION apexplugin_render (
    p_region              IN apex_plugin.t_region,
    p_plugin              IN apex_plugin.t_plugin,
    p_is_printer_friendly IN BOOLEAN )
  RETURN apex_plugin.t_region_render_result
IS
  l_sourceSQL       apex_application_page_regions.region_source%type    := p_region.source;
  sqlHandler APEX_PLUGIN_UTIL.t_sql_handler;
  RowSet APEX_PLUGIN_UTIL.t_column_value_list;
  l_onload_code LONG;
  lvl NUMBER;
  i NUMBER;
BEGIN
  IF apex_application.g_debug THEN
    apex_plugin_util.debug_region ( p_plugin => p_plugin, 
                                    p_region => p_region, 
                                    p_is_printer_friendly => p_is_printer_friendly );
  END IF;
  sqlHandler := APEX_PLUGIN_UTIL.GET_SQL_HANDLER ( p_sql_statement => l_sourceSQL, 
                                                   p_min_columns =>  2 , 
                                                   p_max_columns =>  100 , 
                                                   p_component_name => NULL );
  APEX_PLUGIN_UTIL.PREPARE_QUERY ( sqlHandler );
  RowSet := APEX_PLUGIN_UTIL.GET_DATA ( sqlHandler );

  lvl :=  0 ;
  i :=  1 ;
  l_onload_code := l_onload_code || '<div id="tree"><ul>';

  FOR row IN  1 ..RowSet( 1 ).count  -- Number of rows
  LOOP
    IF lvl <>  0  THEN
    IF lvl < RowSet( 2 )(row) THEN
      l_onload_code := l_onload_code || '<ul>';
    ELSIF lvl = RowSet( 2 )(row) THEN
      l_onload_code := l_onload_code || '</li>';       
    ELSIF lvl > RowSet( 2 )(row) THEN
      l_onload_code := l_onload_code || '</ul>';
    END IF;
    END IF;

    IF RowSet( 6 )(row) =  1  THEN
      l_onload_code := l_onload_code || '<li id="' || RowSet( 4 )(row)  || '" class="' || RowSet( 5 )(row) || '" rel="project">';
    ELSE
      l_onload_code := l_onload_code || '<li id="' || RowSet( 4 )(row)  || '" class="' || RowSet( 5 )(row) || '" rel="root">';
    END IF;

    l_onload_code := l_onload_code || '<a href="#">' || RowSet( 3 )(row) || '</a>';
    lvl := RowSet( 2 )(row);
    i := i +  1 ;
  END LOOP;

  l_onload_code := l_onload_code || '</ul<>></div>';

  sys.htp.p(l_onload_code);

  apex_css.add_file( p_name       => 'style',
                     p_directory  => apex_application.g_image_prefix || 'libraries/jquery-jstree/1.0rc2/themes/default/',
                     p_version    => null);

  apex_javascript.add_library ( p_name       => 'jquery.jstree', 
                                p_directory  => apex_application.g_image_prefix || 'libraries/jquery-jstree/1.0rc2/',
                                p_version    => null);

  sys.htp.p('<script type="text/javascript">
        $(function () {
            $("#tree").jstree({
                "types" : {
                    "valid_children" : [ "root" ],
                    "types" : {
                        "root" : {
                            "icon" : {
                                "image" : "#IMAGE_PREFIX#libraries/jquery-jstree/1.0rc2/_demo/folder.png"
                            },                        
                            "valid_children" : [ "default" ],
                            "max_depth" : 2,
                            "hover_node" : false,
                            "select_node" : function () {return false;}
                        },
                        "project" : {
                            "icon" : {
                                "image" : "#IMAGE_PREFIX#libraries/jquery-jstree/1.0rc2/_demo/file.png"
                            },                        
                            "valid_children" : [ "default" ],
                            "max_depth" : 2,
                            "hover_node" : false,
                            "select_node" : function () {return false;}
                        },                        
                        "default" : {
                            "valid_children" : [ "default" ]
                        }
                    }
                },
                "themes" : { "theme" : "default" },
                "plugins" : [ "themes", "html_data", "checkbox" , "ui", "types"]
            });
        });
         </script>');
  RETURN NULL;
END;

Запрос для отчета:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT CASE WHEN connect_by_isleaf =  1  THEN  0 
            WHEN LEVEL =  1              THEN  1 
            ELSE                           - 1 
       END AS status, 
       LEVEL,
       P.PRO_NAME AS title,
       P.PRO_ID AS VALUE,
       (SELECT 'jstree-checked' FROM PROJECTS_WORKERS PW, WORKERS W WHERE PW.PRO_ID = P.PRO_ID AND PW.WORKER_ID = W.WORKER_ID AND UPPER(W.WORKER_LOGIN) = UPPER(:APP_USER)),
       P.PRO_TYPE,
       NULL AS icon,
       NULL AS tooltip, 
       NULL AS LINK
FROM PROJECTS P
WHERE P.PRO_ENABLE =  1 
START WITH P.PRO_PARENT_ID IS NULL
CONNECT BY PRIOR P.PRO_ID = P.PRO_PARENT_ID
ORDER SIBLINGS BY P.PRO_NAME

Как видно из кода input в виде checkbox не создаем, используем расширение jstree.

Нужно засунуть нужные данные в post:

На странице создаем кнопку, на нее вешаем динамическое действие по клику, выполняем следующий javascript:

Код: plaintext
1.
2.
3.
4.
5.
$("#tree").jstree("get_checked", false, true).each(function () {
		var checkedId = this.id;
		$("<input>").attr("type", "hidden").attr("name", "f01").val(checkedId).appendTo("#tree");
});

$("#wwvFlowForm").submit();

Ну и создаем процесс After Submit:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DECLARE 

  userId NUMBER;
BEGIN
  SELECT WORKER_ID INTO userId FROM WORKERS WHERE UPPER(WORKER_LOGIN) = UPPER(:APP_USER);

  DELETE FROM PROJECTS_WORKERS WHERE WORKER_ID = userId;

  FOR i in  1 ..APEX_APPLICATION.G_F01.COUNT LOOP
      INSERT INTO PROJECTS_WORKERS (PRO_ID,WORKER_ID) VALUES (APEX_APPLICATION.G_F01(i),userId);
  END LOOP;
  
  COMMIT;

END;
...
Рейтинг: 0 / 0
Checkbox в Tree Region (Apex 4)
    #36879775
lokift
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще... Был обноружен баг =) Хотя мож я просто не разобрался до конца... Или сам где то накосячил... В общем не сабмитились те элементы которые были выделены по средством выделения родительского, сабмителся только родительский, т.е. только тот по которому кликнули.

Решил так:

В библиотеке jstree ищем функцию get_checked и исправляем:

Код: plaintext
1.
2.
3.
4.
get_checked : function (obj) {
				obj = !obj || obj === - 1  ? this.get_container() : this._get_node(obj);
 				
				return obj.find("ul li.jstree-checked"); // return obj.find("> ul > .jstree-checked, .jstree-undetermined > ul > .jstree-checked");
			}
...
Рейтинг: 0 / 0
Checkbox в Tree Region (Apex 4)
    #37049086
vetKa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может кому и пригодиться, в плагине от lokift

ELSIF lvl > RowSet(2)(row) THEN
l_onload_code := l_onload_code || '</ul>';
END IF;

надо заменить на

ELSIF lvl > RowSet(2) (row) THEN

for ii in 1 .. lvl - RowSet(2) (row) loop
l_onload_code := l_onload_code || '</ul>';
end loop;

END IF;

где RowSet(2) (row) = level.
...
Рейтинг: 0 / 0
Checkbox в Tree Region (Apex 4)
    #37250068
ArtMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поковырялся в стандартном дереве. Нашел ф-цию при помощи которой apex создает дерево (apex_builder_4_0.js). там используется только один плагин contextmenu. Никто не знает, как после создания дерева добавить плагин checkbox для использования?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Checkbox в Tree Region (Apex 4)
    #38377706
haXbat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Checkbox в Tree Region (Apex 4)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]