древовидное меню

chameleon

Новичок
древовидное меню

как построить сабж с большим количеством записей (~ 2000) и несколькими уровнями вложенности? С XML только знакомлюсь. Понял, что при использовании DOM грузится все дерево сразу, а это имхо многовато :)... как организовать динамическую подгрузку дочернего узла выбранного раздела меню? извиняйте, если вопрос слишком ламерский :)..
 

slach

Новичок
да нет, нормальный вопрос
только он скорее не по XSLT а по DHTML+XSLT
идешь на http://msdn.microsoft.com
с левой стороны менюха у них как раз так, как надо тебе сделана...

смотришь там исходинки
и читаешь этот самый MSDN до посинения на темы
MSIE Behaviors, MSXML,DOM ...
 

Sababa

Guest
там даже есть статейка как это у них сделано. только вчера читал, но уже не помню где. каталогизатор, честно говоря у них голимый.
 

chameleon

Новичок
имхо это activex. а это мне не желательно... хочется понять общий принцип. Имхо это можно как то jscript'ом грузить по частям чтоли через sax?
 

slach

Новичок
;) через SAX ничего не подгружает...
подгружают через MSXML ...

это все DOM ;)
т.е. либо как в мозилле встроенный объект JS
либо как в MSIE ActiveX объект...

по другому на СТОРОНЕ клиента не получится...
 

chameleon

Новичок
насчет структуры xml документа вообщем, видел тут трейд (о *деревьях* тоже :)...
1. вводить в каждый узел атрибут показывающий уровень данного пункта;
2. передавать иерархию именно вложенностью узлов

...какие плюсы/минусы?
 

Sababa

Guest
имхо это activex. а это мне не желательно...
если это не подходит, то забей.
дели дерево на уровни и грузи по одному уровню, как сделано на томже msdn, если клиент не умеет работать с xml.
 

stm15

Guest
помоему вы забываете что при использовании DOM (особенно при таком количестве пунктов в меню) может просто не хватить памяти. при построении дерева в DOM из файла в 1мб оперативки под это дела жрется порядка 10-12 мб. вот.
 

slach

Новичок
;) stm
гЫ... покажи ка мне мил человек менюшку, в 1Мб
к тому же идет обсуждения динамической подгрузки...

это когда грузится удаленный документ, а потом его documentElement подцепляется через appendChild к текущей открытой ноде...

причем дерево при этом савсем не надо делать полностью раскрытым...
и соответсвенно убивать чилды всех нод, которые "закрыты"
 

stm15

Guest
я может чо и не понял конечно \
но помоему дом сразу весь файл в дерево преобразует ... или нет. или может динамическая подгрузка у вас это построения нескольких небольших деревьев из разных файлов?)))
 

Дед Анвирыч

Новичок
Re: древовидное меню

Автор оригинала: chameleon
С XML только знакомлюсь.
<> "Хочу только с XML"
js+iframe+php+mysql

чем не решение. Видел пару форумов на подобии сделанных.
Каждые sub_nodes грухятся в iframe по открытию оных
 

slach

Новичок
:) Во, анвирыч дело говорит =)
Сначала делается iframe нужной высоты... и ему display:none выставляется

а при открытии...

правда к клиентскому XML это не имеет никааого отношения... скорее уже к серверному =)
 

chameleon

Новичок
Re: Re: древовидное меню

Автор оригинала: Дед Анвирыч
<> "Хочу только с XML"
js+iframe+php+mysql

чем не решение. Видел пару форумов на подобии сделанных.
Каждые sub_nodes грухятся в iframe по открытию оных
решение всегда есть :), просто мне подумалось, что древовидное меню как раз хорошо укладывается в реализацию с помощью xml+xslt... единственная проблема это подгрузка без обновления страницы (как в msdn, но только для всех браузеров), на сегодня так и не добился результата :(.. дерево при подгрузке нового узла сворачивается к своему первозданному состоянию (all collapsed :)..
PS: а ссылочки не дадите на форумы где используются iframe в таком контексте :)...
 

Дед Анвирыч

Новичок
Re: Re: Re: древовидное меню

Автор оригинала: chameleon
решение всегда есть :), просто мне подумалось, что древовидное меню как раз хорошо укладывается в реализацию с помощью xml+xslt... единственная проблема это подгрузка без обновления страницы (как в msdn, но только для всех браузеров), на сегодня так и не добился результата :(.. дерево при подгрузке нового узла сворачивается к своему первозданному состоянию (all collapsed :)..
PS: а ссылочки не дадите на форумы где используются iframe в таком контексте :)...
http://javascript.cooldev.com/scripts/cooltreepro/
Настроек куча - запоминать нод, который открыт или нет, сворачивать остальные ноды в родители при открытии какого-либо... Дохрена!
Типа за деньги вроде... ;)
Но я так пользую ... :rolleyes:
Немножко помудохаешься, прежде чем в свою пагу прикрутишь...
Там не xml. Но что-то очень похожее. Файл с данными либо генери на лету (каждый раз заново грузиться будет), либо генери при необходимости. Храни в БД и перегенирируй при обновленни. Так и базу часто не мучаешь и трафик экономишь. Я так делаю
 

chameleon

Новичок
Но я так пользую ...
как скрипт забрал? тот что на самом сайте подвязан пишет что он не полнофункциональный :(.. или работает и такой?
если есть полный вариант дай ссылочку на свой сайт, я оттуда заберу :)...
 

DMakeev

Guest
Re: Re: древовидное меню

Автор оригинала: Дед Анвирыч
<> "Хочу только с XML"
js+iframe+php+mysql

чем не решение. Видел пару форумов на подобии сделанных.
Каждые sub_nodes грухятся в iframe по открытию оных
Угу, только iframe толком не везде работают. Самолично имел проблеммы с IE6 (без патчей и апдейтов, именно то, что идет с WinXP), который их просто не видел. Было оччень весело
 

chameleon

Новичок
короче сделал php+xml+xslt (очень понравилось! настолько все гибко настраивается в шаблонах!), только реализовал все таки поэтапно, т.е. при клике на пункт меню оно заменяется потомками+ось ancestor::. имхо наилучший вариант без использования M$ фич. Все преобразования на сервере (первый шаблон преобразует линейную структуру xml которую нарисовал php из базы в дерево, второй уже в html - на клиента голый html валится - во всех брофсерах пашет :))...
я рад :)..
 

chameleon

Новичок
...кста, я и правда хочу это сделать, потому как это мой первый опыт общения с подобными технологиями, хотелось бы послушать отзывы/критику людей знающих:

XML:
Код:
<?xml version="1.0" encoding="windows-1251"?>
<root>
<nonpersonal_phones>
  <phones podrid="61000">
    <phone id="61000">1111111</phone>
    <phone id="61240">2222222</phone>
    <phone id="61190">3333333</phone>
    <phone id="61410">4444444</phone>
    <phone id="61350">5555555</phone>
    <phone id="61150">6666666</phone>
    <phone id="61230">7777777</phone>
    <phone id="61150">8888888</phone>
    <phone id="61190">9999999</phone>
    <phone id="61230">0000000</phone>
    <phone id="61220">1111222</phone>
    <phone id="61350">1111333</phone>
    <phone id="61330">1111444</phone>
    <phone id="61330">1111555</phone>
    <phone id="61220">1111666</phone>
    <phone id="61000">1111777</phone>
  </phones>
</nonpersonal_phones>
<podrs>
  <podr code="61000" v_level="root" recid="21506" kids="10" name="Дирекция_А"/>
 <podr code="61020" v_level="61000" recid="46525" kids="3" name="Отдел_А"/>
  <podr code="61100" v_level="61000" recid="46526" kids="2" name="Центр_А"/>
  <podr code="61300" v_level="61000" recid="29944" kids="7" name="Служба_А"/>
  <podr code="61700" v_level="61000" recid="29846" kids="4" name="Центр_Б"/>
  <podr code="61800" v_level="61000" recid="29851" kids="4" name="Центр_В"/>
  <podr code="61200" v_level="61000" recid="29816" kids="9" name="Центр_Г"/>
  <podr code="61030" v_level="61000" recid="29822" kids="2" name="Отдел_Б"/>
  <podr code="61050" v_level="61000" recid="29825" kids="0" name="Отдел_В"/>
  <podr code="61090" v_level="61000" recid="29826" kids="9" name="Отдел_С"/>
  <podr code="61400" v_level="61000" recid="29831" kids="15" name="Центр_Д"/>
</podrs>
<empls>
  <empl tableno="61000010" podrid="21506" recid="233820">
    <name>Фамилия_А</name>
    <lastname>Имя_А</lastname>
    <patronymic>Отчество_А</patronymic>
    <position>Должность_А</position>
    <phone>0011100</phone>
  </empl>
  <empl tableno="61000007" podrid="21506" recid="233818">
    <name>Фамилия_Б</name>
    <lastname>Имя_Б</lastname>
    <patronymic>Отчество_Б</patronymic>
    <position>Должность_Б</position>
    <phone>0022200</phone>
  </empl>
  <empl tableno="61000020" podrid="21506" recid="233821">
    <name>Фамилия_В</name>
    <lastname>Имя_В</lastname>
    <patronymic>Отчество_В</patronymic>
    <position>Должность_В</position>
    <phone>0033300</phone>
  </empl>
  <empl tableno="61000009" podrid="21506" recid="233819">
    <name>Фамилия_Г</name>
    <lastname>Имя_Г</lastname>
    <patronymic>Отчество_Г</patronymic>
    <position>Должность_Г</position>
    <phone>0044400</phone>
  </empl>
</empls>
</root>
3 запроса в php-скрипте сваливаются в xml и....ща вывалю шаблон :).. присядьте :)..
 

chameleon

Новичок
про xml:
podr = подразделение;
empl = работник;
nonpersonal_phones = определенный вид телефонных номеров (специфика базы данных) закрепленных за подразделением, а не за конкретным работником.
@v_level - указатель на @code родителя.
...
задачей xslt шаблона было сформировать древовидную структуру повторяющую иерархию подразделений и работников а так же скомпоновать несколько элементов empl различающихсяя только телефонами в один с несколькими телефонами...
короче лучше я уже его кину...

XSL:
Код:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">	
<xsl:output method="xml" encoding="Windows-1251"/>	
<xsl:key name="recid" match="/root/empls/empl" use="@recid"/>
<xsl:key name="podrid" match="/root/podrs/podr" use="@recid"/>	
<xsl:template match="/">		
<root>			
<!-- фильтр по первому уровню иерархии подразделений -->
<xsl:for-each select="/root/podrs/podr[@v_level='root' and generate-id() = generate-id(key('podrid', @recid))]">
<xsl:sort order="descending" select="@name"/>
<xsl:variable name="sect1" select="@code"/>		
<podr id="{@code}" name="{@name}" kids="{@kids}">
<xsl:apply-templates select=".">
<xsl:with-param name="sect" select="@v_level"/>	
</xsl:apply-templates>				
<!-- уровень 2 -->					
<xsl:for-each select="/root/podrs/podr[@v_level=$sect1 and generate-id() = generate-id(key('podrid', @recid))]">	
<xsl:sort order="descending" select="@name"/>
<xsl:variable name="sect2" select="@code"/>		
<podr id="{@code}" name="{@name}" kids="{@kids}">
<xsl:apply-templates select=".">
<xsl:with-param name="sect" select="@v_level"/>
</xsl:apply-templates>
<!-- уровень 3 -->
<xsl:for-each select="/root/podrs/podr[@v_level=$sect2 and generate-id() = generate-id(key('podrid', @recid))]">
<xsl:sort order="descending" select="@name"/>
<xsl:variable name="sect3" select="@code"/>
<podr id="{@code}" name="{@name}" kids="{@kids}">
<xsl:apply-templates select=".">
<xsl:with-param name="sect" select="@v_level"/>
</xsl:apply-templates>
<!-- уровень 4 -->
<xsl:for-each select="/root/podrs/podr[@v_level=$sect3 and generate-id() = generate-id(key('podrid', @recid))]">
<xsl:sort order="descending" select="@name"/>
<xsl:variable name="sect4" select="@code"/>
<podr id="{@code}" name="{@name}" kids="{@kids}">
<xsl:apply-templates select=".">
<xsl:with-param name="sect" select="@v_level"/>
</xsl:apply-templates>
<!-- уровень 5 -->
<xsl:for-each select="/root/podrs/podr[@v_level=$sect4 and generate-id() = generate-id(key('podrid', @recid))]">
<xsl:sort order="descending" select="@name"/>
<podr id="{@code}" name="{@name}" kids="{@kids}">
<xsl:apply-templates select=".">
<xsl:with-param name="sect" select="@v_level"/>	
</xsl:apply-templates>
</podr>
</xsl:for-each>
</podr>
</xsl:for-each>
</podr>
</xsl:for-each>
</podr>
</xsl:for-each>
</podr>
</xsl:for-each>
</root>
</xsl:template>	
<!-- основной шаблон обработки элементов подразделения -->
<xsl:template match="//podr">
<xsl:param name="sect"/>		
<xsl:variable name="empl" select="@recid"/>		
<xsl:variable name="code" select="@code"/>		
<empls>			
<xsl:apply-templates select="/root/empls/empl[generate-id() = generate-id(key('recid', @recid)) and @podrid=$empl]">
<xsl:sort order="ascending" select="@tableno"/>
<xsl:with-param name="emp" select="$empl"/>
</xsl:apply-templates>
</empls>
<nonpersonal_phones>
<xsl:apply-templates select="/root/nonpersonal_phones/phones/phone[@id=$code]">
<xsl:with-param name="emp" select="$code"/>
</xsl:apply-templates>
</nonpersonal_phones>
</xsl:template>	
<!-- шаблон обработки работников подразделения -->	
<xsl:template match="//empl">		
<xsl:param name="emp"/>		
<empl recid="{@recid}" tableno="{@tableno}">
<xsl:copy-of select="./name"/>			
<xsl:copy-of select="./lastname"/>			
<xsl:copy-of select="./patronymic"/>			
<xsl:copy-of select="./position"/>			
<xsl:copy-of select="key('recid', @recid)/phone"/>		
</empl>	
</xsl:template>	
<!-- шаблон обработки элементов телефонов закрепленных за подразделением -->	
<xsl:template match="/root/nonpersonal_phones/phones/phone">
<xsl:param name="emp"/>		
<xsl:copy-of select="."/>	
</xsl:template>
</xsl:stylesheet>
вот-с...тока ногами не пинайте (сильно) :)...
 
Сверху