PdoMenu — створення меню MODX. Багаторівневе MODX меню за допомогою Bootstrap Modx меню на певних сторінках

Але це не для нас;).

Ми ж зробимо все з нуля. Навіщо нам (мені) це знадобилося, адже вже є готові варіанти? Тому що мені так подобається. Тому що я вважаю подібний підхід найвірнішим. Тому що, вміючи розробляти своє, ми легко зможемо розібратися в чужому коді, змінити, виправити помилки або доповнити його необхідним у конкретному випадку функціоналом. Та й, зрештою, зробити своє – це часто так приємно!

Подальша розповідь матиме на увазі, що читач має мінімальне знання PHP програмування. Теоретично ті люди, які зовсім не розуміють код, зможуть скопіювати код і відтворити всі ті дії, про які йтиметься нижче. Однак, можливо, для них краще використовувати готові сніпети а-ля Ditto, оскільки вони надають купу можливостей для зовнішнього конфігурування, не влазячи в основний код.

Я не хочу дискутувати на тему, що краще для користувача – брати готове або розробляти своє… І в тому, і в іншому випадку є свої плюси та мінуси. Особисто для мене плюсів у другому варіанті більше. Також і кожен із читачів визначиться сам.

Отже, подивимося знову на наш. Оскільки різних програмних частину нашому сайті досить багато, а починати з чогось потрібно, тому запрограмуємо.

Верхнє меню

Під терміном " Верхнє менюя розумію набір посилань на сторінки у верхній частині сайту (див. малюнок нижче):

Перший приклад створення сніпету я опишу дуже докладно, надалі я зупинятимуся в основному на найбільш істотних деталях.

Порівняємо з нашим деревом сайту в системі управління, яке ми збудували в попередній статті:

Як видно з малюнка, у дереві сайту виділяються чотири документи (а саме "Блог", "Про авторів", "Фотографії" та " Зворотній зв'язок"), які й створять згодом посилання у верхньому меню.

Також нагадаю, що ми заздалегідь приховали документи, які не хочемо показувати в меню. Наприклад, у налаштуваннях документа з назвою "Пошук по сайту" прибрали прапорець "Показувати в меню", а два документи "Посилання" та "Категорії", що залишилися, ми приховали на сайті, прибравши прапорець в налаштуваннях документа "Публікувати" (закладка "Налаштування сторінки" у налаштуваннях документа).

Таким чином, ми в попередній статті підготували верхнє меню в системі управління.

Перейдемо до питання відображення наших дій безпосередньо на сайті.

Більшість програм на сайті виконують т.зв. " ", тобто. окремі шматки коду (їх також можна розуміти як окремі функції чи підпрограми) на PHP. Тому, щоб реалізувати в MODx виведення верхнього меню, ми також повинні створити новий сніпет, запрограмувати його і додати виклик цього сніпет в шаблоні в потрібному місці.

Зайдемо в систему управління, відкриємо закладку "Ресурси" -> "Управління ресурсами" -> закладка "Сніпети" і натиснемо на посилання "Новий сніпет". У полі "Назва сніпету" впишемо "TopMenu" без лапок і поки що просто збережемо порожній сніпет без коду. Після збереження ми побачимо назву нашого сніпета на закладці "Сніпети".

Нагадаю, що у нашому шаблоні верхнє меню ми винесли у чанк "TOPMENU". Переключимося на закладку "Чанки" та відкриємо чанк "". У вмісті цього чанка ми побачимо наступний код:


  • Блог

  • Про авторів

  • Фотографії

  • Зворотній зв'язок

Цей код таки створює наше меню. Закоментуємо його та додамо виклик сніпету "TopMenu" у чанці:


[]

Тут знову доведеться трохи відволіктися, щоб пояснити сенс цієї конструкції. Справа в тому, що саме за допомогою конструкцій виду [] або [! SnippetName!] ми можемо робити виклики сніппетів у будь-якому місці своїх шаблонів, чанків і навіть просто на будь-якій окремій сторінці сайту.

При цьому конструкція [] означає виклик кешуєтьсясніпета, тобто. виклик динамічної підпрограми, результат виконання якої буде підрахований і виконаний один раз, а згодом при завантаженні сторінки, де викликається цей сніпет, результат буде незмінним, т.к. повторний виклик сніпет уже не відбувається. Таким чином, ми заощаджуємо ресурси свого веб-сервера (а це завжди має дуже важливе значення за високої відвідуваності ресурсу).

Проте існують ситуації, коли необхідно весь час виконувати код сніпет заново і кешувати результати не можна. У таких випадках використовується конструкція [!SnippetName!], яка завжди змусить сніппет виконуватись без кешування. За аналогією, ця конструкція називається викликом некешуєтьсяСніппет.

Отже, збережемо чанк "TOPMENU" та оновимо сторінку сайту. Хм, як не дивно, але верхнє меню зникло. Але чи це так дивно насправді? Закоментувавши HTML код меню в чанці, ми приховали його відображення у браузері (перевірте це, глянувши у вихідний код HTML сторінки). А наш сніпет "TopMenu" нічого не робить, оскільки в нього ще нічого не додано. Виправимо ж цей недолік:).

Перейдемо знову на закладку "Сніпети", відкриємо створений сніпет "TopMenu" і спробуємо протестувати його можливості... Терпіння, мої просунуті читачі, не всім знайомі ці деталі.

Для початку напишемо найпростіший код (звичайний PHP код):

echo "Testing…";
?>

Перед збереженням оберемо "Продовжити редагування", т.к. нам доведеться ще не раз змінити вміст нашого сніпета, і після цього збережемо сніпет. Обновимо сторінку сайту і побачимо на місці верхнього меню ... ну, по правді кажучи, на перший погляд ми не побачимо майже жодних змін, крім синього фону меню, що злегка розширилося. Натисніть "CRTL+A", щоб виділити весь текст на сторінці сайту, і побачимо, що все-таки наш сніппет вивів на місці меню текст "Testing…", просто колір тексту збігається з кольором фону.

Змінимо код сніпета на наступний:

echo " Testing...";
?>

Тепер ми ясно бачимо, що наш сніппет працює і навіть (!) виводить деякий текст. Що ж, це чудово, але замало для нашого завдання, оскільки ми повинні домогтися, щоб наш сніпет виводив посилання з системи управління, причому в точно такому ж HTML коді, який ми закоментували в чанці "TOPMENU".

І знову невелике відволікання...

Вся система взаємозв'язків документів у MODx побудована за принципом: кожен "батьківський документ" містить від нуля до безлічі "дочірніх документів" ("parent" -> "childs").

Кожен документ у базі даних MODx має свій унікальний ідентифікатор "ID" - це число, яке ми бачимо в дужках у дереві сайту поруч із кожним із документів.

До речі, цей унікальний ідентифікатор має лише одне єдине значення - він однозначно визначає конкретний документ у системі управління і нічого більше! Спеціально наголошую на цьому факті, оскільки зустрічав неодноразові спроби змінити ці ідентифікатори в найрізноманітніших цілях... Запам'ятати треба одразу, що це просто безглуздо, тому не намагайтеся змінювати ці цифри. На них взагалі не варто звертати багато уваги, зазвичай ці цифри використовуються просто для створення посилань на певні документи.

У базі даних MODx для кожного документа створено спеціальне поле "parent". Значенням даного поля є число, що позначає або унікальний ідентифікатор батьківського документа, або якщо документ знаходиться в корені дерева, нуль. Таким чином, завжди можна однозначно визначити, який саме документ є для цього батьківським.

Щоб наочно побачити те, про що ми зараз говорили, відкрийте phpMyAdmin, виберіть свою базу даних і знайдіть таблицю (PREFIX) site_content, де (PREFIX) - Ваш префікс, який Ви ввели під час встановлення. Ви побачите безліч полів, у яких зберігаються певні дані документів, зокрема "ID" - унікальний ідентифікатор, "parent" - номер батьківського документа, "pagetitle" - заголовок сторінки та інші.

Отже, використовуючи цю інформаціюЩодо принципу зберігання та зв'язку документів у MODx, ми можемо зрозуміти, як отримати потрібні дані для виведення посилань верхнього меню: нам потрібно знайти в базі даних усі документи, що знаходяться в корені дерева сайту, тобто. мають у полі "parent" значення нуль.

Використовуючи SQL мову, такий запит описується якось так (Ви можете спробувати ввести даний запиту полі введення SQL у phpMyAdmin, попередньо замінивши "modx_" на свій префікс):

SELECT *
FROM `modx_site_content`
WHERE `parent` = 0;

Однак такий запит поверне нам абсолютно всі документи з кореня сайту, що не зовсім правильно, виходячи з основного завдання – вивести посилання лише на ті документи, які мають:

  • опублікований статус (у БД цей пункт відповідає полі " published " , де значення = 1 позначає, що документ опублікований, а значення = 0 - неопублікований).
  • невіддалені (поле "deleted", де 1 - видалено, а 0 - не видалено),
  • і у яких встановлена ​​опція "Показувати в меню" (поле "hidemenu", де 1 – приховувати, а 0 – показувати у меню).

Крім того, забігаючи трохи вперед, ми одразу відсортуємо документи за параметром "Позиція в меню", який визначатиме позицію кожного посилання в нашому меню.

Ну, з погляду SQL, це дуже нескладне завдання і вирішується вона так:

SELECT *
FROM `modx_site_content`
WHERE `published` = 1
AND `parent` = 0
AND `deleted` = 0
AND `hidemenu` = 0
ORDER BY `menuindex` ASC;

Теоретично всі SQL запити можна виконувати у сніпетах безпосередньо за допомогою PHP скриптів, підключаючи кожного разу базу даних наново і роблячи безліч інших рутинних операцій, повторюючи їх раз за разом ... Але, погодьтеся, це нівелювало б сенс використання фреймворку, яким, безумовно, є наша система управління, т.к. MODx, крім інших своїх переваг, надає готовий набір коштів програмного інтерфейсу(API, Application Programming Interface). API - це програмні функції, які уніфікують та полегшують багато процесів обробки даних.

Використовуємо одну зі згаданих функцій API "getDocumentChildren" у нашому сніпеті. Функція "getDocumentChildren" отримує у вигляді параметрів такі дані:

  • $id - номер батьківського документа,
  • $active - вибирати тільки опубліковані або неопубліковані документи (1 або 0 відповідно),
  • $deleted - вибирати тільки видалені чи невидалені документи (1 | 0),
  • $fields - поля, які вибираються із БД,
  • $where - особливі умови, тобто. умова WHERE в SQL запиті,
  • $ sort - поле, за яким має проводитися сортування результатів
  • $direction - напрямок сортування, може приймати значення ASC чи DESC, тобто. сортування від меншого до більшого значення або навпаки
  • $limit – обмеження запиту, тобто. умова LIMIT у SQL запиті

$results = $modx->getDocumentChildren(
$id = 0,
$active = 1,
$deleted = 0,
$where = "hidemenu = 0",
$sort="menuindex",
$dir="ASC",
$limit
);

Print("

Foreach($results as $key => $value) (
print_r($value);
}

Print("");
?>

Збережіть сніпет і оновіть сторінку. В результаті виконання оновленого сніпету "TopMenu" Ви побачите список з масивів та їх значень, відсортований за значеннями поля "menuindex" від меншого до більшого. Спробуйте змінити параметр $dir="ASC" на $dir="DESC" - в результаті масиви перебудуватимуться і першим документом буде виведений документ з найбільшим значенням поля "menuindex".

Програмістам зі стажем, мабуть, зрозуміло, що отриманий результат уже дає все, що потрібно, щоб побудувати готове меню із посиланнями. Ну, майже все. У будь-якому випадку я продовжу: перепишемо код PHP, щоб максимально наблизитися до бажаного результату.

$results = $modx->getDocumentChildren(
$id = 0,
$active = 1,
$deleted = 0,
"id, pagetitle, published, menuindex, deleted, hidemenu, menutitle",
$where = "hidemenu = 0",
$sort="menuindex",
$dir="ASC",
$limit
);

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

Foreach($results as $key => $value) (
$items .= "


  • ".$value["pagetitle"]."
  • \n";
    }

    If ($items != "") (
    $output = "

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

    Return $output;

    Детально код розбирати не будемо, оскільки це звичайнісінький PHP код, не більше. Якщо комусь не зрозумілий сенс будь-яких конструкцій, прошу у коментарі, а краще – на відповідні форуми підтримки.

    Збережемо новий код сніпету та оновимо сторінку. В результаті виконання коду ми побачимо практично те, що й хотіли отримати:

    Тобто. це автоматично згенеровані посилання, структура яких повністю повторює структуру документів у дереві MODx. Щоб перевірити це, спробуйте створити якийсь тестовий документ у корені сайту та оновіть сторінку.

    Однак, це ще не все. Багато хто вже напевно помітив, що посилання є, але посилань немає... Парадокс:). Я маю на увазі, що назви документів у меню виводяться, проте посилання на них не працюють. Це логічно, оскільки поки що в коді посилань виводиться "#" замість реальних шляхів.

    Щоб вирішити це завдання, необхідно дізнатися ще про одну вкрай корисну можливість MODx: адресу будь-якої внутрішньої сторінки сайту можна отримати за допомогою наступної конструкції [~id~], де id - це унікальний номер потрібного документа, тобто. цей номер, вказаний у дужках поруч із назвою кожного документа в дереві сайту. Таким чином, додавши таку конструкцію [~1~] у шаблоні/чанці/вмісті сторінки,

      • index – аліас документа "Блог", якщо ми ввели "index" як аліас документа, або
      • 1.html, якщо ми не вводили нічого у полі "Псевдонім" для документа "Блог"
    • якщо дружні посилання відключені, побачимо текст index.php?id=1

    Перепишемо сніпет, використовуючи цю інформацію:

    $results = $modx->getDocumentChildren(
    $id = 0,
    $active = 1,
    $deleted = 0,
    "id, pagetitle, published, menuindex, deleted, hidemenu, menutitle",
    $where = "hidemenu = 0",
    $sort="menuindex",
    $dir="ASC",
    $limit
    );

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

    Foreach($results as $key => $value) (
    $items .= "


  • ".$value["pagetitle"]."
  • \n";
    }

    If ($items != "") (
    $output = "

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

    Return $output;

    Отже, ми змінили # на [~".$value["id"]."~], тобто. практично кожному документу з масиву підставляється його унікальний ID всередині конструкції [~id~]. В результаті ми отримуємо меню з працюючими посиланнями.

    Ми практично досягли ідеалу... Однак і тепер ще залишається одна деталь, яку потрібно обов'язково врахувати: дизайнер визначив, що активне посилання у нас має бути підсвічене білим тлом і колір посилання відповідно має бути змінено на помаранчевий.

    Щоб досягти цього, ми знову відкриємо секрети MODx CMS:). В API прихована функція $modx->documentIdentifier, яка повертає значення унікального ідентифікатора поточної сторінки. Вона нам знадобиться для визначення активної сторінки та виділення її в меню:

    $results = $modx-> getDocumentChildren (
    $id = 0,
    $active = 1,
    $deleted = 0,
    "id, pagetitle, published, menuindex, deleted, hidemenu, menutitle",
    $where = "hidemenu = 0",
    $sort="menuindex",
    $dir="ASC",
    $limit
    );

    $cid = $modx->documentIdentifier;

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

    Foreach($results as $key => $value) (
    if ($value["id"] == $cid) (
    $active = "id="active"";
    }
    else (
    $active = "";
    }
    $items .= "
    ".$value["pagetitle"]."
    \n";
    }

    If ($items != "") (
    $output = "

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

    Return $output;

    Ну як, вийшло? Вийшло!

    Але ж Ви не подумали, що на цьому все й закінчиться? І правильно. Ми ставимо собі найвищу планку, ми хочемо використовувати максимум можливостей MODx. А тому ще одна невелика деталь, яку ми пропустили.

    Уважно подивимося на назву полів, які ми запитуємо за допомогою функції getDocumentChildren: "id, pagetitle, published, menuindex, deleted, hidemenu, menutitle". Серед них є таке поле, як "menutitle". Як випливає з назви, у цьому полі може зберігатися заголовок меню. У системі керування також є поле "Пункт меню". Це поле не обов'язково заповнювати. Однак логіка в тому, що якщо це поле заповнене, то ми повинні замінити текст посилання в меню на введений користувачем. Ну, то зробимо це:

    /********************************
    Назва: TopMenu
    Ціль: Виведення верхнього меню
    Проект: Демосайт MODx
    ********************************/

    $results = $modx->getDocumentChildren(
    $id = 0, // ID батьківського документа
    $active = 1, // Вибираємо лише опубліковані документи
    $deleted = 0, // Вибираємо лише невидалені документи
    "id, pagetitle, published, menuindex, deleted, hidemenu, menutitle", // Вибираємо поля з БД
    $where = "hidemenu = 0" // Вибираємо тільки ті документи, які потрібно публікувати в меню
    $sort="menuindex", // Сортуємо документи по полю menuindex
    $dir="ASC", // Сортуємо документи щодо зростання
    $limit = "" // Обмеження не встановлюємо (параметр LIMIT у SQL запиті)
    );

    $cid = $modx->documentIdentifier; //отримуємо ID поточної сторінки

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

    Foreach($results as $key => $value) (
    if ($value["id"] == $cid) (
    $active = "id="active"";
    }
    else (
    $active = "";
    }
    if ($value["menutitle"] != "") (
    $title = $value["menutitle"];
    }
    else (
    $title = $value["pagetitle"];
    }
    $items .= "
    ".$title."
    \n"; //збираємо пункти меню
    }

    // Якщо вдалося знайти хоча б один пункт меню,
    // створюємо HTML код меню
    if ($items != "") (
    $output = "

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

    // Повертаємо результат роботи сніппета
    return $output;

    Спробуйте тепер ввести якийсь текст у полі введення "Пункт меню" будь-якого документа... Все працює? Чудово!

    PS: Можливо, деякі читачі будуть здивовані, що при переході за посиланнями нашого меню вміст сторінок не змінюється, хоча начебто, судячи з шляху на адресу браузера, ми переходимо на нові сторінки… Повірте, це абсолютно нормально, т.к. абсолютно всі сторінки зараз використовують один і той же шаблон. У цьому шаблоні практично ми поки що зробили динамічним лише верхнє меню, решта деталей залишаються постійними. Ми обов'язково займемося цим пізніше, а поки що - без паніки;).

    Висновок:

    Отже, ще одна стаття підійшла до свого логічного завершення.

    Підсумки навчання:

    • Ми спробували розібратися у призначенні деяких полів введення документів MODx та розглянули зберігання цієї інформації у базі даних;
    • Дізналися про нові спеціальні конструкції MODx: [], [!SnippetName!], [~id~];
    • Дізналися про наявність спеціального API та скористалися деякими функціями API;
    • І на основі цих знань створили свій новий сніпет в MODx!


    Wayfinderслужить в організацію списків посилань для MODX. Завдяки підтримці шаблонів дозволяє виводити списки у будь-якому необхідному вигляді:
    • Меню як списку, таблиці, зображень, з іконками тощо.
    • Статичні меню
    • Меню з різними ефектами (випадають, розкриваються тощо)
    • Карта сайту
    Приклад виклику:


    &rowTpl=`rowTpl`
    &outerTpl=`outerTpl`
    &hereClass=`active`
    &rowClass=`eNav_li`]]

    Параметри сніпету:

    &startId- id батьківської сторінки, якщо вказати 0 буде від кореня сайту. За замовчуванням стоїть значення id активної сторінки

    &displayStart - показувати документ зі startId у заголовку меню, за промовчанням false

    &level- глибина вкладеності, за замовчуванням 0 - всі рівні

    &limit- обмеження кількості сторінок у виводі (за замовчуванням 0 - без обмежень)

    &ignoreHidden- ігнорувати чек бокс сторінки "Показувати меню", тобто. якщо вказати 1, виведе усі сторінки. За замовчуванням 0. Виводяться лише ті сторінки, у яких відмічено чек боксу "Показувати в меню"

    &ph - ім'я підстановника, що замінює результати, що безпосередньо виводяться. Типово 0.

    &debug- режим налагодження (за замовчуванням 0)

    &hideSubMenus - розкривати лише активне підменю (за замовчуванням 0)

    &RemoveNewLines- прибирає символ перенесення рядка під час виведення (за замовчуванням 0)

    &textOfLinks- Назви посилання меню. Можливі варіанти:Menutitle, id, pagetitle, description, parent, alias, longtitle, introtext . За замовчуванням menutitle

    &titleOfLinks- для title посилання меню. Варіанти:Menutitle, id, pagetitle, description, parent, alias, longtitle, introtext. За замовчуванням pagetitle

    &rowIdPrefix- Встановлює id (rowIdPrefix + docId) для кожного елемента. Типово 0

    &includeDocs- id документів через кому, які будуть включені в меню (за замовчуванням не вказується)

    &excludeDocs - id документів через кому, які будуть виключені з меню (за замовчуванням 0)

    &contexts- Контекст для генерації меню. За промовчанням поточний.

    &startIdContext - Індентифікатор контексту, з якого беруться документи для формування результату.

    &config - Зовнішній PHP файл, збереження конфігурації Wayfinder (приклад: core/components/wayfinder/configs).

    &scheme - Формат для створення URL. Можливі значення (засновані на виклик makeURL API):

    1: (за замовчуванням) URL по відношенню до site_url;

    0: дивіться http;

    1: дивіться https;

    full: абсолютний URL, що починається з site_url;

    abs: абсолютний URL, що починається з base_url;

    http: абсолютний URL, заданий вимушено у http-схемі;


    https: абсолютний URL, заданий вимушено у https-схемі.

    &sortBy - Поле, яким відбувається сортування. (за замовчуванням menuindex)

    Варіанти:

    id, menutitle, pagetitle, introtext, menuindex, published, hidemenu, parent, isfolder, description, alias, longtitle, type, template

    &sortOrder- Порядок сортування."ASC" або "DESC". Типово ASC

    &where - JSON-стиль параметрів фільтрації (Відповідає where у MySQL). Наприклад, коли потрібно приховати блог або новини з доповнення Articles: &where=`[("class_key:!=": "Article")]`
    Приклади:
    виведення тільки папок: & where = `isfolder = 1

    &hereId - Визначати поточний ID для використання у сніпеті. Використовуйте [[*id]], якщо шаблон вказаний за допомогою hereTpl та activeRowParentTpl не застосовується коректно в пункті меню. За промовчанням поточний ід.
    Потрібно вказувати лише якщо скрипт сам його неправильно визначає, наприклад, при виведенні меню з чанка іншого сніпета.

    &hereTpl - Шаблон hereTpl використовується, коли поточний пункт відображається в меню.
    Можливі плейсхолдери:
    [[+wf.classes]] - місце для вказівки використовуваного CSS-класу (включає class=" ")
    [[+wf.classnames]] - містить лише назву CSS-класу (не включає class=" ")
    [[+wf.link]] - адреса (href) для посилання
    [[+wf.title]] - текст для title посилання
    [[+wf.linktext]] - текст назви посилання
    [[+wf.wrapper]] - місце для виведення підменю
    [[+wf.id]] - висновок унікального ідентифікатора (id)
    [[+wf.attributes]] - висновок додаткових атрибутівпосилання
    [[+wf.docid]] - ідентифікатор документа для поточного елемента
    [[+wf.subitemcount]] -кількість елементів у папці
    [[+wf.description]] - виводить значення поля опису
    [[+wf.introtext]] - виводить значення поля інтротексту

    Приклад шаблону: [[+wf.linktext]][[+wf.wrapper]]

    Параметри шаблону

    Ці параметри вказують чанки, які містять шаблони, які генеруватимуть висновок Wayfinder.

    В поточної версії Wayfinder для MODX RevolutionВи можете отримати доступ до вашого кастомного TV за допомогою плейсхолдерів префіксу wf. , наприклад [[+my_TV]]

    На момент написання статті, буде повернено лише вихідні значення TV - вони не форматуватимуться. Наприклад, якщо вашим TV є зображення - звичайне використаннятаке TV всередині вашого шаблону повертатиме повний повний тег зображення, але всередині шаблону Wayfinder - буде повернено тільки шлях до зображення.

    Якщо ви хочете обробляти TV, ви можете зробити це викликом Сніппет в межах шаблону ряду Wayfinder (&rowTpl . Наприклад ваш TV зображення називається iconі зазвичай для виведення у шаблоні використовується приблизно такий код:

    ... ...

    Але оскільки це не дозволить вам обробляти TV, потрібно замінити його на:

    ... ...

    І тепер усередині сніппета processTV поміщаємо наступний PHP код:

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

    В результаті повертається повністю оброблене зображення TV.

    &outerTpl

    Назва чанка містить шаблон зовнішнього контейнера.

    Доступні плейсхолдери:

    • wf.classes - виводить класи, взяті з набору параметрів Wayfinder (включаючи атрибут class="")
    • wf.classnames - виведення назви класів (без class="")
    • wf.wrapper – виведення внутрішнього вмісту (row).
      [[+wf.wrapper]]

    Параметр &innerTpl містить такий самий набір плейсхолдерів що &outerTpl .

    &rowTpl

    Назва чанка містить шаблон елементів ряду меню.

    Доступні плейсхолдери:

    • wf.classes - виведення класів (включаючи атрибут class="")
    • wf.classnames - виведення відповідних класів (без class="")
    • wf.link – значення атрибуту href="" для посилання меню
    • wf.title - ім'я тексту заголовка для посилання від поля вказаного у параметрі &titleOfLinks
    • wf.linktext - текст для чинного посилання, вказаному в полі, переданому в параметрі &textOfLinks
    • wf.wrapper - виведення внутрішнього вмісту, наприклад, підменю
    • wf.id – висновок унікального ID атрибута. Вам потрібно вказати параметр &rowIdPrefix для того, щоб цей заповнювач міг отримати значення. Значення є префікс + docId.
    • wf.attributes – виводить посилання атрибутів для поточного елемента
    • wf.docid – ідентифікатор документа поточного елемента
    • wf.description - опис для поточного елемента
    • wf.level – поточний рівень вкладеності

    Приклад використання:

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

    Ще один варіант:

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

  • Приклади

    Першого рівня


    [[! Wayfinder? &startId=`0` &level=`1`
    &rowTpl=`rowTpl`
    &outerTpl=`outerTpl`
    &hereClass=`active`
    &rowClass=`eNav_li`]]

    Код чанка outerTpl



      [[+wf.wrapper]]

    Код чанка rowTpl



      [[+wf.wrapper]]

    Другого рівня (у цьому прикладі меню та пункти підменю були візуально на одному рівні

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

    Код чанка outerTplFooterMenu



    [[+wf.wrapper]]

    код чанка rowTplFooterMenu




    • [[+wf.title]]


    • [[+wf.wrapper]]

    код чанка innerTplFooterMenu

    [[+wf.wrapper]]

    код чанка innerRowTplFooterMenu



  • [[+wf.title]]




  • Wayfinderслужить в організацію списків посилань для MODX. Завдяки підтримці шаблонів дозволяє виводити списки у будь-якому необхідному вигляді:
    • Меню як списку, таблиці, зображень, з іконками тощо.
    • Статичні меню
    • Меню з різними ефектами (випадають, розкриваються тощо)
    • Карта сайту
    Приклад виклику:


    &rowTpl=`rowTpl`
    &outerTpl=`outerTpl`
    &hereClass=`active`
    &rowClass=`eNav_li`]]

    Параметри сніпету:

    &startId- id батьківської сторінки, якщо вказати 0 буде від кореня сайту. За замовчуванням стоїть значення id активної сторінки

    &displayStart - показувати документ зі startId у заголовку меню, за промовчанням false

    &level- глибина вкладеності, за замовчуванням 0 - всі рівні

    &limit- обмеження кількості сторінок у виводі (за замовчуванням 0 - без обмежень)

    &ignoreHidden- ігнорувати чек бокс сторінки "Показувати меню", тобто. якщо вказати 1, виведе усі сторінки. За замовчуванням 0. Виводяться лише ті сторінки, у яких відмічено чек боксу "Показувати в меню"

    &ph - ім'я підстановника, що замінює результати, що безпосередньо виводяться. Типово 0.

    &debug- режим налагодження (за замовчуванням 0)

    &hideSubMenus - розкривати лише активне підменю (за замовчуванням 0)

    &RemoveNewLines- прибирає символ перенесення рядка під час виведення (за замовчуванням 0)

    &textOfLinks- Назви посилання меню. Можливі варіанти:Menutitle, id, pagetitle, description, parent, alias, longtitle, introtext . За замовчуванням menutitle

    &titleOfLinks- для title посилання меню. Варіанти:Menutitle, id, pagetitle, description, parent, alias, longtitle, introtext. За замовчуванням pagetitle

    &rowIdPrefix- Встановлює id (rowIdPrefix + docId) для кожного елемента. Типово 0

    &includeDocs- id документів через кому, які будуть включені в меню (за замовчуванням не вказується)

    &excludeDocs - id документів через кому, які будуть виключені з меню (за замовчуванням 0)

    &contexts- Контекст для генерації меню. За промовчанням поточний.

    &startIdContext - Індентифікатор контексту, з якого беруться документи для формування результату.

    &config - Зовнішній PHP файл для зберігання конфігурації Wayfinder (приклад: core/components/wayfinder/configs).

    &scheme - Формат для створення URL. Можливі значення (засновані на виклик makeURL API):

    1: (за замовчуванням) URL по відношенню до site_url;

    0: дивіться http;

    1: дивіться https;

    full: абсолютний URL, що починається з site_url;

    abs: абсолютний URL, що починається з base_url;

    http: абсолютний URL, заданий вимушено у http-схемі;


    https: абсолютний URL, заданий вимушено у https-схемі.

    &sortBy - Поле, яким відбувається сортування. (за замовчуванням menuindex)

    Варіанти:

    id, menutitle, pagetitle, introtext, menuindex, published, hidemenu, parent, isfolder, description, alias, longtitle, type, template

    &sortOrder- Порядок сортування."ASC" або "DESC". Типово ASC

    &where - JSON-стиль параметрів фільтрації (Відповідає where у MySQL). Наприклад, коли потрібно приховати блог або новини з доповнення Articles: &where=`[("class_key:!=": "Article")]`
    Приклади:
    виведення тільки папок: & where = `isfolder = 1

    &hereId - Визначати поточний ID для використання у сніпеті. Використовуйте [[*id]], якщо шаблон вказаний за допомогою hereTpl та activeRowParentTpl не застосовується коректно в пункті меню. За промовчанням поточний ід.
    Потрібно вказувати лише якщо скрипт сам його неправильно визначає, наприклад, при виведенні меню з чанка іншого сніпета.

    &hereTpl - Шаблон hereTpl використовується, коли поточний пункт відображається в меню.
    Можливі плейсхолдери:
    [[+wf.classes]] - місце для вказівки використовуваного CSS-класу (включає class=" ")
    [[+wf.classnames]] - містить лише назву CSS-класу (не включає class=" ")
    [[+wf.link]] - адреса (href) для посилання
    [[+wf.title]] - текст для title посилання
    [[+wf.linktext]] - текст назви посилання
    [[+wf.wrapper]] - місце для виведення підменю
    [[+wf.id]] - висновок унікального ідентифікатора (id)
    [[+wf.attributes]] - виведення додаткових атрибутів посилання
    [[+wf.docid]] - ідентифікатор документа для поточного елемента
    [[+wf.subitemcount]] -кількість елементів у папці
    [[+wf.description]] - виводить значення поля опису
    [[+wf.introtext]] - виводить значення поля інтротексту

    Приклад шаблону: [[+wf.linktext]][[+wf.wrapper]]

    Параметри шаблону

    Ці параметри вказують чанки, які містять шаблони, які генеруватимуть висновок Wayfinder.

    У поточній версії Wayfinder для MODX Revolution, ви можете отримати доступ до ваших кастомних TV за допомогою плейсхолдерів префіксу wf. , наприклад [[+my_TV]]

    На момент написання статті, буде повернено лише вихідні значення TV - вони не форматуватимуться. Наприклад, якщо вашим TV є зображення - звичайне використання таке TV всередині вашого шаблону повертатиме повний повний тег зображення, але всередині шаблону Wayfinder - буде повернено тільки шлях до зображення.

    Якщо ви хочете обробляти TV, ви можете зробити це викликом Сніппет в межах шаблону ряду Wayfinder (&rowTpl . Наприклад ваш TV зображення називається iconі зазвичай для виведення у шаблоні використовується приблизно такий код:

    ... ...

    Але оскільки це не дозволить вам обробляти TV, потрібно замінити його на:

    ... ...

    І тепер усередині сніппета processTV поміщаємо наступний PHP код:

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

    В результаті повертається повністю оброблене зображення TV.

    &outerTpl

    Назва чанка містить шаблон зовнішнього контейнера.

    Доступні плейсхолдери:

    • wf.classes - виводить класи, взяті з набору параметрів Wayfinder (включаючи атрибут class="")
    • wf.classnames - виведення назви класів (без class="")
    • wf.wrapper – виведення внутрішнього вмісту (row).
      [[+wf.wrapper]]

    Параметр &innerTpl містить такий самий набір плейсхолдерів що &outerTpl .

    &rowTpl

    Назва чанка містить шаблон елементів ряду меню.

    Доступні плейсхолдери:

    • wf.classes - виведення класів (включаючи атрибут class="")
    • wf.classnames - виведення відповідних класів (без class="")
    • wf.link – значення атрибуту href="" для посилання меню
    • wf.title - ім'я тексту заголовка для посилання від поля вказаного у параметрі &titleOfLinks
    • wf.linktext - текст для чинного посилання, вказаному в полі, переданому в параметрі &textOfLinks
    • wf.wrapper - виведення внутрішнього вмісту, наприклад, підменю
    • wf.id – висновок унікального ID атрибута. Вам потрібно вказати параметр &rowIdPrefix для того, щоб цей заповнювач міг отримати значення. Значення є префікс + docId.
    • wf.attributes – виводить посилання атрибутів для поточного елемента
    • wf.docid – ідентифікатор документа поточного елемента
    • wf.description - опис для поточного елемента
    • wf.level – поточний рівень вкладеності

    Приклад використання:

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

    Ще один варіант:

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

  • Приклади

    Першого рівня


    [[! Wayfinder? &startId=`0` &level=`1`
    &rowTpl=`rowTpl`
    &outerTpl=`outerTpl`
    &hereClass=`active`
    &rowClass=`eNav_li`]]

    Код чанка outerTpl



      [[+wf.wrapper]]

    Код чанка rowTpl



      [[+wf.wrapper]]

    Другого рівня (у цьому прикладі меню та пункти підменю були візуально на одному рівні

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

    Код чанка outerTplFooterMenu



    [[+wf.wrapper]]

    код чанка rowTplFooterMenu




    • [[+wf.title]]


    • [[+wf.wrapper]]

    код чанка innerTplFooterMenu

    [[+wf.wrapper]]

    код чанка innerRowTplFooterMenu



  • [[+wf.title]]


  • Для створення динамічного меню ми скористаємося готовим сніппетом Wayfinder.Сніппет, як ви, сподіваюся, пам'ятаєте з попередніх уроків, це шматок Php коду, який ми можемо включати до нашого шаблону. Відмінність від чанків тільки в коді та методі виклику. Якщо чанк ми викликаємо за допомогою подвійних фігурних дужок, то сніпети викликаються за допомогою таких [!Ім'я_сніптета!]- некэшований виклик, або таких [[Ім'я_сніппета]]- виклик, що кешується. Код кожного сніпета повинен починатися з а закінчуватися ?> . Крім цього, кожному сніпету можна передавати спеціальні значення параметрів, які він оброблятиме. У MODx вже є кілька готових сніпетів, які ми будемо надалі використовувати.

    Сніппет Wayfinderслужить в організацію списків посилань для MODx. Меню нашого сайту є список таких посилань. Давайте для початку знайдемо шматок коду, який відповідає за виведення нашого меню. Меню знаходиться у чанці HEADER, ось воно:


    • Welcome

    • Design Blog

    • Portfolio

    • Our Company

    • Contact Us

    Давайте виріжемо цей код, замість нього напишемо:

    ((MENU))

    А код вставимо у новий чанк MENU, в описі чанка напишемо Меню сайту. Тепер давайте вивчимо цей код.

    Меню нашого сайту є простим, ненумерованим списком, що знаходиться в контейнері з id="templatemo_menu". Давайте виріжемо цей список з контейнера і замість нього вставимо виклик нашого сніпета:


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

    &startId=`0`- це параметр зі значенням 0, який вказує сниппету ID папки, в якій лежать документи, що обробляються. Всі наші документи, які ми відображатимемо в меню, лежать у кореневій папці, ID кореневої папки дорівнює нулю. Погляньмо, що в нас вийшло.

    Наше меню запрацювало, тільки активний пункт перестав виділятися білим кольором:

    Щоб зрозуміти, чому це сталося, нам треба переглянути вихідний код сторінки. У Mozilla Firefox це робиться таким чином: Вид >> Вихідний код сторінкиабо просто натиснувши клавіші Ctrl+U. Знаходимо код нашого меню:

    • Головна

    • Блог про дизайн

    • Портфоліо

    • Про компанію

    • Контакти

    Звертаємо увагу на те, що у вихідному коді активний пункт був class="current", а наш сніпет автоматично привласнює активному пункту class="active". Помічаємо ще той момент, що у вихідному коді клас застосовувався до тега , а тепер до тегу

  • . Переписувати сніпет ми не будемо, а ось поміняти клас у стилях - немає проблем.

    Знаходимо в папці C:/xampp/htdocs/site/www/assets/templates/ файл templatemo_style.cssта відкриваємо його за допомогою Notepad++. Шукаємо в цьому файлі опис класу current, воно знаходиться в 198 рядку:

    #templatemo_menu li .current(
    padding-left: 40px;
    color: #ffffff;
    }

    замінюємо клас currentна active, не забуваючи перепризначити його тегу :

    #templatemo_menu li.active a (
    padding-left: 40px;
    color: #ffffff;
    }

    Зберігаємо файл. Дивимося, що вийшло.
    Наше меню запрацювало так, як це задумували дизайнери. Тепер ми можемо переходити сторінками нашого сайту за допомогою нашого головного меню. При додаванні до кореневої папки інших документів вони автоматично відображатимуться в нашому меню. Щоб небажані документи не відображалися в меню, у них слід забрати галочку з Показувати у меню. Можна виключити небажаний пункт за допомогою параметра &excludeDocs=`список id документів, що виключаються, через кому`.

    Щоб у меню не відображалися дочірні документи, які ми створюватимемо на наступних уроках, давайте додамо у виклик сніпету параметр level, Який визначає кількість рівнів в меню, за замовчуванням будуть відображатися всі рівні, обмежимо лише одним рівнем:


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

    Починаємо 8 урок MODx Revolution для новачків. Нагадую, ми робимо сайт для вивчення MODx Revolution. На останньому уроці ми розглянули концепцію сніппетів, які є шматками PHP коду, що дозволяє додати функціональність до нашого вебсайту. У цьому уроці ми розглянемо особливий сніпет – Wayfinder, і будемо використовувати його для створення динамічного меню нашого сайту.

    Що таке Wayfinder?

    Wayfinder– це сніпет, який виводить невідсортований список посилань на ресурси у вашому дереві сайту, тип виведення списку залежить від виклику сніпету та параметрів даного виклику. Загалом це означає, що коли ви поміщаєте виклик Wayfinder'а у вашому шаблоні, він починає шукати ресурси, які відповідають заданим у ньому параметрам і повертає список посилань до цих ресурсів у форматі невідсортованого списку або у визначеному вами форматі.

    Навіщо використовувати Wayfinder?

    Зазвичай Wayfinder використовую для створення динамічної навігації по сайту, тобто меню. Так як більшість HTML шаблонів використовують неупорядковані списки для створення меню, Wayfinder є ідеальним інструментом для цих цілей. При створенні сайту ви можете ретельно вставляти ваші урли в меню навігації, тому що ви робили раніше в статичному HTML сайті. У той же час, кожного разу, коли необхідно видалити або створити сторінку, вам необхідно внести відповідні зміни у вашому меню, поміняти урли. Використання сниппета Wayfinder для динамічного генерування ваших меню дозволяє уникнути цього головного болю, так як він автоматично визначає зміни і відповідно змінює ваше меню.

    Wayfinder досить гнучкий інструмент і дозволяє визначити, які ресурси включити або виключити з меню, який шаблон меню, як глибина меню вашого сайту. Кордон ваших можливостей визначається вашим HTML/CSS кодом.

    Як використовувати Wayfinder?

    Як ми вже згадали в попередньому уроці, синтаксис виклику сніпетів виглядає так: [[!somesnippet]]

    Це лише базовий виклик і його мало, крім цього ми повинні визначити деякі властивості цього виклику. У випадку з Wayfinder`ом найменше, яке необхідно визначити у властивостях: де в дереві ресурсів Wayfinder повинен починати будувати список ресурсів. Таким чином, у виклику сниппета Wayfinder необхідно задати принаймні один параметр - початковий ID. Базовий виклик сніппета Wayfinder у такому разі виглядатиме ось так:

    Цей виклик говорить Wayfinder'у починати з кореня дерева ( ID 0 означає корінь сайту) і показує всі ресурси, які опубліковані і у яких не варто галочка в чекбоксі Hide from Menus (Сховати від Меню).

    Якщо ми поглянемо на шаблон, який ми використовуємо, ми можемо побачити верхнє меню з декількома пунктами і списками.

    Погляньмо на шаблон і код, який виводить це меню:

    Як бачите, це вкладений невпорядкований список. Давайте замінимо цей код на базовий виклик Wayfinder і побачимо, що в нас вийде. Видаліть код наведений вгорі та вставте замість нього:

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

    Якщо ви використовуєте той же шаблон, що я, то ваш код буде виглядати приблизно так:

    Збережіть шаблон і подивіться на домашню сторінку, вона має вигляд:

    Фантастика! Ви бачите, що наше попереднє меню, яке мало кілька пунктів, тепер замінено простим меню з одним лише пунктом – Home. Це говорить нам, що Wayfinder працює так, як потрібно і бере одну сторінку з нашого сайту і виводить її назву у вигляді пункту меню.

    Давайте створимо ще кілька ресурсів. Я збираюся додати сторінку About із 3 дочірніми сторінками (MODx, сторінки Tutorials, Contact та FAQ). Ви можете створити будь-які ресурси або сторінки для вашого сайту. Мета цієї вправи – створити кілька ресурсів, щоб Wayfinder було що відображати.

    Я закінчив зі створенням сторінок і моє дерево ресурсів сайту виглядає так:

    Тепер у нас є кілька сторінок, подивимося як виклик Wayfinder'а згенерує меню для нашого сайту:

    Хорошою новиною є те, що всі наші сторінки з'явилися в меню та натискаючи на кожен пункт меню, ми потрапляємо на відповідну сторінку. (Для тестування цього елемента додайте будь-який текст у кожну сторінку, наприклад, на сторінку About можете додати “Це сторінка About” і це повідомлення з'явиться при відкритті сторінки. Пам'ятайте, що нам необхідно визначати шаблон для кожної сторінки, але на даний момент я не збираюся про це турбується).

    Поганою новиною є та, що порушилося форматування меню, але ми можемо це полагодити. Натисніть правою кнопкою миші на вебсторінку і перегляньте вихідний код (або використовуйте для цього firebug), ви побачите що зараз Wayfinderгенерує HTML наступного вигляду:

    • Home
    • About
      • MODx CMS
      • The Coding Pad
        • The Blog
        • The Services
    • Contact Us
    • Tutorials
    • FAQ

    Як ви бачите, це виглядає дуже схоже на наш початковий статичний код за деяким винятком. По-перше, Wayfinder згенерував