Avatar billede mailand Nybegynder
17. maj 2004 - 14:57 Der er 14 kommentarer

Rekursiv funktion der kun viser umiddelbare børn

Ok... jeg har brug for hjælp til en rekursiv funktion, der skal vise noget menustruktur på et site... det bliver mildest talt ved med at drille...

Hvis man forstiller sig en struktur i denne dur:
- Hovedpunkt 1
  - Underpunkt 1
    - Underpunkt 1.1
      - Underpunkt 1.1.1
  - Underpunkt 2
- Hovedpunkt 2

Så skal jeg have konstrueret noget, der KUN viser umiddelbare 'børn' til det punkt, man vælger. Dvs. har jeg valgt Hovedpunkt 1, skal menuen se sådan ud:
- Hovedpunkt 1
  - Underpunkt 1
  - Underpunkt 2
- Hovedpunkt 2

Og vælger jeg Underpunkt 1, skal menuen så se sådan ud:
- Hovedpunkt 1
  - Underpunkt 1
    - Underpunkt 1.1
  - Underpunkt 2
- Hovedpunkt 2

... og så fremdeles.

Det er ikke noget problem at lave en funktion, der fx. viser hele strukturen. Heller ikke noget problem at lave en funktion, der viser Hovedpunkt 1 og 2 og deres underpunkter, hvis man vælger dem, men det bliver (synes jeg) lidt mere tricky, når man står på Underpunkt 1, og skal have vist strukturen efter ovenstående eksempel.

En funktionsstruktur, der kan lede mig lidt på vej, vil blive overordenligt værdsat!

Data kommer fra et Array, der har både ID på det valgt niveau og dets parentid... (som er 0 for hovedpunkter)

#Mailand
Avatar billede fennec Nybegynder
17. maj 2004 - 23:23 #1
du skal have lavet dig to funktioner.

en tegn funktion.
function tegn(MenuID, OpenID, level)
  'tegn menu punktet
  if IsParent(MenuID, OpenID) then
    'find alle børn
    call tegn(ChildID,OpenID, level+1)
  end if
...
...
end function

og en funktion som undersøger om det aktuelle MenuID er parent til det punkt som skal åbnes.

function IsParent(ParentID,ChildID)
...
  return true OR false
end function

Hvis du ikke selv kan få det lavet, har jeg funktionerne til at ligge et sted (hvis jeg kan finde dem). De gør brug af database, med det burde kunne laves om til et array.
Avatar billede mailand Nybegynder
18. maj 2004 - 09:20 #2
... du må da gerne se, om du kan finde funktionerne... men i hvert fald foreløbig mange tak...
Avatar billede mortency Nybegynder
18. maj 2004 - 11:18 #3
Avatar billede mailand Nybegynder
18. maj 2004 - 11:30 #4
mortency > det er jo bare en fulstændig straight rekursiv funktion, som jeg ser det... Den del forstår jeg meget godt. Dit script vil ikke, som jeg ser det, kunne løse min problematik...

Correct me if I'm wrong...

#Mailand
Avatar billede mortency Nybegynder
18. maj 2004 - 11:33 #5
Beklager leste ikke spm godt nok. Men post litt kode så er det enklere å finne en løsning.
Avatar billede fennec Nybegynder
19. maj 2004 - 09:22 #6
har fundet et af mine script, men det er et gammelt skod script, så det er vist bedre at lave et nyt, end at få det tilpasset. Jeg vil derfor lige høre om du har fået taget hul på opgaven....
Avatar billede mailand Nybegynder
28. maj 2004 - 11:47 #7
sidder netop nu og forsøger at komme op med en kodestump, der kan løse problemet... nu kan den ikke vente længere... skal nok poste noget her, hvis der er gennembrud i sagen... :-/
Avatar billede mailand Nybegynder
28. maj 2004 - 13:00 #8
dette virker umiddelbart... det er nok ret specifikt til mit behov, men tilpas og brug, hvis det er:

function displayTopSpanMenu(arrPages, intMenuId, intParentPageId, intTopParentPageId, intThisPageId, intCssMenuNumber, intLevel)
    dim i, strOutput, strActive
    if isarray(arrPages) then
        for i = 0 to ubound(arrPages,2)
            if int(arrPages(1,i)) = int(intMenuId) then
                if int(arrPages(2,i)) = int(intParentPageId) then
                    if cbool(arrPages(5,i)) then
                        if cbool(arrPages(3,i)) then
                            if cbool(arrPages(4,i)) then
                                strOutput = strOutput & "<a href=""/" & arrPages(8,i) & "/" & arrPages(0,i) & "/" & arrPages(7,i) & ".html"" class=""menu"">" & vbcrlf
                            end if
                            if int(intThisPageId) = int(arrPages(0,i)) or int(intTopParentPageId) = int(arrPages(0,i)) then
                                strActive = "Active"
                            else
                                strActive = ""
                            end if
                            strOutput = strOutput & vbtab & "<span class=""spanMenu" & intCssMenuNumber & "ContainerLevel" & intLevel & strActive & """>"  & vbcrlf
                            strOutput = strOutput & vbtab & vbtab & "<span class=""spanMenu" & intCssMenuNumber & "ContentLevel" & intLevel & strActive & """>"  & vbcrlf
                            strOutput = strOutput & vbtab & vbtab & vbtab & arrPages(6,i) & vbcrlf
                            strOutput = strOutput & vbtab & vbtab & "</span>" & vbcrlf
                            strOutput = strOutput & vbtab & "</span>" & vbcrlf
                            if cbool(arrPages(4,i)) then
                                strOutput = strOutput & "</a>" & vbcrlf
                            end if
                            strOutput = strOutput & "<br>" & vbcrlf
                           
                            if displaySubsBln(arrPages,arrPages(0,i),intThisPageId) then
                                strOutput = strOutput & displayTopSpanMenu(arrPages, intMenuId, arrPages(0,i), intTopParentPageId, intThisPageId, intCssMenuNumber, intLevel +1)
                            end if
                           
                        end if
                    end if
                end if
            end if
        next
    end if
    displayTopSpanMenu = strOutput
end function

function displaySubsBln(arrPages, intCurrentPageIdInLoop, intThisPageId)
    displaySubsBln = false
    dim i, intParentPageId
    intParentPageId = int(intThisPageId)

    if int(intCurrentPageIdInLoop) = int(intThisPageId) then
        displaySubsBln = true
    else
        while intParentPageId <> 0
            for i = 0 to ubound(arrPages,2)
                if int(arrPages(0,i)) = int(intParentPageId) then
                    intParentPageId = int(arrPages(2,i))
               
                    if intParentPageId = int(intCurrentPageIdInLoop) then
                        displaySubsBln = true
                        exit function
                    end if
                end if
            next
        wend
    end if
end function


#Mailand
Avatar billede mailand Nybegynder
28. maj 2004 - 13:01 #9
Det skal lige nævnes, min funktion laver links på en lidt speciel måde...
<a href="/1/118/side 2.html" class="menu">
    <span class="spanMenu1ContainerLevel0">
        <span class="spanMenu1ContentLevel0">
            Side 2
        </span>
    </span>
</a>
Avatar billede fennec Nybegynder
01. juni 2004 - 08:13 #10
husk at lukke ?'et....
:o)
Avatar billede razser Nybegynder
02. april 2005 - 15:05 #11
Hej mailand,

Ang. din kommentar af 28/05-2004 13:00:42 - har du mulighed for at vise hvordan du laver array'et?

Jeg har en database med felterne: PageID, ParentPageID og MenuText.

Jeg vil naturligvis gerne give points....
Avatar billede mailand Nybegynder
02. april 2005 - 16:31 #12
Hej... Jeg plejer at generere mine arrays med en funktion, som jeg desværre ikke har lige her...

Men i princippet er det en standard SQL sætning, der bliver eksekveret vha. adodb.recordset's GetRows funktion - den må du kunne finde noget om et sted (Sidder ikke på min maskine med alle kodestumperne, så jeg kan ikke helt huske den korrekte syntax i hovedet (det er ikke så tit jeg lige sidder med asp mere - laver mere frontend nu)

Men ja, vha. den funktion, får du alle dine rækker ud som et todimensionalt array, som du kan referere til med arrRecords(x,y)

Jeg håber, det hjælper...

#Mailand
Avatar billede razser Nybegynder
02. april 2005 - 17:13 #13
hej igen,

Jeg er lidt i tvivl om nogle af dine variable:
arrPages, intMenuId, intParentPageId, intTopParentPageId, intThisPageId

Jeg formoder, at intMenuId er menupunktets unikke ID; intParentPageId bestemmer, hvor menupunktet hører under, men hvad med de andre, hvad bruges disse til?

#Razser
Avatar billede mailand Nybegynder
02. april 2005 - 17:58 #14
Puha... det var en menustyring til et Content Management System min gamle arbejdsgiver havde, som jeg ikke har arbejdet med i snart 1 år... men jeg prøver:

arrPages    = arrayet med alle sider
intMenuId  = deres system kunne håndtere flere menuer på samme sider, så denne var i i brug til at holde styr på, hvilken menu man arbejdede i

intParentPageId  = forrige sides unikke id

intTopParentPageId  = øverste niveaus for denne side... den kan jeg ikke helt huske, hvorfor var med... men hvis man var på 3. eller 4. niveau, så kunne man med denne vide, hvad 1. niveau var...

intThisPageId = denne sides unikke id... hmm. hvorfor skulle jeg mon bruge den... ?

Beklager, det er virkelig lang tid siden, jeg har siddet med den funktion... :o)

#Mailand
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester