Стъпка 4

Както казах по-рано, няма да търсим лесни начини. Най-общо казано, горното меню може да се направи с помощта на добре познати фрагменти като Ditto, Wayfinder. но това не е за нас;).

Ще направим всичко от нулата. Защо имахме нужда (аз) от това, защото вече има готови опции? Защото ми харесва повече. Защото смятам, че този подход е най-правилният. Тъй като, знаейки как да разработим свой собствен, можем лесно да разберем кода на някой друг, да променим, поправим грешки или да го допълним с функционалността, необходима в даден случай. И в крайна сметка правенето на собствените си неща често е толкова приятно!

По-нататъшното повествование ще приеме, че читателят има минимални познания за програмиране на PHP. На теория тези хора, които изобщо не разбират кода, ще могат да копират кода и да възпроизведат всички стъпки, които ще бъдат разгледани по-долу. Все пак може да е по-добре за тях да използват готови фрагменти а ла Ditto, тъй като те предоставят куп възможности за външна конфигурация, без да влизат в основния код.

Не искам да споря какво е по-добре за потребителя - да вземе готов или да разработи свой собствен. И в този, и в друг случай има плюсове и минуси. За мен лично има повече предимства във втория вариант. Също така всеки от читателите ще реши сам.

Така че нека да разгледаме отново нашия шаблон. Тъй като в нашия сайт има доста различни софтуерни части и трябва да започнете с нещо, така че ние ще програмираме ...

Главно меню

Под термина "горно меню" имам предвид набор от връзки към страници в горната част на сайта (вижте снимката по-долу):

Ще опиша много подробно първия пример за създаване на фрагмент, в бъдеще ще се спра основно на най-съществените подробности.

Нека сравним с нашето дърво на сайта в системата за управление, която изградихме в предишната статия:

getDocumentChildren активен изтрито

Позволете ми също да ви напомня, че преди това сме скрили документи, които не искаме да показваме в менюто. Например в настройките на документа с името „Търсене в сайта“ бе премахната отметката „Показване в менюто“, а останалите два документа „Връзки“ и „Категории“ скрихме на сайта, като премахнахме отметката в настройки на документа „Публикуване“ (раздел „Настройки на страницата“ в настройките на документа).

Така в предишната статия подготвихме горното меню в системата за управление.

Сега да преминем към въпроса за показването на нашите действия директно на сайта.

Повечето програми в сайта се изпълняват от т.нар. „фрагменти“, т.е. отделни парчета код (те също могат да се разбират като отделни функции или подпрограми) в PHP. Следователно, за да приложим дисплея на горното меню в MODx, ние също трябва да създадем нов фрагмент, да го програмираме и да добавим повикване към този фрагмент в шаблона на правилното място.

Нека отидем в системата за управление, отворете раздела „Ресурси“ -> „Управление на ресурсите“ -> раздела „Фрагменти“ и кликнете върху връзката „Нов фрагмент“. В полето "Име на фрагмент" въведете "TopMenu" без кавички и засега просто запазете празен фрагмент без код. След като запазим, ще видим името на нашия фрагмент в раздела „Фрагменти“.

Позволете ми да ви напомня, че в нашия шаблон преместихме горното меню в парчето "TOPMENU". Преминете към раздела "Парчета" и отворете парчето "TOPMENU". В съдържанието на тази част ще видим следния код:

Тук отново трябва да се отклоним малко, за да изясним значението на тази конструкция [[TopMenu]]. Факт е, че с помощта на конструкции като [[SnippetName]] или [! SnippetName!] Можем да правим извиквания на фрагменти навсякъде в нашите шаблони, парчета и дори само на всяка отделна страница на сайта.

В този случай конструкцията [[SnippetName]] означава извикване на кеширан фрагмент, т.е. извикване на динамична подпрограма, резултатът от която ще бъде изчислен и изпълнен веднъж, а по-късно при зареждане на страницата, където се извиква този фрагмент, резултатът ще бъде непроменен, тъй като фрагментът не се извиква отново. По този начин спестяваме ресурсите на нашия уеб сървър (и това винаги е много важно при голям трафик към ресурса).

Има обаче ситуации, когато трябва да изпълнявате кода на фрагмента през цялото време и не можете да кеширате резултатите. В такива случаи се използва конструкцията [! SnippetName!], Която винаги ще принуди фрагмента да бъде изпълнен без кеширане. По аналогия тази конструкция се нарича извикване на некешируем фрагмент.

Да се ​​върнем към раздела „Фрагменти“, да отворим създадения фрагмент „TopMenu“ и да се опитаме да тестваме неговите възможности ... Търпение, моите напреднали читатели, не всеки знае тези подробности.

Първо, нека напишем най-простия код (обикновен PHP код):

Преди да запазите, изберете "Продължи редактиране", тъй като ще трябва да променяме съдържанието на нашия фрагмент повече от веднъж и след това ще запазим фрагмента. Опреснете страницата на сайта и вижте на мястото на горното меню ... е, честно казано, на пръв поглед няма да видим почти никакви промени, с изключение на леко разширения син фон на менюто. Натиснете „CRTL + A“, за да изберете целия текст на страницата на сайта и ще видим, че в края на краищата нашият фрагмент е показал текста „Тестване ...“ вместо менюто, просто цветът на текста съвпада с цвета на фона.

Нека променим кода на фрагмента на следното:

Отново малко разсейване.

Цялата система от взаимоотношения с документи в MODx е изградена според принципа: всеки "родителски документ" съдържа от нула до много "дъщерни документи" ("родител" -> "деца").

Всеки документ в базата данни MODx има свой уникален идентификатор "ID" - това е числото, което виждаме в скоби в дървото на сайта до всеки от документите.

Между другото, този уникален идентификатор носи само едно единствено значение - той уникално идентифицира конкретен документ в системата за контрол и нищо повече! Специално наблягам на този факт, тъй като съм срещал многократни опити за промяна на тези идентификатори за различни цели. Трябва веднага да запомните, че това е просто безсмислено, така че не се опитвайте да променяте тези числа. Изобщо не трябва да им обръщате голямо внимание, обикновено тези числа се използват просто за генериране на връзки към определени документи.