Meny
Är gratis
registrering
Hem  /  Internet/ Ändra toppmenyn. PdoMenu - skapa en meny i MODX Modx vertikal meny

Ändra toppmenyn. PdoMenu - skapa en meny i MODX Modx vertikal meny

Utdrag av menygenerering. Den kan ersätta Wayfinder och ger mer flexibilitet när det gäller att specificera parametrar.

Till exempel kan den bygga en meny från flera föräldrar samtidigt, visa dem både tillsammans och som separata grenar.

En betydande ökning av hastigheten tillhandahålls först vid första starten, ytterligare Wayfinder är inte särskilt sämre, tack vare kompetent cachning.

alternativ

Som standard accepterar pdoMenu allmänna pdoTools-parametrar och några av dess egna:

namn Standard Beskrivning
& föräldrar Nuvarande resurs Lista över föräldrar för sökresultat, separerade med kommatecken. Om du sätter & föräldrar = `0`- urvalet är inte begränsat. Om förälderns id börjar med ett bindestreck, exkluderas den och dess underordnade från urvalet.
& nivå 0 (obegränsat) Genererad menynivå.
& Resurser Lista över resurser som ska visas i resultaten, separerade med kommatecken. Om ett resurs-id börjar med ett bindestreck exkluderas den resursen från urvalet.
& mallar Lista över mallar för filtrering av resultat, separerade med kommatecken. Om ett mall-id börjar med ett bindestreck, exkluderas resurser med det från urvalet.
& var JSON-kodad matris med ytterligare hämtningsparametrar.
& displayStart 0 Aktivera visning av menystartnoder. Användbart när du anger mer än en förälder.
& sammanhang Begränsa valet efter resurskontext.
& visa dold 0 Visa resurser dolda i menyn.
& visaOpublicerad 0 Visa opublicerade resurser.
& förhandsgranskningOpublicerad 0 Aktivera visning av opublicerade resurser om användaren har behörighet att göra det.
& dölj Undermenyer 0 Dölj inaktiva menygrenar.
& Välj Lista över fält att välja, separerade med kommatecken. Du kan till exempel ange en JSON-sträng med en array & välj = `(" modResource ":" id, sidtitel, innehåll ")`
& sortera efter menyindex Valfritt resursfält att sortera, inklusive TV-parametern, om det anges i parametern & inkluderar TV-apparater, till exempel & sortby = `(" tvname ":" ASC "," sidtitel ":" DESC ")`... Du kan ange en JSON-sträng med en array med flera fält. För slumpvis sortering, specificera & sortby = `RAND ()`
& sortdir ASC Sorteringsriktning: fallande eller stigande. Om du lämnar parametrarna & sortby och & sortdir tomma, kommer sorteringen att gå i den ordning som resurserna i & Resurser.
& gräns 0 Begränsning av antalet provresultat.
& offset 0 Hoppa över resultat från början. Måste användas tillsammans med det uttryckligen angivna & gräns
& kontrollera behörigheter Ange vilka behörigheter användaren ska kontrollera vid visning av resurser, till exempel & checkPermissions = `lista`.
& räknaBarn 0 Exakt räkning av antalet underordnade resurser för varje kategori och visning av dem i platshållaren [[+ barn]]. Gör ytterligare frågor till databasen, så den är inaktiverad som standard.
& toPlaceholder Om det inte är tomt kommer kodavsnittet att spara all data till en platshållare med detta namn istället för att visas på skärmen.
& plPrefix wf. Prefix för placerade platshållare.
& visa logg 0 Visa ytterligare information om utdragets arbete. Endast för de som är auktoriserade i "mgr"-sammanhang.
& snabbt läge 0 Snabbt chunk-bearbetningsläge. Alla råtaggar (villkor, utdrag, etc.) kommer att klippas.
& cache 0 Cachning av utdragsresultat.
& cacheTime 3600 Cachens giltighetstid, i sekunder.
& schema -1 Url-bildningsschemat skickas till modX :: makeUrl (), så de möjliga alternativen behövs. Den speciella uri-typen ersätter resurs-uri-värdet utan att köra funktionen.
& använd WeblinkUrl 1 Skapa en länk baserat på resursklassen.
& rowIdPrefix Prefix id = "" för att ställa in identifieraren i chunken.
& hereId ID för den aktuella resursen för den genererade menyn. Du behöver bara ange det om skriptet självt definierar det felaktigt, till exempel när du visar en meny från en bit av ett annat utdrag.
& inkluderar TV-apparater Lista över TV-parametrar för val, separerade med kommatecken. Till exempel & includeTVs = `action, time` ger platshållare [[+ åtgärd]] och [[+ tid]].
& förbereda TV-apparater Lista över TV-parametrar, med filer från mediakällor, för vilka fullständiga sökvägar måste genereras. Om du installerar & prepareTVs = `1`, alla TV-apparater som anges i & inkluderar TV-apparater.
& process-TV Lista över TV-parametrar som ska bearbetas och visas enligt deras inställningar i systemhanteraren. Om du installerar & processTV = `1`, alla TV-apparater som anges i & inkluderar TV-apparater... Saktar ner arbetet.
& tvPrefix Prefix för TV-parametrar.

Mallparametrar

Dessa parametrar ställer in bitar som innehåller mallar för att generera menyer.

namn Beskrivning
& tplOuter En del av designen av hela menyblocket. Standard: @INLINE
    [[+ omslag]]
& tpl En del av menyalternativets design. Om det inte anges kommer innehållet i resursfälten att skrivas ut på skärmen. Standard: @INLINE
  • [[+ menytitel]] [[+ omslag]]
  • & tplHär En del av utformningen av det aktuella menyalternativet.
    & tplStart En del av registreringen av rotobjektet, förutsatt att det ingår & displayStart... Standard: @INLINE

    [[+ menytitel]]

    [[+ omslag]]
    & tplParentRow En del av designen av föräldern med avkomlingar som inte matchar & tplCategoryFolder-villkoren. Till exempel: @INLINE
    & tplParentRowHere En del av utformningen av det aktuella dokumentet, om det innehåller barn.
    & tplParentRowActive Del av registrering av föräldrar med ättlingar i den aktiva menygrenen.
    & tplCategory Folder En speciell bit för kategorin. Kategorien anses vara en förälder med barn, som har en tom mall eller rel = "category" i fältet link_attributes.
    & tplInner En del av designen av hela blocket av menyunderpunkter. Om den är tom kommer den att använda & tplOuter... Till exempel: @INLINE
    & tplInnerRow En del av registreringen av en underpunkt i menyn. Till exempel: @INLINE
    & tplInnerHär En del av registreringen av den aktiva underposten i menyn.

    CSS-klassparametrar

    Dessa parametrar ställer in värdet på platshållarna [[+ klassnamn]] och [[+ klasser]] för olika menyalternativ. Platshållare [[+ klassnamn]] visar endast klassnamn utan attribut klass = "", till skillnad från platshållaren [[+ klasser]].

    Exempel på

    Normal menyutgång från webbplatsens rot till en nivå:

    []

    Utdata exklusive specifika föräldrar och kontroll av användarbehörigheter:

    []

    Visar en meny från två föräldrar samtidigt, som visar grundpunkterna:

    []

    Visar två nivåer av resurser, räknar antalet kapslade resurser:

    [] `& tplParentRow =` @ INLINE

  • [[+ menytitel]] ([[+ barn]])
  • [[+ omslag]] `& countChildren =` 1`]]



    Wayfinder tjänar till att organisera listor med länkar för MODX. Tack vare stödet för mallar, låter det dig visa listor i alla nödvändiga former:
    • Meny i form av en lista, tabell, bilder, ikoner etc.
    • Statiska menyer
    • Menyer med olika effekter (rullgardinsmeny, rullgardinsmeny, etc.)
    • karta över webbplatsen
    Samtalsexempel:


    & rowTpl = `rowTpl`
    & yttreTpl = `yttreTpl`
    & hereClass = `aktiv`
    & rowClass = `eNav_li`]]

    Utdragsparametrar:

    & startId- ID för den överordnade sidan, om du anger 0 kommer det att vara från webbplatsens rot. Standard är ID för den aktiva sidan

    & displayStart - visa dokument med startId i menytitel, standard false

    & nivå- häckningsdjup, som standard 0 - alla nivåer

    & gräns- begränsa antalet sidor i utdata (standard 0 - ingen gräns)

    & ignoreraDold- ignorera kryssrutan på sidan "Visa i menyn", dvs om du anger 1 kommer alla sidor att visas. Standard är 0. Endast de sidor visas som har kryssrutan "Visa i menyn" markerad

    & tf - namnet på ersättaren för de direkt visade resultaten. Standard är 0.

    & felsöka- felsökningsläge (standard 0)

    & dölj Undermenyer - expandera endast aktiv undermeny (standard 0)

    & ta bort NewLines- tar bort radmatningstecknet vid utgång (standard 0)

    & textOfLinks- för namnet på menylänken. Möjliga alternativ:menutitle, id, pagetitle, description, parent, alias, longtitle, introtext. Standard menytitel

    & titleOfLinks- för titeln på menylänken. Alternativ:menutitle, id, pagetitle, description, parent, alias, longtitle, introtext. Standard namn på sidan

    & rowIdPrefix- sätter id (rowIdPrefix + docId) för varje element. Standard 0

    & includeDocs- ID för dokument separerade med kommatecken som kommer att inkluderas i menyn (inte specificerat som standard)

    & exkludera Dokument - ID för dokument separerade med kommatecken, som kommer att uteslutas från menyn (standard 0)

    & sammanhang- sammanhang för att generera menyn. Standardinställningen är aktuell.

    & startIdContext - Identifieraren för det sammanhang som dokumenten hämtas från för att bilda resultatet.

    & konfig - Extern PHP-fil för att lagra Wayfinder-konfiguration (exempel: kärna / komponenter / wayfinder / configs).

    & schema - Format för att generera URL. Möjliga värden (baserat på makeURL API-anropet):

    1: (standard) URL i förhållande till site_url;

    0: se http;

    1: se https;

    full: en absolut URL som börjar med site_url;

    abs: en absolut URL som börjar med base_url;

    http: en absolut URL, tvingad in i http-schemat;


    https: en absolut URL, tvingad in i https-schemat.

    & sortera efter - Fältet efter vilket sorteringen sker. (standard menuindex)

    Alternativen är:

    id, menytitel, sidtitel, introtext, menyindex, publicerad, döljmeny, förälder, isfolder, beskrivning, alias, longtitle, typ, mall

    & sorteringsordning- Sorteringsordning."ASC" eller "DESC". Standard ASC

    & var - JSON-stil filterparametrar (Matchar var i MySQL)... Till exempel, när du vill dölja en blogg eller nyheter från tillägget Articles: & where = `[(" class_key:! = ":" Article ")]`
    Exempel:
    utdata endast mappar: & där = `isfolder = 1

    & hereId - Bestäm vilket ID som ska användas i kodavsnittet. Använd värdet [[* id]] om mallen är specificerad med parametern hereTpl och activeRowParentTpl inte tillämpas korrekt i menyalternativet. Som standard är det aktuella ID.
    Du behöver bara ange det om skriptet självt definierar det felaktigt, till exempel när du visar en meny från en bit av ett annat utdrag.

    & härTpl - HereTpl-mallen används när det aktuella objektet visas i menyn.
    Möjliga platshållare:
    [[+ wf.classes]] - en plats för att specificera den använda CSS-klassen (inkluderar klass = "")
    [[+ wf.classnames]] - innehåller endast namnet på CSS-klassen (inkluderar inte klass = "")
    [[+ wf.link]] - adress (href) för länken
    [[+ wf.title]] - text för rubriken på länken
    [[+ wf.linktext]] - länktiteltext
    [[+ wf.wrapper]] - plats för att visa undermenyn
    [[+ wf.id]] - visa en unik identifierare (id)
    [[+ wf.attributes]] - visa ytterligare länkattribut
    [[+ wf.docid]] - dokumentidentifierare för det aktuella elementet
    [[+ wf.subitemcount]] -antal objekt i mappen
    [[+ wf.description]] - visar värdena i beskrivningsfältet
    [[+ wf.introtext]] - visar värdena för introtextfältet

    Exempelmall: [[+ wf.linktext]] [[+ wf.wrapper]]

    Mallparametrar

    Dessa parametrar anger de bitar som innehåller mallar som kommer att generera Wayfinders utdata.

    I den nuvarande versionen av Wayfinder för MODX Revolution kan du komma åt din anpassade TV med hjälp av wf-prefixet platshållare. t.ex. [[+ min_TV]]

    När detta skrivs kommer endast de ursprungliga TV-värdena att returneras - de kommer inte att formateras. Till exempel, om din TV är en bild - den vanliga användningen av en sådan TV i din mall kommer att returnera hela bildtaggen, men inuti en Wayfinder-mall - kommer bara sökvägen till bilden att returneras.

    Om du vill hantera TV kan du göra det genom att anropa ett utdrag i Wayfinder radmallen (& rowTpl. Din TV-bild heter till exempel ikon och vanligtvis används följande kod för utdata i mallen:

    ... ...

    Men eftersom det inte låter dig hantera TV, måste du ersätta den med:

    ... ...

    Och nu lägger vi in ​​följande PHP-kod i processTV-kodavsnittet:

    getObject ("modResurs", $ myId); return $ doc-> getTVValue ($ myTV);

    Som ett resultat returneras en fullt bearbetad TV-bild.

    & yttreTpl

    Namnet på den bit som innehåller mallen för den yttre behållaren.

    Tillgängliga platshållare:

    • wf.classes - visar klasser hämtade från en uppsättning Wayfinder-parametrar (inklusive attributet class = "")
    • wf.classnames - visa klassnamn (utan klass = "")
    • wf.wrapper - visar det interna innehållet (rad).
      [[+ wf.wrapper]]

    Parametern & innerTpl innehåller samma uppsättning platshållare som & yttreTpl.

    & radTpl

    Klumpnamn som innehåller mall för menyradsobjekt.

    Tillgängliga platshållare:

    • wf.classes - klassutgång (inklusive attributet class = "")
    • wf.classnames - visa motsvarande klasser (utan klass = "")
    • wf.link - värdet av attributet href = "" för menylänken
    • wf.title - namnet på titeltexten för länken från fältet som anges i parametern & titleOfLinks
    • wf.linktext - texten för den aktiva länken som anges i fältet som skickas i parametern & textOfLinks
    • wf.wrapper - visar internt innehåll, såsom en undermeny
    • wf.id - visar attributets unika ID. Du måste ange parametern & rowIdPrefix för att denna platshållare ska få ett värde. Värdet är docId-prefixet.
    • wf.attributes - Skriver ut attributlänken för det aktuella elementet
    • wf.docid - dokument-ID för det aktuella elementet
    • wf.description - beskrivning för det aktuella elementet
    • wf.level - aktuell häckningsnivå

    Användningsexempel:

    [[+ wf.linktext]] [[+ wf.wrapper]]

    Ett annat alternativ:

  • [[+ wf.linktext]] - [[+ wf.description]] [[+ wf.wrapper]]

  • Exempel på

    Första nivån


    [[! Wayfinder? & startId = `0` & nivå =` 1`
    & rowTpl = `rowTpl`
    & yttreTpl = `yttreTpl`
    & hereClass = `aktiv`
    & rowClass = `eNav_li`]]

    Klumpkod yttreTpl



      [[+ wf.wrapper]]

    RowTpl chunk-kod



      [[+ wf.wrapper]]

    Andra nivån (i det här exemplet var meny- och undermenyalternativen visuellt på samma nivå

    [[! Wayfinder? & startId = `0` & nivå =` 2`
    & rowTpl = `rowTplFooterMenu`
    & outerTpl = `outerTplFooterMenu`
    & innerTpl = `innerTplFooterMenu`
    & innerRowTpl = `innerRowTplFooterMenu`
    & hereClass = `aktiv`]]

    Klumpkod yttreTplFooterMenu



    [[+ wf.wrapper]]

    chunk code rowTplFooterMenu




    • [[+ wf.title]]


    • [[+ wf.wrapper]]

    chunk code innerTplFooterMenu

    [[+ wf.wrapper]]

    chunk code innerRowTplFooterMenu



  • [[+ wf.title]]


  • Men det här är inte för oss ;).

    Vi kommer att göra allt från grunden. Varför behövde vi (jag) detta, eftersom det redan finns färdiga alternativ? För jag gillar det så. För jag tror att detta tillvägagångssätt är det mest korrekta. För att kunna utveckla vår egen kan vi enkelt förstå någon annans kod, ändra, åtgärda fel eller komplettera den med den funktionalitet som behövs i ett visst fall. Och i slutändan är det ofta så trevligt att göra din egen!

    Ytterligare berättande kommer att förutsätta att läsaren har minimal kunskap om PHP-programmering. I teorin kommer de personer som inte förstår koden alls att kunna kopiera koden och reproducera alla steg som kommer att diskuteras nedan. Det kan dock vara bättre för dem att använda färdiga utdrag a la Ditto, eftersom de ger en mängd möjligheter till extern konfiguration utan att komma in i huvudkoden.

    Jag vill inte diskutera vad som är bättre för användaren - att ta färdigt eller utveckla sitt eget ... Både i det och i ett annat fall finns det för- och nackdelar. För mig personligen finns det fler fördelar med det andra alternativet. Dessutom kommer var och en av läsarna att bestämma själv.

    Så låt oss ta en titt på vår igen. Eftersom det finns en hel del olika programvarudelar på vår sida, och du måste börja med något, så kommer vi att programmera ...

    Topp meny

    Med termen "toppmenyn" menar jag en uppsättning länkar till sidor överst på webbplatsen (se bilden nedan):

    Jag kommer att beskriva det första exemplet på att skapa ett utdrag i detalj, i framtiden kommer jag att uppehålla mig huvudsakligen vid de viktigaste detaljerna.

    Låt oss jämföra med vårt webbplatsträd i ledningssystemet, som vi byggde i föregående artikel:

    Som du kan se av figuren är fyra dokument markerade i webbplatsträdet (nämligen "Blogg", "Om författare", "Foton" och "Feedback"), som sedan kommer att skapa länkar i toppmenyn.

    Låt mig också påminna om att vi har dolda dokument i förväg som vi inte vill visa i menyn. Till exempel, i inställningarna för dokumentet med namnet "Site Search" togs kryssrutan "Visa i menyn" bort, och de återstående två dokumenten "Länkar" och "Kategorier" gömdes på webbplatsen genom att ta bort kryssrutan i dokumentinställningarna "Publicera" (fliken "Sidinställningar" i dokumentinställningarna).

    I den föregående artikeln förberedde vi alltså toppmenyn i styrsystemet.

    Låt oss nu gå vidare till frågan om att visa våra åtgärder direkt på webbplatsen.

    De flesta av programmen på sajten utförs av den sk. "", dvs. separata kodbitar (de kan också förstås som separata funktioner eller subrutiner) i PHP. Därför, för att implementera toppmenyns visning i MODx, måste vi också skapa ett nytt utdrag, programmera det och lägga till ett anrop till detta utdrag i mallen på rätt plats.

    Låt oss gå till ledningssystemet, öppna fliken "Resurser" -> "Resurshantering" -> fliken "Snippets" och klicka på länken "Nytt utdrag". I fältet "Snippet name" anger du "TopMenu" utan citattecken och sparar nu bara ett tomt utdrag utan kod. Efter att ha sparat kommer vi att se namnet på vårt utdrag på fliken "Utdrag".

    Låt mig påminna dig om att vi i vår mall flyttade toppmenyn till "TOPMENY"-biten. Växla till fliken "Chunks" och öppna ""-biten. I innehållet i denna bit kommer vi att se följande kod:


    • Blogg

    • Om Författarna

    • Foto

    • Respons

    Denna kod är det som skapar vår meny. Låt oss kommentera det och lägga till ett anrop till "TopMenu"-fragmentet i biten:


    []

    Även här kommer vi att behöva avvika lite för att klargöra innebörden av denna konstruktion []. Faktum är att det är med hjälp av konstruktioner som [] eller [! SnippetName!] som vi kan göra anrop till utdrag var som helst i våra mallar, bitar och till och med på vilken separat sida som helst på webbplatsen.

    I detta fall betecknar []-konstruktionen ett anrop cachad utdrag, dvs. ett anrop till en dynamisk subrutin, vars resultat kommer att beräknas och exekveras en gång, och senare vid laddning av sidan där detta kodavsnitt anropas, kommer resultatet att vara oförändrat, eftersom det upprepade anropet av kodavsnittet inträffar inte längre. Således sparar vi resurserna på vår webbserver (och detta är alltid mycket viktigt med hög trafik till resursen).

    Det finns dock situationer när du behöver köra om kodavsnittskoden hela tiden och du inte kan cachelagra resultaten. I sådana fall används konstruktionen [! SnippetName!], vilket alltid kommer att tvinga kodavsnittet att köras utan cachning. I analogi kallas denna konstruktion ett anrop ocachebar utdrag.

    Så låt oss spara "TOPMENY"-biten och uppdatera webbplatssidan. Hmm, konstigt nog är toppmenyn borta. Men är det verkligen så fantastiskt? Genom att kommentera HTML-koden för menyn i biten, gömde vi dess visning i webbläsaren (kontrollera detta genom att titta på HTML-källan för sidan). Och vårt "TopMenu"-utdrag gör ingenting, eftersom inget har lagts till det ännu. Låt oss åtgärda denna brist :).

    Låt oss gå tillbaka till fliken "Snippets", öppna det skapade "TopMenu"-utdraget och försöka testa dess kapacitet... Tålamod, mina avancerade läsare, alla är inte bekanta med dessa detaljer.

    Låt oss först skriva den enklaste koden (vanlig PHP-kod):

    echo "Testar ...";
    ?>

    Innan du sparar, välj "Fortsätt redigera", eftersom vi måste ändra innehållet i vårt utdrag mer än en gång, och efter det kommer vi att spara utdraget. Låt oss uppdatera webbplatssidan och se i stället för toppmenyn ... ja, för att säga sanningen, vid första anblicken kommer vi inte att se nästan några förändringar, förutom den något utökade blå bakgrunden på menyn. Tryck på "CRTL + A" för att välja all text på sajtsidan, och vi kommer att se att vårt utdrag fortfarande visade texten "Testing ..." istället för menyn, bara textfärgen matchar bakgrundsfärgen.

    Låt oss ändra kodavsnittskoden till följande:

    eko" Testar...";
    ?>

    Nu kan vi tydligt se att vårt utdrag fungerar och till och med (!) visar lite text. Tja, det här är bra, men inte tillräckligt för vår uppgift, eftersom vi måste se till att vårt utdrag visar länkar från kontrollsystemet, och i exakt samma HTML-kod som vi kommenterade i "TOPMENY"-delen.

    Och igen, lite distraktion...

    Hela systemet med dokumentrelationer i MODx är byggt enligt principen: varje "överordnad dokument" innehåller från noll till många "underordnade dokument" ("förälder" -> "barn").

    Varje dokument i MODx-databasen har sin egen unika identifierare "ID" - detta är numret som vi ser inom parentes i webbplatsträdet bredvid vart och ett av dokumenten.

    Förresten, denna unika identifierare har bara en enda betydelse - den identifierar unikt ett specifikt dokument i kontrollsystemet. och inget mer! Jag fokuserar specifikt på detta faktum, eftersom jag har mött upprepade försök att ändra dessa identifierare för en mängd olika syften ... Du måste komma ihåg direkt att detta helt enkelt är meningslöst, så försök inte att ändra dessa siffror. Du bör inte vara särskilt uppmärksam på dem alls, vanligtvis används dessa siffror helt enkelt för att generera länkar till vissa dokument.

    I MODx-databasen har även ett speciellt "förälder"-fält skapats för varje dokument. Värdet på det här fältet är ett nummer som anger antingen den unika identifieraren för det överordnade dokumentet eller, om dokumentet är i roten av trädet, noll. Det är alltså alltid möjligt att entydigt avgöra vilket dokument som är förälder för en given.

    För att se vad vi just pratade om, öppna phpMyAdmin, välj din databas och hitta tabellen (PREFIX) site_content, där (PREFIX) är ditt prefix som du angav under installationen. Du kommer att se många fält som lagrar vissa dokumentdata, inklusive "ID" - en unik identifierare, "förälder" - numret på det överordnade dokumentet, "sidtitel" - sidans titel och andra.

    Så, med hjälp av denna information om principen för att lagra och länka dokument i MODx, kan vi förstå hur man får nödvändiga data för att visa länkarna i toppmenyn: vi måste hitta alla dokument som finns i roten av platsträd, dvs har värdet noll i fältet "förälder".

    Med hjälp av SQL-språket beskrivs en liknande fråga ungefär så här (du kan försöka skriva in denna fråga i SQL-inmatningsfältet i phpMyAdmin, efter att ha ersatt "modx_" med ditt prefix):

    VÄLJ *
    FRÅN `modx_site_content`
    WHERE `förälder` = 0;

    En sådan begäran kommer dock att returnera absolut alla dokument från webbplatsens rot, vilket inte är helt korrekt, baserat på huvuduppgiften - för att endast visa länkar till de dokument som har:

    • publicerad status (i databasen är fältet "publicerad" ansvarig för denna post, där värde = 1 betyder att dokumentet har publicerats, och värde = 0 - opublicerat).
    • inte raderad (fältet "raderad", där 1 raderas och 0 inte raderas),
    • och som har alternativet "Visa i menyn" inställt (fältet "dölj meny", där 1 - för att dölja och 0 - för att visa i menyn).

    Dessutom, när vi springer lite framåt, kommer vi omedelbart att sortera dokumenten med parametern "Position i menyn", som kommer att bestämma positionen för varje länk i vår meny.

    Nåväl, ur SQL synvinkel är detta inte en svår uppgift alls och det löses så här:

    VÄLJ *
    FRÅN `modx_site_content`
    VAR "publicerad" = 1
    OCH "förälder" = 0
    OCH "raderad" = 0
    OCH `hidemenu` = 0
    ORDER BY `menuindex` ASC;

    Teoretiskt sett kan alla SQL-frågor exekveras i utdrag direkt med PHP-skript, ansluta databasen varje gång och göra många andra rutinoperationer, upprepa dem om och om igen ... Men, du måste hålla med om, detta skulle neutralisera meningen med att använda ramverket , vilket verkligen är vårt kontrollsystem sedan dess MODx, bland dess andra fördelar, tillhandahåller en färdig uppsättning programgränssnittsverktyg (API, Application Programming Interface). API:er är mjukvarufunktioner som förenar och underlättar många databehandlingsprocesser.

    Låt oss använda en av de nämnda API-funktionerna "getDocumentChildren" i vårt utdrag. Funktionen "getDocumentChildren" tar emot följande data som parametrar:

    • $ id - nummer på det överordnade dokumentet,
    • $ aktiv - välj endast publicerade eller opublicerade dokument (1 eller 0, respektive),
    • $ raderade - välj endast borttagna eller ej raderade dokument (1 | 0),
    • $-fält - fält som är valda från databasen,
    • $ där finns särskilda villkor, d.v.s. WHERE-sats i SQL-fråga,
    • $ sort - fältet som resultaten ska sorteras efter
    • $ riktning - sorteringsriktning, kan vara ASC eller DESC, d.v.s. sortering från lägsta till högsta värde eller vice versa
    • $ limit - begäran begränsning, d.v.s. LIMIT-sats i SQL-fråga

    $ resultat = $ modx-> getDocumentChildren (
    $ id = 0,
    $ aktiv = 1,
    $ raderad = 0,
    $ där = "hidemenu = 0",
    $ sort = "menyindex",
    $ dir = "ASC",
    $ gräns
    );

    Skriv ut ("

    Foreach ($ resultat som $ nyckel => $ värde) (
    print_r ($ värde);
    }

    Skriv ut ("");
    ?>

    Spara utdraget och uppdatera sidan. Som ett resultat av att köra det uppdaterade "TopMenu"-fragmentet kommer du att se en lista med arrayer och deras värden sorterade efter värdena i "menuindex"-fältet från det lägsta värdet till det högsta. Försök att ändra parametern $ dir = "ASC" till $ dir = "DESC" - som ett resultat kommer arrayerna att byggas om och dokumentet med det högsta värdet av "menuindex"-fältet kommer att visas som det första dokumentet.

    Det är nog tydligt för erfarna programmerare att resultatet redan ger allt du behöver för att bygga en färdig meny med länkar. Tja, nästan allt. Jag fortsätter i alla fall: vi skriver om PHP-koden för att komma så nära det önskade resultatet som möjligt.

    $ resultat = $ modx-> getDocumentChildren (
    $ id = 0,
    $ aktiv = 1,
    $ raderad = 0,
    "id, sidtitel, publicerad, menyindex, raderad, döljmeny, menytitel",
    $ där = "hidemenu = 0",
    $ sort = "menyindex",
    $ dir = "ASC",
    $ gräns
    );

    $ items = "";
    $ output = "";

    Foreach ($ resultat som $ nyckel => $ värde) (
    $ objekt. = "


  • ". $ värde [" sidtitel "]."
  • \ n ";
    }

    Om ($ objekt! = "") (
    $ output = "

      \ n ";
      $ output. = $ objekt;
      $ output. = "
    \ n ";
    }

    Returnera $ output;

    Vi kommer inte att analysera koden i detalj, eftersom detta är den vanligaste PHP-koden, inget mer. Om någon inte förstår innebörden av några konstruktioner frågar jag i kommentarerna, eller bättre - till motsvarande supportforum.

    Låt oss spara det nya kodavsnittet och uppdatera sidan. Som ett resultat av att köra koden kommer vi att se praktiskt taget vad vi ville få:

    De där. dessa är redan automatiskt genererade länkar, vars struktur helt upprepar strukturen för dokument i MODx-trädet. För att testa detta, försök att skapa något testdokument i roten av webbplatsen och uppdatera sidan.

    Detta är dock inte allt. Många har säkert redan märkt att det finns länkar, men det finns inga länkar... Paradox :). Jag menar, namnen på dokumenten i menyn visas, men länkarna till dem fungerar inte. Detta är logiskt, eftersom i länkkoden "#" visas istället för riktiga sökvägar.

    För att lösa detta problem måste du lära dig om en annan extremt användbar funktion i MODx: adressen till vilken interna sida på webbplatsen som helst kan erhållas med följande konstruktion [~ id ~], där id är det unika numret på det nödvändiga dokumentet, dvs samma nummer som anges inom parentes bredvid namnet på varje dokument i webbplatsträdet. Således, genom att lägga till en sådan konstruktion [~ 1 ~] i mallen / biten / sidinnehållet,

      • index - aliaset för "Blogg"-dokumentet, om vi skrev in "index" som alias för dokumentet, eller
      • 1.html, om vi inte angav något i "Alias"-fältet för "Blogg"-dokumentet
    • om vänliga länkar är inaktiverade kommer vi att se texten index.php? id = 1

    Låt oss skriva om utdraget med hjälp av denna information:

    $ resultat = $ modx-> getDocumentChildren (
    $ id = 0,
    $ aktiv = 1,
    $ raderad = 0,
    "id, sidtitel, publicerad, menyindex, raderad, döljmeny, menytitel",
    $ där = "hidemenu = 0",
    $ sort = "menyindex",
    $ dir = "ASC",
    $ gräns
    );

    $ items = "";
    $ output = "";

    Foreach ($ resultat som $ nyckel => $ värde) (
    $ objekt. = "


  • ". $ värde [" sidtitel "]."
  • \ n ";
    }

    Om ($ objekt! = "") (
    $ output = "

      \ n ";
      $ output. = $ objekt;
      $ output. = "
    \ n ";
    }

    Returnera $ output;

    Så vi ändrade # till [~ ". $ Värde [" id "]." ~], dvs. i själva verket, för varje dokument från arrayen ersätts dess unika ID i [~ id ~]-konstruktionen. Som ett resultat får vi en meny med fungerande länkar.

    Vi har nästan nått idealet ... Men även nu finns det fortfarande en detalj som måste beaktas: designern bestämde att den aktiva länken skulle markeras med en vit bakgrund och färgen på länken skulle följaktligen ändras till orange.

    För att uppnå detta kommer vi återigen att avslöja hemligheterna med MODx CMS :). Dolt i API:t är $ modx-> documentIdentifier-funktionen, som returnerar värdet för den unika identifieraren för den aktuella sidan. Vi kommer att behöva den för att bestämma den aktiva sidan och välja den i menyn:

    $ resultat = $ modx-> getDocumentChildren (
    $ id = 0,
    $ aktiv = 1,
    $ raderad = 0,
    "id, sidtitel, publicerad, menyindex, raderad, döljmeny, menytitel",
    $ där = "hidemenu = 0",
    $ sort = "menyindex",
    $ dir = "ASC",
    $ gräns
    );

    $ cid = $ modx-> documentIdentifier;

    $ items = "";
    $ output = "";

    Foreach ($ resultat som $ nyckel => $ värde) (
    if ($ värde ["id"] == $ cid) (
    $ active = "id = \"aktiv \ "";
    }
    annat (
    $ active = "";
    }
    $ objekt. = "
    ". $ värde [" sidtitel "]."
    \ n ";
    }

    Om ($ objekt! = "") (
    $ output = "

      \ n ";
      $ output. = $ objekt;
      $ output. = "
    \ n ";
    }

    Returnera $ output;

    Tja, hur fungerade det? Hände!

    Men du trodde inte att allt var över, eller hur? Och det med rätta. Vi sätter oss själva den högsta ribban, vi vill använda de maximala funktionerna hos MODx. Därför är det ytterligare en liten detalj som vi missat.

    Låt oss ta en närmare titt på namnen på fälten som vi begär med hjälp av getDocumentChildren-funktionen: "id, sidtitel, publicerad, menyindex, raderad, döljmeny, menytitel". Bland dem finns ett sådant fält som "menytitel". Som namnet antyder kan detta fält lagra menyns titel... Styrsystemet har även ett inmatningsfält "Menyalternativ". Detta fält är valfritt. Logiken är dock att om detta fält är ifyllt så måste vi ersätta länktexten i menyn med den som användaren skrivit in. Nåväl, låt oss göra så här:

    /********************************
    Titel: TopMenu
    Syfte: Visa toppmenyn
    Projekt: Demosite MODx
    ********************************/

    $ resultat = $ modx-> getDocumentChildren (
    $ id = 0, // överordnat dokument-ID
    $ active = 1, // Välj endast publicerade dokument
    $ deleted = 0, // Välj endast icke-raderade dokument
    "id, sidtitel, publicerad, menuindex, raderad, hidemenu, menytitel", // Välj fält från databasen
    $ where = "hidemenu = 0", // Välj endast de dokument som behöver publiceras i menyn
    $ sort = "menuindex", // Sortera dokument efter menyindexfältet
    $ dir = "ASC", // Sortera dokument i stigande ordning
    $ limit = "" // Vi sätter inga begränsningar (parametern LIMIT i SQL-frågan)
    );

    $ cid = $ modx-> documentIdentifier; // få ID för den aktuella sidan

    $ items = "";
    $ output = "";

    Foreach ($ resultat som $ nyckel => $ värde) (
    if ($ värde ["id"] == $ cid) (
    $ active = "id = \"aktiv \ "";
    }
    annat (
    $ active = "";
    }
    if ($ värde ["menutitle"]! = "") (
    $ titel = $ värde ["menytitel"];
    }
    annat (
    $ title = $ värde ["pagetitle"];
    }
    $ objekt. = "
    ". $ titel."
    \ n "; // samla menyalternativ
    }

    // Om minst ett menyalternativ hittades,
    // skapa HTML-koden för menyn
    if ($ objekt! = "") (
    $ output = "

      \ n ";
      $ output. = $ objekt;
      $ output. = "
    \ n ";
    }

    // Returnera resultatet av kodavsnittet
    returnera $ output;

    Försök nu att skriva in lite text i inmatningsfältet "Menyalternativ" i vilket dokument som helst ... Fungerar allt? Underbar!

    PS: Vissa läsare kanske kommer att bli förvånade över att när du klickar på länkarna i vår meny så ändras inte innehållet på sidorna, även om det verkar som att vi, att döma av sökvägen i webbläsaradressen, flyttar till nya sidor .. Tro mig, det här är helt normalt, för absolut alla sidor använder för närvarande samma mall. I den här mallen har vi faktiskt bara gjort toppmenyn dynamisk än så länge, alla andra detaljer förblir oförändrade. Vi kommer definitivt att ta itu med det här senare, men för nu - få inte panik;).

    Slutsats:

    Så, ytterligare en artikel har kommit till sin logiska slutsats.

    Lärandemål:

    • Vi försökte förstå syftet med några av inmatningsfälten för MODx-dokument och undersökte lagringen av denna information i databasen;
    • Fick reda på nya speciella MODx-konstruktioner: [], [! SnippetName!], [~ Id ~];
    • Lärde sig om tillgängligheten av ett speciellt API och använde några av API-funktionerna;
    • Och baserat på denna kunskap skapade vi vårt nya utdrag i MODx!

    När man skickar in en färdig hemsida försöker webbmasterns visitkort att automatisera alla processer så mycket som möjligt så att kunden, efter leveransen av projektet, inte drar i dem på bagateller. Ett av de vanligaste problemen är just med att skapa och redigera nya menyalternativ.

    Därför är en av huvuduppgifterna för en webbansvarig att skapa en dynamisk meny så att alla åtgärder för att redigera menystrukturen kan utföras från den administrativa panelen.

    Detta kan göras med speciella MODx-verktyg - snippets.

    UtdragÄr php-kod som körs i MODx-mallen och låter dig visa information från CMS-databasen.

    Utdrag är indelade i två typer:

    • cachad;
    • inte cachebart.

    Deras skillnad ligger i samtalsdesignen. Så, till exempel, om vi har ett utdrag med namnet "SNIPNAME", kommer strukturen att se ut så här med ett icke-cachelagrat anrop:

    [! SNIPNAME!]

    Med en cachad version kommer det att se ut så här:

    []

    Här kan frågan uppstå, varför göra utdraget cachebart? Faktum är att när man använder cachen sparas strukturen och det finns ingen konstant åtkomst till databasen, vilket i sin tur ökar hastigheten på att ladda sidor och minskar belastningen på servern. Men ofta kan du inse att efter att ha gått in i cachen utför webmastern några åtgärder, men de visas inte på webbplatsen, för att visa dem måste du först rensa den föråldrade cachen. Jag ska prata om det här lite senare. Vi kommer att använda menyalternativet som inte är cachad.

    Den andra viktiga egenskapen hos utdrag är - Extra tillval, som kan ställas in direkt när den här konstruktionen anropas. Diagrammet ser ut så här:

    [! SnippetName? & parameter1 = `parametervärde` & parameter2 =` parametervärde`!]

    Skylt "?" - ger systemet en signal om att det följs av parametrar som måste appliceras på kodavsnittet. Och själva utdragen är åtskilda av "&"-tecknet, och värdena är omgivna av bakre citattecken. Om du sätter fel citat kommer ingenting att fungera.

    Hur anpassar man den dynamiska visningen av menystrukturen?

    För att visa menyn i MODx använder vi ett utdrag:

    [! Wayfinder!]

    Vi kommer inte att kunna använda det i sin "rena form", eftersom detta kräver närvaro av inbäddade material, och det kommer endast att visas på huvudsidan. Det kommer att vara korrekt att ange id för artikeln från vilken det är värt att räkna. Med denna metod kan vi skapa många olika menyer med hjälp av id för detta. I praktiken blir det tydligare.

    Eftersom nu den överordnade punkten är "Main" med värdet id = 1. Då bör strukturen se ut så här:

    Med den här konstruktionen kan du ta ut menyn ur barnartiklarna. Låt oss omsätta detta i praktiken.

    Vi går till avsnittet "Element" - "Hantera element" - Fliken "Chunks". Vi väljer "HEADER"-biten och hittar i den koden som är ansvarig för att visa menyn.

    HEM

    • Hem
    • om oss
    • tjänster
    • projekt
    • lösningar
    • jobb
    • blogg
    • kontakter

    Låt oss infoga ovanstående kodavsnittskonstruktion istället för denna kod:

    [! Wayfinder? & startId = `1`!]

    Som du kan se är menyn ansluten, webbadressen ändras i adressfältet, även om mallen förblir densamma, kommer vi att fixa det i nästa lektion.

    Men det finns två problem:

    1.) Det aktiva menyalternativet är inte markerat.

    2.) Det finns inget menyalternativ "Hem".

    Låt oss åtgärda dessa brister.

    Vi kopplar det aktiva menyalternativet

    Som standard utgör Wayfinder-kodavsnittet det aktiva menyalternativet med den "aktiva" klassen. Så vi behöver inte lägga till ett extra skript, utan bara ändra klassen i css-filen. För att göra detta, gå till mappen med vår mall - /assets/templates/retina/css/style.css. Observera att mappnamnet på mallmappen kan skilja sig åt för dig, allt beror på vilket namn du angav under de första lektionerna. Öppna den här filen och leta efter en rad med stilar för det aktiva menyalternativet. Jag har den här raden - 190, och här är själva koden:

    #navigation a.nav-btn (marginal-bottom: 15px; text-decoration: none; padding: 0 36px 0 10px; line-height: 30px; display: block; background: url (images / navigation.png) repeat-x 0 0; höjd: 30px; position: relativ;)

    Ersätt klassen ".nav-btn" med "active".

    Vi ansluter "Hem"

    Och så, som ni förstår, har vi tagit bort dotterobjekten från menyalternativet "Hem". För att ta upp det här objektet i sig måste vi ha hela vår meny på samma kapslingsnivå.

    Först kontrollerar vi om åtkomsten till rotmappen är öppen. För att göra detta, gå till avsnittet "Verktyg" - "Konfiguration" - Fliken "Användare". I den hittar vi parametern - " Tillåt åtkomst till rotmappen"Och ställ in värdet på" Ja ".

    Efter det, välj objektet, låt oss säga "Tjänster", gå till sidan för att redigera det och klicka på ikonen nedan, som visas på skärmdumpen.

    Efter att ha klickat måste du välja föräldermenyalternativet i den vänstra kolumnen av material, vi väljer hästmappen. Se skärmdump nedan.

    Klicka på den och spara vår artikel. Själva materialet ska flyttas en nivå med "Main".

    Denna åtgärd måste göras med alla understycken. Du bör ha följande struktur.

    Om du uppdaterar sidan på din webbplats nu försvinner din meny. Detta beror på att det överordnade kategori-ID har ändrats. Låt oss justera det. För att göra detta, gå till avsnittet "Element" - "Hantera element" - Fliken "Chunks". Välj "HEADER"-biten och hitta koden i den:

    [! Wayfinder? & startId = `1`!]

    Och ändra till:

    Det är allt, menyn är helt klar och matchar mallen.

    Om du märkte det kan du se från mallen att vi i sidfoten har en meny som exakt upprepar objekten i alternativet vi just skapade. Därför föreslår jag att även detta block omedelbart korrigeras. För att göra detta, gå till avsnittet "Element" - "Hantera element" - Fliken "Chunks" välj biten "FOOTER". I den hittar vi koden som är ansvarig för att visa bottenmenyn, och istället för den infogar vi den redan bekanta konstruktionen.

    [! Wayfinder? & startId = `0`!]

    Här är vad du bör få.

    Det är allt för idag. Om du har några frågor, skriv dem i kommentarerna, jag ska försöka svara på dem. Tills nästa lektioner.

    Hälsningar kära läsare. På förra lektionen fyllde vi på sidan lite med innehåll (), nu är det dags att ta med allt till menyn så att användarna kan navigera till dem.

    Skapa dynamik menyn i MODX vi kommer att använda ett utdrag PdoMeny från paketet pdoTools... Kolla in den grundläggande dokumentationen innan du börjar.

    PdoMenu dokumentation

    alternativ

    Mallparametrar

    CSS-klassparametrar

    Officiella exempel


    du kan läsa den officiella dokumentationen här. Låt oss nu ta en titt på de mest typiska menyanropen.

    Ringer PdoMenu

    Alternativ 1... I stället för denna statiska meny anropa pdoMenu-kodavsnittet, för detta i resursträdet, på fliken " Elementen”I avsnittet utdrag expandera grenen pdoTools, klicka sedan på pdoMeny vänsterklicka (släpp inte knappen) och dra detta utdrag till platsen där du vill anropa menyn, fyll sedan i de nödvändiga parametrarna i fönstret som öppnas och klicka på " Spara«.

    Alternativ 2... Vi skriver bara samtalet manuellt.

    Typiska exempel

    Normal meny på en nivå

    Till exempel har vi den vanligaste menyn, med följande html-uppmärkning.

    Vi fick följande kod med ett menyanrop:

    • & föräldrar = `0` - en lista över föräldrar (i mitt fall begränsar jag inte urvalet, eftersom jag ändå bara kommer att visa vissa sidor);
    • & level = `1` - kapslingsnivå (i detta fall är den inte det);
    • & resurser = `2,3,4,5` - en lista över resurser som ska visas i menyn;
    • & firstClass = `0` - klass för det första menyalternativet (inte någon);
    • & lastClass = `0` - klassen för det sista menyalternativet (inte någon);
    • & outerClass = `toppmeny` - klass för menyomslaget (ersätts med ul);
    • & hereClass = `current-meny-item` - klass för det aktiva menyalternativet (ersatt i li);
    • & rowClass = `meny-item` - klass av en menyrad (ersatt i li).

    Anpassad bootstrap-meny på två nivåer

    Den statiska html-koden ser ut så här:

    Dess utdatakod kommer att vara så här:

    I nästa lektion kommer jag också att ge ett par fler slutsatser av rullgardinsmenyer, baserade på bootstrap (och det här är för dem som inte förstod poängen. Ja, då gör vi det.

    Vid första anblicken ser allt komplicerat ut, men det är inte så, läs dokumentationen mer detaljerat, ställ frågor i kommentarerna, jag kommer definitivt att hjälpa.