تغییر منوی بالا PdoMenu - ایجاد یک منو در MODX نحوه تنظیم یک منوی عمودی در modx evo

قطعه تولید منو. می تواند جایگزین Wayfinder شود و در تعیین گزینه ها انعطاف پذیری بیشتری را فراهم می کند.

به عنوان مثال، می تواند یک منو از چندین والدین به طور همزمان بسازد و آنها را با هم و به صورت شاخه های جداگانه نمایش دهد.

این افزایش قابل توجهی در سرعت را تنها در اولین شروع می دهد، سپس Wayfinder به لطف ذخیره سازی مناسب، پایین تر نیست.

گزینه ها

به طور پیش فرض، pdoMenu گزینه های رایج pdoTools و برخی از گزینه های خود را می پذیرد:

نام پیش فرض شرح
&والدین منبع فعلی فهرست والدین برای نتایج جستجو، جدا شده با کاما. اگر قرار داده شود &parents=`0`- نمونه محدود نیست. اگر شناسه والدین با خط تیره شروع شود، آن و فرزندانش از انتخاب حذف می شوند.
&مرحله 0 (نامحدود) سطح منو تولید شد.
&منابع فهرست منابعی که در نتایج نمایش داده می شوند، با کاما از هم جدا شده اند. اگر شناسه منبع با خط فاصله شروع شود، آن منبع از انتخاب حذف می شود.
&الگوها فهرست الگوهای فیلتر کردن نتایج با کاما از هم جدا شده است. اگر شناسه الگو با خط فاصله شروع شود، منابعی که دارای آن هستند از انتخاب حذف می شوند.
&جایی که آرایه ای از گزینه های انتخاب اضافی که در JSON کدگذاری شده اند.
&نمایش شروع 0 نمایش گره های منوی اولیه را فعال کنید. هنگام مشخص کردن بیش از یک "والد" مفید است.
&متن نوشته محدود کردن انتخاب بر اساس زمینه منبع.
&نمایش پنهان 0 نمایش منابع پنهان در منو
&نمایش منتشر نشده 0 نمایش منابع منتشر نشده
&پیش نمایش منتشر نشده 0 در صورتی که کاربر اجازه انجام این کار را داشته باشد، نمایش منابع منتشر نشده را فعال کنید.
&مخفی کردن زیر منوها 0 پنهان کردن شاخه های منو غیرفعال
&انتخاب کنید لیست فیلدهایی که باید انتخاب کنید، با کاما از هم جدا شده اند. برای مثال می توانید یک رشته JSON را با یک آرایه مشخص کنید &select=`("modResource":"شناسه، عنوان صفحه، محتوا")`
&مرتب سازی بر اساس فهرست فهرست هر قسمت از منبع برای مرتب سازی، از جمله پارامتر تلویزیون در صورتی که در پارامتر مشخص شده باشد &شامل تلویزیون، مثلا &sortby=`("tvname":"ASC"، "pagetitle":"DESC")`. شما می توانید یک رشته JSON با آرایه ای از چندین فیلد را مشخص کنید. برای مرتب سازی تصادفی، مشخص کنید &sortby=`RAND()`
& sortdir ASC جهت مرتب سازی: نزولی یا صعودی. اگر پارامترهای &sortby و & sortdir را خالی بگذارید، مرتب سازی به ترتیب منابع در &منابع.
&حد 0 محدود کردن تعداد نتایج نمونه
&انحراف 0 از ابتدا نتایج را رد کنید. باید همراه با مشخص شده استفاده شود &حد
&بررسی مجوزها مشخص کنید که مثلاً هنگام نمایش منابع، کدام مجوزها را برای کاربر بررسی کند &checkPermissions=`list`.
&شمار کودکان 0 شمارش دقیق تعداد منابع فرزند هر دسته و نمایش آنها در مکان‌نمای [[+فرزندان]]. درخواست های اضافی را به پایگاه داده می کند، بنابراین به طور پیش فرض غیرفعال است.
&toPlaceholder اگر خالی نباشد، قطعه به جای نمایش داده شدن، همه داده ها را در یک مکان نگهدار با آن نام ذخیره می کند.
&plپیشوند wf. پیشوند برای متغیرهایی در معرض.
&نمایش گزارش 0 نمایش اطلاعات اضافی در مورد کار قطعه. فقط برای کسانی که در زمینه "mgr" مجاز هستند.
&حالت سریع 0 حالت پردازش سریع قطعه. همه برچسب‌های خام (شرایط، قطعه‌ها و غیره) حذف خواهند شد.
&کش 0 ذخیره کردن نتایج قطعه.
&cacheTime 3600 زمان انقضای کش، در ثانیه.
&طرح -1 طرح تولید url به modX::makeUrl() منتقل می شود گزینه های ممکننیاز داشتن . نوع خاص uri جایگزین مقدار uri منبع می شود، بدون اینکه تابعی را اجرا کند.
&استفاده از WeblinkUrl 1 یک پیوند با توجه به کلاس منبع ایجاد کنید.
&rowIdPrefix پیشوند id="" برای تنظیم شناسه در قطعه.
&اینجا شناسه شناسه منبع فعلی برای منوی تولید شده. فقط در صورتی باید آن را مشخص کنید که خود اسکریپت به اشتباه آن را تعیین کند، به عنوان مثال، هنگام نمایش یک منو از قسمتی از قطعه دیگر.
&شامل تلویزیون فهرست پارامترهای تلویزیون برای انتخاب، جدا شده با کاما. مثلا &includeTVs=`عمل، زمان`متغیرهایی [[+action]] و [[+time]] را می‌دهد.
&تلویزیون ها را آماده کنید فهرست گزینه‌های تلویزیون، با فایل‌هایی از منابع رسانه‌ای که می‌خواهید مسیرهای کامل را برای آن‌ها ایجاد کنید. اگر تنظیم شود &prepareTVs=`1`، تمام تلویزیون های مشخص شده در &شامل تلویزیون.
&پردازش تلویزیون ها لیستی از پارامترهای تلویزیون که باید مطابق با تنظیمات آنها در مدیر سیستم پردازش و نمایش داده شوند. اگر تنظیم شود &processTVs=`1`، تمام تلویزیون های مشخص شده در &شامل تلویزیون. کار را کند می کند.
&tvPrefix پیشوند تنظیمات تلویزیون.

گزینه های قالب

این گزینه ها تکه هایی را تنظیم می کنند که حاوی الگوهایی برای تولید منوها هستند.

نام شرح
&tplOuter طراحی تکه ای از کل بلوک منو. پیش‌فرض: @INLINE
    [[+wrapper]]
&tpl تکه ای از طراحی آیتم های منو اگر مشخص نشده باشد، محتویات فیلدهای منبع روی صفحه چاپ می شود. پیش‌فرض: @INLINE
  • [[+منو عنوان]][[+wrapper]]
  • &tpl اینجا تکه ای از دکوراسیون آیتم منوی فعلی.
    &tplشروع کنید تکه ای از طراحی آیتم ریشه، به شرطی که فعال باشد &نمایش شروع. پیش‌فرض: @INLINE

    [[+ عنوان منو]]

    [[+wrapper]]
    &tplParentRow تکه ای از تزئین والدین با فرزندان که با شرایط &tplCategoryFolder مطابقت ندارد. به عنوان مثال: @INLINE
    &tplParentRowHere تکه‌ای از شکل‌دهی سند فعلی اگر حاوی کودکان باشد.
    &tplParentRowActive تکه ای از تزئین والدین با فرزندان در شاخه منوی فعال.
    &tplCategoryFolder قطعه طراحی دسته ویژه. یک دسته، والدین دارای فرزندانی است که یک الگو یا rel="category" خالی در قسمت link_attributes دارند.
    &tplInner تکه ای برای طراحی کل بلوک از آیتم های فرعی منو. اگر خالی باشد - استفاده خواهد شد &tplOuter. به عنوان مثال: @INLINE
    &tplInnerRow قطعه برای طراحی یک آیتم فرعی منو. به عنوان مثال: @INLINE
    &tplInnerHere تکه برای زیرمورد منوی فعال.

    گزینه های کلاس CSS

    این پارامترها مقدار [[+classnames]] و [[+classes]] متغیرهایی را برای آیتم های مختلف منو تعیین می کنند. مکان نگهدار [[+classnames]] فقط نام کلاس را بدون ویژگی نمایش می دهد کلاس = ""، بر خلاف مکان نگهدار [[+classes]].

    مثال ها

    خروجی معمول منو از ریشه سایت به یک سطح:

    []

    خروجی با والدین خاص حذف شده و مجوزهای کاربر بررسی شده است:

    []

    نمایش منو از دو والدین به طور همزمان، نشان دادن نقاط ریشه:

    []

    نمایش دو سطح از منابع، شمارش تعداد تو در تو:

    []` &tplParentRow=`@INLINE

  • [[+menutitle]] ([[+فرزندان]])
  • [[+wrapper]]` &countChildren=`1` ]]

    تاریخ انتشار: 1390/02/07

    در این آموزش ساده، من به شما نشان می دهم که چگونه منو را شخصی سازی کنید.

    یک بار از من خواسته شد تا اشکالی را در منوی یک سایت برطرف کنم - برخی از موارد سرسختانه نمی‌خواستند در یک ردیف قرار گیرند، اما در عوض در مکان‌های غیرمنتظره‌ای در صفحه هنگام نگه‌داشتن ماوس روی صفحه، خزیده شدند. همانطور که در ابتدا تصور می‌کردم، باگ در css کج نبود، بلکه در تماس کج‌شده Wayfinder بود.

    Wayfinder چیست- این قطعه ای است که در مواقع ضروری برای فهرست کردن اسناد یک بخش یا بخش ها استفاده می شود. در نتیجه قطعه، یک لیست نامرتب ایجاد می شود. با کمک پارامترهای مختلف، می توانید هر کاری را با این لیست انجام دهید :) می توانید اطلاعات بیشتری را در اسناد یا با تایپ در Google - "wayfinder modx wiki" بخوانید.

    یادداشت های مهم:

    1. در مورد اینکه MODx چیست، چگونه MODx را نصب کنیم، چگونه ساختار اسناد را سازماندهی کنیم، چگونه از html یک قالب بسازیم، یک chunk چیست و غیره. من در این درس سوالاتی را برای مبتدیان در نظر نمی گیرم.

    2. متغیرهایی که من در آموزش استفاده خواهم کرد در قالبی هستند که نسخه Evo "درک" دارد. تفاوت چیست، به مثال نگاه کنید:

    بنابراین، بیایید نگاهی به ایجاد یک منو گام به گام بیندازیم.

    مرحله 1

    برای درس، منوی زیر را ترسیم کردم:

    در اینجا، برای وضوح، من استفاده کردم سبک های متفاوتبه سطوح مختلفمنو. در سایتی که باگ منو برطرف شد، تقریباً یکسان بود - هر سطح از منو سبک خاص خود را دارد.

    حروفچینی - جزئیات طرح بندی در محدوده این درس گنجانده نشده است، بنابراین من این کد را دریافت کردم:

    پس از تحسین کد، ما خودمان تعیین می کنیم که کدام کلاس در منوی ما مسئول چه چیزی است (این در صورتی است که شما در حال بررسی کد شخص دیگری هستید، باید در خود شما مشخص باشد):

    ul class="menu" - کلاس کل منو
    li class="top" - کلاس آیتم منو سطح بالا
    a class="top_link" - کلاس برای پیوندها در آیتم های سطح بالا
    ul class="sub" - کلاس منوی فرعی
    خوب، برای تزئین اقلام سطح بالا به کلاس "پایین" بروید

    مرحله 2. سه سند ایجاد کنید

    محصولات
    - تحویل
    - تامین کنندگان
    در سند "محصولات"، ما اسناد کودک را ایجاد می کنیم: "سرم حقیقت"، "درمان ماکروپولوس"، "درمان های جهانی".

    مرحله 3. منو را به یک قسمت جداگانه منتقل کنید

    در قالب، در محلی که باید یک منو داشته باشید، تمام کدهای غیر ضروری را حذف کنید (خود کد htmlمنو)، به جای آن می نویسیم

    ((منو))

    بنابراین، ما منو را در یک تکه جداگانه بیرون می آوریم. سپس یک قطعه جدید ایجاد می کنیم و آن را فراخوانی می کنیم منو. در حال حاضر، می‌توانید کد منویی را که ایجاد کرده‌اید در محتوای قطعه کپی کنید. برای شفافیت.

    به پنل مدیریت در "سایت"-> "نمایش" بروید - تا بررسی کنید که همه چیز با مسیرهای فایل سبک و تصاویر درست است.

    اتفاق افتاد؟ خوب، اما هنوز منو نیست. بیایید با کمک Wayfinder به آن جان بدهیم.

    مرحله 4

    تمام محتویات قسمت منو را حذف کنید و به جای آن قطعه Wayfinder را فراخوانی کنید.
    تا زمانی که بنویسیم:

    [[راه یاب؟ &startId=`0`]]

    پارامتر startId- نشان می دهد که از کدام سند شروع به تشکیل لیست کنید. ما 0 داریم - این بدان معنی است که لیست از ریشه درخت سند تشکیل شده است.

    ببینیم چی شد:

    این یک منوی فعال و زنده است. تغییر نام اسناد، حذف، اضافه کردن - منو مطابق با درخت سند تشکیل می شود.

    مرحله 5

    5.1. اکنون ظاهر منو را به حالت عادی برمی گردانیم

    Wayfinder به طور پیش فرض یک کد ساده تولید می کند () ، به تمام کلاس های لیست و آیتم ها هنگام فراخوانی پارامترهای خاصی داده می شود.

    در ابتدای درس تعیین کردیم که کدام کلاس های css در منوی ما مسئول چه چیزی هستند. Wayfinder گزینه های مورد نیاز ما را دارد: طبقه بیرونی- کلاس برای ظرف منو. در مقایسه با طرح ما، تماس Wayfinder زیر را دریافت می کنیم:

    [[راه یاب؟ &startId=`0` &level=`2` &outerClass=`menu`]]

    علاوه بر پارامترهای دارای کلاس، مشخص کنید سطح تودرتو - &level=`2`.

    ما به کمبودها توجه می کنیم - بدون کلاس برای آیتم های منو سطح بالا، بدون برچسب و یک کلاس برای زیر منو.
    تمامی این کاستی ها با افزودن پارامترهای مناسب به فراخوانی Wayfinder اصلاح می شوند.

    5.2. افزودن کلاس ها به آیتم ها و برچسب های سطح بالا

    یک متغیر برای این وجود دارد rowTpl، که یک الگو را برای یک آیتم منو توصیف می کند، ما چنین قالبی می سازیم، برای این کار یک تکه به نام ایجاد می کنیم. والدین:

  • [+wf.linktext+][+wf.wrapper+]
  • در تماس با Wayfinder اضافه کنید &rowTpl=`والد` .
    فراموش نکنید که کد منبع را بررسی کنید - تقریبا همه چیز خوب است، منوی فرعی باقی می ماند.

    برای تنظیم زیر منو از متغیر innerRowTpl استفاده می کنیم.

    یک تکه ایجاد کنید درونی:

  • [ +wf.linktext+][ +wf.wrapper+]
  • افزودن یک متغیر به تماس Wayfinder innerRowTpl=`داخلی`و متغیری که کلاس را برای محفظه زیر منو مشخص می کند &innerClass=`sub` .

    تماس نهایی با Wayfinder به این صورت است:

    [ ]

    تمام، منوی ما آماده است. موفق باشید!

    بیایید درس 8 MODx Revolution را برای مبتدیان شروع کنیم. یادآوری می کنم که در حال ساخت سایت آموزش MODx Revolution هستیم. در آخرین درس، ما به مفهوم اسنیپت ها نگاه کردیم، که تکه هایی از کد PHP هستند که به ما امکان می دهند قابلیت هایی را به وب سایت خود اضافه کنیم. در این آموزش، ما یک قطعه ویژه - Wayfinder را بررسی می کنیم و از آن برای ایجاد یک منوی پویا برای سایت خود استفاده می کنیم.

    Wayfinder چیست؟

    راه یابقطعه ای است که لیست مرتب نشده ای از پیوندها به منابع را در درخت سایت شما نمایش می دهد، نوع خروجی لیست به فراخوانی قطعه و پارامترهای این فراخوانی بستگی دارد. به طور کلی، این بدان معنی است که وقتی با Wayfinder در قالب خود تماس می گیرید، شروع به جستجوی منابعی می کند که با پارامترهای مشخص شده در آن مطابقت داشته باشد و لیستی از پیوندهای این منابع را در قالب یک لیست مرتب نشده یا در قالب برمی گرداند. شما مشخص می کنید

    چرا از Wayfinder استفاده کنیم؟

    من معمولا از Wayfinder برای ایجاد ناوبری سایت پویا، یعنی یک منو استفاده می کنم. از آنجایی که اکثریت قالب HTMLاگر از لیست های نامرتب برای ایجاد منوها استفاده می کنید، Wayfinder ابزار عالی برای آن است. هنگام ایجاد یک سایت، می توانید با زحمت URL های خود را در منوی ناوبری وارد کنید، درست مانند کاری که قبلا در یک سایت HTML ایستا انجام دادید. در عین حال، هر بار که نیاز به حذف یا ایجاد یک صفحه دارید، باید تغییرات مناسب را در منوی خود اعمال کنید، URL ها را تغییر دهید. استفاده از قطعه Wayfinder برای تولید پویا منوها از این سردرد جلوگیری می کند، زیرا به طور خودکار تغییرات را تشخیص داده و منوی شما را متناسب با آن تغییر می دهد.

    Wayfinder کاملاً منعطف است و به شما امکان می دهد تعریف کنید که چه منابعی را شامل یا حذف کنید، قالب منو چیست، منوی سایت شما چقدر عمیق است. محدودیت های شما توسط کد HTML/CSS شما تعیین می شود.

    چگونه از Wayfinder استفاده کنیم؟

    همانطور که در درس قبل اشاره کردیم، نحو فراخوانی قطعه ها به این صورت است: [[!somesnippet]]

    این فقط یک فراخوانی اولیه است و کافی نیست، به جز اینکه باید برخی از ویژگی های این فراخوانی را تعریف کنیم. در مورد Wayfinder، حداقل چیزی که باید در ویژگی ها تعریف شود، جایی است که در درخت منبع Wayfinder باید شروع به ساخت لیست منابع کند. بنابراین، در فراخوانی قطعه Wayfinder، حداقل یک پارامتر باید مشخص شود - شناسه اولیه. فراخوانی اصلی قطعه Wayfinder در این مورد به شکل زیر است:

    این تماس به Wayfinder می گوید که از ریشه درخت شروع کند ( شناسه 0 به معنای ریشه سایت است) و تمام منابعی را که منتشر شده اند و علامت چک در چک باکس ندارند را نشان می دهد پنهان کردن از منوها (پنهان کردن از منو).

    اگر نگاهی به قالبی که استفاده می کنیم بیندازیم، می توانیم یک منوی بالا با چندین آیتم و کشویی مشاهده کنیم.

    بیایید نگاهی به قالب و کدی که خروجی دارد بیاندازیم این منو:

    همانطور که می بینید، این یک لیست نامرتب تو در تو است. بیایید این کد را با یک تماس اولیه Wayfinder جایگزین کنیم و ببینیم چه اتفاقی می‌افتد. کد بالا را حذف کرده و در جای خود قرار دهید:

    [[!راه یاب؟ &startId=`0` ]]

    اگر از همان قالب من استفاده می کنید، کد شما چیزی شبیه به این خواهد بود:

    قالب را ذخیره کنید و نگاه کنید صفحه نخست، می بایست شبیه به این باشه:

    داستان! می بینید که منوی قبلی ما که چندین آیتم داشت، اکنون با یک منوی ساده با تنها یک آیتم - Home - جایگزین شده است. این به ما می گوید که Wayfinder همانطور که انتظار می رود کار می کند و یک صفحه از سایت ما می گیرد و عنوان آن را به عنوان یک آیتم منو نمایش می دهد.

    بیایید چند منبع دیگر ایجاد کنیم. من قصد دارم یک صفحه درباره با 3 صفحه فرزند (MODx، آموزش، تماس و صفحات پرسش و پاسخ) اضافه کنم. شما می توانید هر منبع یا صفحه ای برای سایت خود ایجاد کنید. هدف از این تمرین ایجاد برخی منابع است تا Wayfinder چیزی برای نمایش داشته باشد.

    من کار ساختن صفحات را تمام کردم و درخت منابع سایت من به این شکل است:

    اکنون چند صفحه داریم، بیایید ببینیم چگونه فراخوانی Wayfinder منویی برای سایت ما ایجاد می کند:

    خبر خوب این است که تمام صفحات ما در منو ظاهر شده اند و با کلیک بر روی هر آیتم منو به صفحه مربوطه می رسیم. (برای آزمایش این عنصر، مقداری متن به هر صفحه اضافه کنید، به عنوان مثال، در صفحه درباره می توانید "This is a About page" را اضافه کنید و این پیغام با باز شدن صفحه ظاهر می شود. به یاد داشته باشید که باید یک الگو برای آن تعریف کنیم. هر صفحه، اما در حال حاضر نگران آن نیستم).

    خبر بد این است که قالب بندی منو خراب است، اما ما می توانیم آن را برطرف کنیم. کلیک کلیک راستروی صفحه وب کلیک کنید و به کد منبع نگاه کنید (یا برای این کار از firebug استفاده کنید)، اکنون آن را خواهید دید راه یاب HTML را به شکل زیر تولید می کند:

    • صفحه اصلی
    • در باره
      • MODX CMS
      • پد کدنویسی
        • وبلاگ
        • خدمات
    • با ما تماس بگیرید
    • آموزش ها
    • سوالات متداول

    همانطور که می بینید با چند استثنا بسیار شبیه به کد استاتیک اولیه ما است. ابتدا Wayfinder تولید شد

      مورد بدون کلاس منوی sfکه در کد استاتیک ما استفاده شد. این قالب برای کار با CSS به این کلاس نیاز دارد. همچنین دیده می شود که
    • موارد دارای پارامتر هستند طول، که به عناصر متن پیوند در کد استاتیک اصلی اشاره دارد و در کد تولید شده Wayfinder وجود ندارد. علاوه بر این، کد HTML استاتیک ما یک کلاس دارد آیتم فعلی صفحه، که در کد قطعه Wayfinder ما وجود ندارد. همه این قطعات گم شده منوی ما را ناخوشایند نشان می دهد.

      نحوه سفارشی کردن سبک خروجی قطعه راه یاب

      با نگاهی به نحوه تولید کد Wayfinder، یک سوال کاملا طبیعی داریم: "چگونه قطعات کد گم شده را اضافه کنیم تا بخواهیم منو را به شکلی که نیاز داریم نمایش دهیم؟" پاسخ بسیار آسان است، ما از تکه های قالب برای فرمت کردن خروجی قطعه Wayfinder استفاده می کنیم.

      Wayfinder ابزاری انعطاف پذیر است و با کمک پارامترها می توانید تعریف کنید ظاهرخروجی مقداری پارامترهای رایجبه شما این امکان را می دهد که تعیین کنید در چه سطحی باید ساخت منو را شروع کنید، کدام موارد را در منو قرار ندهید و غیره. گزینه‌های دیگر گزینه‌های قالب هستند که به شما امکان می‌دهند کد html الگو را برای منوی خود تنظیم کنید، و غیره. توضیحات مربوط به مورد دوم را می‌توانید در مستندات رسمی پیدا کنید - http://rtfm.modx.com/display/ADDON/Wayfinder.

      یادداشت بردار:برخی از گزینه های Wayfinder دارای یک مقدار پیش فرض هستند.

      به عنوان مثال، این توضیح می دهد که چرا در منوی Wayfinder-generated، آیتم صفحه اصلی دارای نام کلاس است. اول فعال". این کلاس پیش‌فرض است، اما می‌توانیم با تعریف کلاس‌های خود در تکه‌های الگو، آن را لغو کنیم.

      ما در این آموزش از چند گزینه Wayfinder استفاده خواهیم کرد، اما من شما را تشویق می کنم که همه آنها را یاد بگیرید و تا حد امکان استفاده از آنها را تمرین کنید تا پتانسیل کامل آنها را درک کنید. از آنجایی که پارامترهای پیش‌فرض Wayfinder به وضوح در وب‌سایت رسمی ثبت شده‌اند، صحبت در مورد آنها در اینجا احمقانه است. همانطور که با منوهای مختلف کار می کنیم، از آنها بیشتر و بیشتر استفاده خواهیم کرد.

      برای شروع کار در قالب منو، بیایید چند قالب کوچک ایجاد کنیم و آنها را به صورت تکه ای ذخیره کنیم. خواهید دید که در این تکه ها از کد HTML استفاده می کنیم اما عناصر پویا را جایگزین می کنیم نگهدارنده های مکان(یا نگهدارنده های مکانهمانطور که آنها نیز نامیده می شوند) که نحو آن به این صورت است: [[+ مکان‌دار]]. متغیرهایی که ما استفاده می کنیم مختص قطعه Wayfinder هستند و تعریف آنها از نام مشخص است، اما همیشه می توانید برای راهنمایی کامل تر به مستندات MODx مراجعه کنید.

      در اینجا تکه هایی وجود دارد که من از آنها برای ایجاد الگوی خود استفاده خواهم کرد:

      7in1menuOuter- حاوی کد HTML برای ظرف ul خارجی ما خواهد بود.

        [[+wf.wrapper]]

      می بینید که من یک کلاس برای ul خارجی اضافه کرده ام. راه جایگزینبرای انجام این کار باید از مکان نگهدار wf.classes استفاده کنید و سپس نام کلاس را با استفاده از پارامتر به فراخوانی wayfinder فعلی اضافه کنید. طبقه بیرونی. اما برای سادگی، از راه اول استفاده می کنیم، اما هر دوی آنها به خوبی کار می کنند ...

      7in1menuRow– حاوی کد HTML آیتم های منوی سطح اول خواهد بود

    • [[+wf.linktext]][[+wf.wrapper]]
    • ایده اصلی اینجا این است که من برچسب را اضافه کردم به متن پیوند منو مانند کد HTML استاتیک اصلی. من همچنین مکان‌نمای wf.classes را اضافه کردم و این به من امکان می‌دهد کلاسی را برای صفحه فعلی تعریف کنم که کلاس فعال پیش‌فرض ما را لغو می‌کند.

      7in1menuInner– حاوی کد HTML ظروف ul داخلی خواهد بود

        [[+wf.wrapper]]

      7in1menuInnerRow- حاوی کد HTML برای رشته های آیتم است سطوح داخلی

    • [[+wf.linktext]][[+wf.wrapper]]
    • تمام، اکنون تکه های قالب ما در جای خود هستند، همانطور که می بینید (برای سفارش، آنها را در یک دسته جداگانه قرار می دهم):

      اکنون می‌توانیم فراخوانی Wayfinder را تغییر دهیم تا بتوانیم از این قالب‌های کوچک برای خروجی Wayfinder استفاده کنیم. اگر به لیست گزینه های قالب نگاهی بیندازید (مفید است که http://rtfm.modx.com/display/ADDON/Wayfinder را جلوی چشمان خود باز کنید یا چاپ کنید و نزدیک صفحه نگه دارید)، خواهید دید که من تکه های خود را شبیه به پارامترهای فراخوانی قطعه مربوطه فراخوانی کردم. من این کار را برای راحتی انجام دادم، این به من کمک می‌کند وقتی شروع به ساختن تماس خود می‌کنم، آنچه را که چه چیزی است، پیگیری کنم. بیایید پارامترها را اضافه کنیم و تکه های خود را فراخوانی کنیم. تماس با Wayfinder اکنون به شکل زیر خواهد بود:

      [[!راه یاب؟ &startId=`0` &outerTpl=`7in1menuOuter` &rowTpl=`7in1menuRow` &innerTpl=`7in1menuInner` &innerRowTpl=`7in1InnerRow` &hereClass=`current_page_item` &firstClass=`` &lastClass]

      مقدار پارامتر در آپاستروف (`) محصور شده است، نه تک نقل قول (').

      خوب، بیایید نگاهی به این چالش بیندازیم. می بینید که ما از گزینه های قالب بندی برای فراخوانی تکه های خود استفاده می کنیم تا Wayfinder HTML مورد نظر ما را با کلاس های صحیح خروجی دهد. من یک callable تعریف کردم اینجا کلاسپارامتر و به آن مقدار داد current_page_itemبرای مطابقت با قالب HTML ایستا. می بینید که من پارامترها را رها کردم اولین کلاسو کلاس آخریخالی. دلیل این امر این است که قالب HTML من برای اولین و آخرین آیتم منو کلاس تعیین نمی کند، بنابراین برای جلوگیری از همپوشانی، خطوط خالی آنها را بازنویسی کردم.

      می توان دید که منوی ما دقیقاً همان طور که می خواستیم به نظر می رسد. سبک های صحیح در منوی کشویی استفاده می شود. اگر به کد منبع نگاه کنید، خواهید دید که تولید شده است راه یابکد HTML غیرقابل تشخیص تغییر کرده است:

      • صفحه اصلی
      • در باره
        • MODX CMS
        • پد کدنویسی
          • وبلاگ
          • خدمات
      • با ما تماس بگیرید
      • آموزش ها
      • سوالات متداول

      این کد با کد استاتیک اصلی قالب ما مطابقت دارد، اما با فراخوانی ایجاد شده است راه یاب.

      گزینه های زیادی وجود دارد که می توانید از آنها استفاده کنید راه یاببرای ساخت منوهای خود در آموزش های بعدی به منوهای پیچیده و نحوه ادغام آنها در Wayfinder خواهیم پرداخت. به طور خلاصه: اکنون سایت ما شکلی به خود گرفته است و ما یک منوی کاربردی و پویا داریم.

      شما می توانید منوی بالای کنترل پنل MODX را با تغییر ترتیب آیتم ها یا با مخفی کردن برخی از آنها از دید کاربران خاص تغییر دهید. همچنین می توانید موارد جدیدی را به فعالیت های موجود یا سفارشی که ایجاد می کنید اضافه کنید. در مرحله بعد، ابتدا به روش های مورد استفاده برای اصلاح نگاه می کنیم منوی بالاو سپس چند مثال کاربردی

      مفاهیم منوی بالا

      سیستم منو در Revolution دارای معماری کاملاً جدیدی است. تقریباً هیچ ربطی به سیستم منوی Evolution جز نام برخی موارد ندارد. برای تنظیم منو نیازی به درک ندارید سیستم جدیدمنو، اما این درک در کار کمک می کند، به خصوص اگر می خواهید ایجاد کنید صفحات شخصیکنترل پنل هایی که از طریق منو قابل دسترسی خواهند بود.

      درخت منوی بالا

      به بخش منوی بالا بروید System -> Actionsو اصول اولیه سیستم منو را مشاهده خواهید کرد. درخت سمت راست (منوی بالا) حاوی منوی واقعی و آیتم های زیرمنو است. اگر بخش های مختلف را گسترش دهید، خواهید دید که این یک کپی دقیق از منوی بالا است. موارد سطح بالا همان چیزی است که در بالای کنترل پنل می بینید. تقریباً همیشه این ظروف برای منوهای فرعی هستند. هر زیر منوی درخت مربوط به یک عمل در کنترل پنل است. هنگامی که روی یک زیر منو کلیک می کنید، یک عمل در کنترل پنل انجام می شود (به عنوان مثال، پاک کردن کش سایت یا رفتن به صفحه کنترل دسترسی). در واقع، آیتم های منوی بالایی نیز می توانند اکشن باشند، اما هیچ یک از آیتم های منوی بالایی به این شکل پیکربندی نشده اند.

      وقتی روی یک آیتم منو کلیک می‌کنید، در واقع در اینجا تعریف می‌شود. همانطور که مشاهده خواهید کرد، می توانید به راحتی اتفاقاتی که با کلیک روی یک آیتم منو روی می دهد را نادیده بگیرید و همچنین می توانید موارد فهرست منو را تغییر نام دهید، پنهان کنید یا حذف کنید. همچنین می توانید مواردی را به منو اضافه کنید و تنظیم کنید که با کلیک بر روی آنها چه اتفاقی می افتد. در واقع می توانید یک سیستم منوی کاملاً جدید برای کنترل پنل ایجاد کنید که جایگزین منوی موجود می شود و کاربران مختلف می توانند منوهای مختلف را ببینند. همه اینها را می توان بدون تغییر هسته MODX انجام داد.

      نمایش فیزیکی منو نیز در اینجا تنظیم شده است. تصادفی نیست که همه آیتم های منو به همان ترتیبی هستند که در منوی بالایی هستند. اگر آنها را در درخت جابجا کنید، با بارگیری مجدد صفحه، منوی بالایی نیز تغییر می کند.

      بیایید به برخی از اقدامات کنترل پنل نگاه کنیم، اما مراقب باشید که آنها را تغییر ندهید - پس از مشاهده آنها، روی دکمه "لغو" کلیک کنید.

      در درخت سمت راست (منوی بالا)، روی آیتم "سایت" کلیک راست کرده و از منوی کشویی "ویرایش" را انتخاب کنید. یک کادر محاوره ای ویرایش با فیلدهایی ظاهر می شود که عملکرد منو را مشخص می کند:

      نام- نام آیتم منو

      شرح- توضیحات آیتم منو

      عمل- مشخصات فایل PHP که باید اجرا شود

      آیکون- نماد اضافی برای آیتم منو

      گزینه ها- پارامترهای اختیاری $_GET برای URL

      هندلر- کد JS باید اجرا شود

      حقوق دسترسی- لیست مجوزهای مورد نیاز جدا شده با کاما

      توجه داشته باشید که اکثر فیلدهای مورد "سایت" خالی است. این به این دلیل است که یک ظرف برای زیر منوهای موجود در آن است. اگر روی منوی "سایت" در منوی بالا کلیک کنید، هیچ اتفاقی نمی افتد.

      بیایید به یک زیربخش منو نگاه کنیم که کاری انجام می دهد. برای پایان دادن به گفتگو، روی "لغو" کلیک کنید، بخش "سایت" درخت را در پنجره سمت راست گسترش دهید، بر روی منوی فرعی "به روز رسانی سایت" کلیک راست کرده و "ویرایش" را انتخاب کنید.

      توجه داشته باشید که کادر محاوره ای باز شده حاوی محتویات فیلدهای "Handler" و "Permissions" است. فیلد «مجوزها» به ما می‌گوید که اگر کاربر حق دسترسی خالی_کش را نداشته باشد، نمی‌تواند عملکرد این زیرمجموعه منو را انجام دهد. فیلد "Handler" حاوی کد JS واقعی است که با انتخاب این مورد فرعی اجرا می شود. تمام مواردی که برخی از اقدامات واقعاً در آنها انجام می شود دارای فیلدهای "Action" یا "Handler" هستند. اگر فیلد "handler" پر شود، کد موجود در این فیلد اجرا می شود و قسمت "Action" نادیده گرفته می شود. اگر قسمت "Handler" خالی باشد، عمل از قسمت "Action" انجام می شود. فیلد «Action» معمولاً یک اشاره‌گر به فایل کنترل‌کننده یا یکی از اقدامات موجود در درخت «Actions» در سمت چپ (که در واقع به فایل‌های کنترل‌کننده مربوطه اشاره می‌کند) است. با کلیک بر روی دکمه "لغو" گفتگو را ببندید.

      بیایید به گزینه آیتم منو با یک عمل نگاه کنیم. افزونه Batcher را از طریق Package Management دانلود و نصب کنید، صفحه را دوباره بارگیری کنید و دوباره به بخش بروید System -> Actions. در قسمت "Components" در درخت سمت راست (در صورت لزوم آن را گسترش دهید)، روی Batcher کلیک راست کرده و "Edit" را انتخاب کنید. اکنون فیلد تکمیل شده "Action, not "Handler" را مشاهده می کنیم: batcher - index. گفتگوی ویرایش را با کلیک کردن روی دکمه "لغو" پایان دهید.

      در پنجره سمت چپ، همه موارد سطح بالا فضای نام هستند. در درخت Actions در سمت چپ، فضای نام "batcher" را گسترش دهید. شما باید شاخص عمل را ببینید. این عملی است که توسط منوی Batcher که در قسمت سمت راست مشاهده کردیم به آن اشاره شده است.

      بیایید ببینیم چه کاری می توانیم با درخت منوی بالا انجام دهیم. موارد موجود در درخت منوی بالا را می توان با کشیدن آنها مجدداً مرتب کرد. اگر مکان یک آیتم منو را در درخت تغییر دهید، منوی بالای واقعی نیز تغییر خواهد کرد، اگرچه برای مشاهده این موضوع باید صفحه کنترل پنل را دوباره بارگیری کنید.

      برای افزودن یک آیتم به منوی بالا، می‌توانید در هر نقطه از ناحیه درخت کلیک راست کرده و «افزودن آیتم منو» را انتخاب کنید. همچنین می‌توانید روی دکمه «افزودن آیتم» کلیک کنید تا یک مورد را به منوی سطح بالا اضافه کنید.

      آیتم های منو را می توان با کلیک راست بر روی آنها و انتخاب "حذف" حذف کرد. اگر یک آیتم منو را حذف کنید، محتویات فیلدهای آن از بین رفته و هر عنصر فرزند حذف خواهد شد. این عمل برگشت ناپذیر است.

      اگر می‌خواهید یک آیتم منو را بدون حذف واقعی حذف کنید (که تقریباً همیشه بهترین اقدام است)، می‌توانید با قرار دادن چیزی در قسمت «مجوزها» آن را پنهان کنید. اگر قبلاً چیزی در این قسمت وجود دارد، یک کاما و نام حق دسترسی جدید اضافه کنید. تا زمانی که این حق دسترسی یک حق دسترسی است که هیچ کس دیگری ندارد، آیتم منو نامرئی خواهد بود. می توانید با حذف مجوز اضافه شده، آن را دوباره قابل مشاهده کنید. اگر می‌خواهید یک آیتم منوی خاص را به کاربران خاص (اما نه همه) نشان دهید، به سادگی یک الگوی خط‌مشی جدید ایجاد کنید که فقط شامل حقوق دسترسی کاربر باشد، یک خط‌مشی جدید بر اساس آن الگو ایجاد کنید و یک ورودی فهرست کنترل دسترسی متنی ایجاد کنید. به آن کاربران و اختصاص این سیاست.

      برای تغییر عنوان منوی بالا، توضیحات آن را مشخص کنید. سپس به بخش منو بروید سیستم-> مدیریت فرهنگ لغت.فضای نام "core" و موضوع "topmenu" را انتخاب کنید. لیست کشویی موضوع شامل بیش از یک صفحه است، بنابراین ممکن است لازم باشد به صفحه دوم بروید تا موضوع "منو بالا" را پیدا کنید. رشته زبان مورد نیاز منو را پیدا کنید، روی مقدار آن دوبار کلیک کنید و آن را تغییر دهید. هر تغییری که در اینجا ایجاد کنید، پس از به‌روزرسانی نسخه MODX و پس از به‌روزرسانی هر یک از مؤلفه‌ها، به قوت خود باقی خواهد ماند. توسعه دهندگان شخص ثالث.

      روشی که در بالا توضیح داده شد فقط برای آیتم های منوی ساخته شده در هسته کار می کند. برای آیتم های منوی شخص ثالث، باید فضای نام مناسب را انتخاب کنید. برای مثال، اگر می‌خواهید آیتم منوی مربوطه را برای Batcher تغییر دهید، باید مقدار خط کنترل فرهنگ لغت را برای فضای نام batcher تغییر دهید.

      درخت "اقدامات"

      بازگشت به بخش System -> Actionsاگر ترکش کردی در پنجره سمت چپ، روی اکشن «شاخص» زیر نام «batcher» کلیک کنید و از لیست کشویی «ویرایش» را انتخاب کنید. به یاد بیاورید که این عملی است که آیتم منوی Batcher در سمت راست به آن اشاره می کند. خواهید دید که کنترلر این عمل index و فضای نام batcher است. اگر اکنون به بخش برویم سیستم-> فضای نام، خواهیم دید که مسیر فضای نام batcher به صورت زیر است:

      (مسیر_هسته) اجزاء/بچر

      هنگامی که به یک کنترلر متصل می شود که با کلیک روی این آیتم منو اجرا می شود، MODX یک مسیر کامل مانند زیر ایجاد می کند:

      namespace_path + controller_name +.php

      به عبارت دیگر، با فرض اینکه هسته در محل پیش فرض خود قرار دارد، MODX اجرای فایل کنترلر را در آدرس زیر آغاز می کند:

      core/components/batcher/index.php

      اگر به این فایل نگاه کنید، خواهید دید که فقط حاوی فایل index.php در دایرکتوری core/components/batcher/controllers است که کلاس Batcher را بارگذاری می کند و با اجرای Batcher در کنترل پنل آن را مقداردهی اولیه می کند. زمانی که صفحات داشبورد سفارشی را ایجاد می‌کنیم، یک آیتم منوی جدید را در قسمت "Components" ایجاد خواهیم کرد.

      بسیاری از آیتم‌های منو در سمت راست، عملکردهای فعالی ندارند که در پنجره سمت چپ نشان داده شده است. این به این دلیل است که مسیرهای فایل های کنترلر آنها در پایگاه داده MODX ذخیره می شوند و نباید ویرایش شوند (حداقل این کار سخت تر است). این مسیرها در جدول modx_actions ذخیره می شوند. هر اقدام دارای شناسه (ID) و مسیر کنترل کننده خود است. این اکشن همچنین دارای یک URL کمکی برای کمک حساس به زمینه زمانی است که کنترلر فعال است و چند فیلد دیگر. برای اقدامات نشان داده شده در پانل اقدامات در سمت چپ، می توانید شناسه را در پرانتز در کنار نام اقدام مشاهده کنید.

      بنابراین افزودن یک آیتم منو به درخت برای هر عمل در کنترل پنل با ایجاد یک آیتم منو در سمت راست و ایجاد اکشن مربوطه (کنترل کننده) یا افزودن یک کنترلر انجام می شود. اگر کنترل‌کننده از قبل وجود داشته باشد، می‌توانید به سادگی آن را از منوی کشویی «Actions» انتخاب کنید. در غیر این صورت، باید یک عمل در قسمت سمت چپ ایجاد کنید که به کنترلر اشاره می کند. به عنوان مثال، هیچ آیتم منویی برای ایجاد یک کاربر جدید وجود ندارد، اما از آنجایی که یک کنترلر فایل برای این کار وجود دارد، این آیتم به راحتی می تواند به منوی بالا اضافه شود. در این مورد، شما فقط باید یک آیتم منو در سمت راست ایجاد کنید و فضای نام "هسته" را روی action security/user/create تنظیم کنید. همانطور که می‌دانید، یک آیتم منوی بالا که دارای یک کنترل‌کننده است، اما عملکرد مربوطه (شبیه به آیتم منوی «به‌روزرسانی سایت») در درخت «اقدامات» ندارد. نیازی به بند "Action" ندارد زیرا کنترل کننده حاوی کد آن است. به جای اجرای کنترلر، MODX به سادگی کد را در قسمت کنترلر اجرا می کند.

      مدیریت کلیک های منو

      به عملکرد فهرست فضای نام Batcher در پنجره سمت چپ توجه کنید. به شناسه آن توجه کنید. وقتی روی یک آیتم منوی بالا کلیک می کنید، MODX آن شناسه را دریافت می کند. سپس آدرس این صفحه در کنترل پنل تولید می شود و کاربر به آن می رسد. در سایت ما این شناسه 79 است. وقتی در منوی بالا روی Batcher کلیک می کنیم، در می بینیم نوار آدرسمرورگر:

      http://website/manager/index.php?a=79

      اگر روی آیتم منوی Batcher کلیک کنید، باید URL مشابهی را ببینید که در آن شناسه شاخص اقدام Batcher خود را خواهید دید. هنگامی که کنترل کننده درخواست این URL را دریافت می کند، بررسی می کند که آیا شیء منو در پایگاه داده وجود دارد یا خیر، آیا کاربر مجوز اجرای آن را دارد، URL را برای کمک تنظیم می کند و فایل کنترل کننده عملکرد را اجرا می کند (اگر کنترل کننده وجود دارد، JS کنترل کننده کد اجرا می شود).

      کار با منوی بالا

      اکنون که می دانیم MODX چگونه آیتم های منو و اقدامات مرتبط با آنها را مدیریت می کند، اجازه دهید منوی بالای واقعی را در کنترل پنل تغییر دهیم. روش های مورد استفاده بسیار ساده هستند و برای استفاده از آنها نیازی به درک مکانیسم های داخلی کار ندارید. سیستم های MODXمنو/عمل

      در اینجا مراقب باشید زیرا همه تغییرات شما همچنان در هنگام به روز رسانی سایت اعمال می شود و نه راه اسانبه منوی پیش فرض برگردید بیشتر مراحلی که در اینجا انجام خواهیم داد به راحتی قابل برگشت هستند، اما بهتر است قبل از ایجاد هر گونه تغییر، ساختار اصلی منو را یادداشت کنید. بهتر است ابتدا روی نصب MODX که برای سایت واقعی استفاده نمی شود تمرین کنید.

      تغییر ترتیب آیتم های منو

      می توانید ترتیب آیتم های منوی بالایی را در کنترل پنل یا هر یک از آیتم های زیر منوی آن ها را تغییر دهید. به بخش بروید System-> Actionsو درخت منو در سمت راست (زیر عنوان "منو بالا") را گسترش دهید.

      همانطور که قبلا متوجه شدیم، این درخت اساس منوی بالای کنترل پنل است. می توانید ترتیب آیتم های منوی بالا را با کشیدن آنها تغییر دهید. به سادگی روی آیتم منوی مورد نظر برای جابجایی کلیک کنید و در حالی که دکمه ماوس را نگه داشته اید، آن را به جایی که می خواهید بکشید و دکمه ماوس را رها کنید. به این ترتیب می توانید ترتیب آیتم ها را در منوی بالا یا هر زیر منویی تغییر دهید. می توانید موارد را از یک زیر منو به منوی دیگر منتقل کنید. همچنین می توانید موارد زیر منو را با کشیدن آنها به پوشه منوی بالا به منوی بالا منتقل کنید. برای مشاهده تغییرات، باید صفحه کنترل پنل را دوباره بارگیری کنید.

      افزودن و حذف آیتم های منو

      افزودن یک آیتم منوی جدید به اندازه کافی آسان است. به بخش بروید System-> Actionsو درخت منو در سمت راست (زیر عنوان "منو بالا") را گسترش دهید. بخشی از منو را که می خواهید یک مورد به آن اضافه کنید انتخاب کنید و روی دکمه "افزودن منو" کلیک کنید (یا کلیک راست کرده و "Add Menu Item" را انتخاب کنید). نام آیتم منوی مورد نظر خود را وارد کنید و روی دکمه "ذخیره" کلیک کنید. معمولا کاربران MODX آیتم های جدیدی را در منوی "Components" وارد می کنند، اما می توانید آنها را در هر جایی اضافه کنید. برای حذف یک آیتم منو، می توانید روی آن کلیک راست کرده و "Delete Menu Item" را انتخاب کنید.

      اگر یک آیتم منو جدید اضافه کنید و سپس صفحه را مجدداً در مرورگر بارگیری کنید، ممکن است مورد جدید خود را در منوی بالا مشاهده نکنید. موارد منوی بالا بدون عناصر فرزند و بدون تعیین کنش یا کنترل کننده در منو نمایش داده نمی شوند. به همین دلیل است که منوی "کامپوننت ها" که در درخت می بینید، هنگام نصب برای اولین بار در منو ظاهر نمی شود انقلاب MODX- هنوز هیچ مؤلفه ای نصب نشده است.

      به عنوان یک مثال ساده، بیایید یک منوی سفارشی جدید ایجاد کنیم که شما را به بخش های رایج کنترل پنل هدایت می کند. بیایید فرض کنیم که شغل شما مستلزم بازدید مکرر از تنظیمات سیستم، ایجاد/ویرایش سند و کنترل دسترسی است. ما یک آیتم منوی بالایی به نام "My Menu" ایجاد می کنیم که در آن مواردی را که مشخص کرده ایم قرار می دهیم. توجه داشته باشید که ما تمام کارها را در قسمت سمت راست (منو بالا) انجام خواهیم داد.

      پرش به بخش System-> Actionsو (در درخت منوی بالا) روی دکمه "افزودن منو" کلیک کنید. در قسمت "Name" نام "منوی من" را وارد کرده و روی دکمه "ذخیره" کلیک کنید.

      نام - سند جدید

      عمل-core-resource/create

      نام- تنظیمات سیستم

      عملهسته-سیستم/تنظیمات

      نام- کنترل دسترسی

      عمل- امنیت / مجوز

      مطمئن شوید که سه آیتم منوی جدید شما زیرمجموعه های منوی "منوی من" هستند. اگر نه، آنها را با ماوس به محل مورد نظر بکشید. همچنین می توانید ترتیب منوها و زیر منوها را تغییر دهید.

      پس از اینکه به مکان منوی دلخواه رسیدید، صفحه کنترل پنل را در مرورگر بارگیری مجدد کنید. شما باید یک آیتم جدید "My Menu" را در منوی بالا مشاهده کنید، که شامل سه منوی فرعی است که باید به بخش های مناسب کنترل پنل منتهی شود.

      اگر می خواهید هر آیتم منویی را که ایجاد کرده اید حذف کنید، کافی است به بخش بروید System-> Actions، روی آنها کلیک راست کرده و "Delete" را انتخاب کنید. بهتر است قبل از حذف آیتم منوی اصلی، همه زیر منوها را حذف کنید تا در پایگاه داده باقی نمانند.

      نحوه مخفی کردن آیتم های منو

      علاوه بر تغییر ترتیب آیتم های منو، می توانید آنها را با استفاده از مجوزهای پیوست شده به آیتم منو نیز مخفی کنید. پرش به بخش System-> Actionsو درخت منو در سمت راست (زیر عنوان "منو بالا") را گسترش دهید.

      روی هر آیتم یا زیرمجموعه منو کلیک راست کرده و "Edit" را انتخاب کنید. یک کادر محاوره ای با فیلد پایین "مجوزها" ظاهر می شود. مراقب باشید هیچ زمینه دیگری را تغییر ندهید.

      اگر می‌خواهید آیتم‌های منوی موجود را پنهان کنید، می‌بینید که قسمت «مجوزها» برای برخی از آنها پر شده است و برای برخی دیگر نه. اقداماتی که برای پنهان کردن یک فیلد باید انجام دهید بستگی به این دارد که آیا فیلد پر شده باشد یا خیر.

      اگر فیلد «مجوزها» حاوی فهرستی از حقوق دسترسی باشد، می‌توانید یک خط‌مشی دسترسی جدید ایجاد کنید (یا یک خط‌مشی موجود را ویرایش کنید) تا آن حق دسترسی مسدود شود و آیتم منو پنهان شود. این عملیات ممکن است عوارض جانبی داشته باشد زیرا سایر موارد منو در کنترل پنل ممکن است مشمول همان حقوق دسترسی باشند. یک روش بهتر ممکن است اضافه کردن مشخصات مجوز کاربر اضافی به این قسمت باشد.

      فیلد «مجوزها» می‌تواند حاوی فهرستی از حقوق دسترسی جدا شده با کاما باشد. این آیتم منو فقط برای کاربرانی قابل مشاهده خواهد بود که همه حقوق دسترسی فهرست شده را دارند.

      بیایید به یک مثال نگاه کنیم. بیایید فرض کنیم که می‌خواهید منوی فرعی «مدیریت کاربر» را در منوی «امنیت» از همه کاربران پنهان کنید، به جز برای کاربری با حقوق نامحدود Super User.

      پرش به بخش System-> Actionsو درخت منو را گسترش دهید و سپس بر روی زیر آیتم "User Management" کلیک راست کرده و مورد "Edit" را انتخاب کنید. فیلد «مجوزها» باید حاوی view_user باشد. ما قصد داریم مجوزهای دیگری به نام my_view_user_menu را اضافه کنیم. برای انجام این کار، این فیلد را طوری ویرایش کنید که شامل view_user,my_view_user_menu باشد. اطمینان حاصل کنید که هیچ فاصله ای در داده های وارد شده وجود ندارد. اکنون کاربران برای مشاهده زیرمجموعه «مدیریت کاربر» باید هر دوی این مجوزها را داشته باشند، و از آنجایی که هیچکس حق دسترسی دوم را ندارد (از آنجایی که ما آن را درست کردیم)، هیچ کس این مورد فرعی را نخواهد دید.

      برای آیتم های منو که حقوق دسترسی ندارند، روش مشابه است. شما به سادگی مجوزهای کاربر جدید را به فیلد خالی "مجوزها" اضافه می کنید.

      توجه داشته باشید که پس از اضافه کردن مجوزهای کاربر، یک کاربر فوق العاده با حقوق نامحدود نیز زیر منوی مدیریت کاربران را نخواهد دید. برای رفع این مشکل، باید این حقوق دسترسی را به او بدهید. اگر قصد دارید این عملیات را در یک سایت زنده انجام دهید، همیشه قبل از ایجاد مجوزهای سفارشی، ابتدا این مجوزها را به مدیر دارای حقوق نامحدود بدهید.

      از آنجایی که گروه مدیر پیش فرض در کنترل پنل محافظت می شود، باید یک الگوی خط مشی دسترسی جدید حاوی حقوق دسترسی کاربر و یک خط مشی دسترسی جدید بر اساس آنها ایجاد کنید. شما می توانید تمام مجوزهای کاربر خود را در این الگوی خط مشی دسترسی قرار دهید. در فصل امنیت -> کنترل دسترسیروی "ایجاد الگوی خط مشی دسترسی" کلیک کنید. برای استفاده از دیالوگ پارامترهای زیر:

      نام : CustomPermissionTemplate

      گروه قالب : مدیر

      شرح :

      سپس بر روی دکمه "Add Permission" راست کلیک کنید. از گزینه های زیر در گفتگو استفاده کنید:

      نام : my_view_user_menu

      شرح : حقوق دسترسی به منوی کاربر

      سپس بر روی تب "Access Policy" و سپس روی دکمه "Create Access Policy" کلیک کنید. از گزینه های زیر در گفتگو استفاده کنید:

      نام : مجوزهای سفارشی

      الگوی سیاست دسترسی : CustomPermissionTemplate

      شرح : مجوزهای کاربر من

      روی خط مشی دسترسی «مجوزهای سفارشی» کلیک کرده و «ویرایش» را انتخاب کنید. لیست را به سمت پایین اسکرول کنید تا به my_view_user_menu دسترسی پیدا کنید و کادر کنار آن را علامت بزنید. روی دکمه "ذخیره" در بالا سمت راست کلیک کنید.

      اکنون باید با ایجاد یک ورودی جدید ACL، این حق دسترسی را به کاربر فوق العاده بدهیم. به بخش بروید امنیت -> کنترل دسترسی -> گروه های کاربرروی گروه کاربری "Administrator" راست کلیک کنید و "Edit User Group" را انتخاب کنید، روی زبانه "Context Access" و سپس روی دکمه "Add Context" کلیک کنید. از گزینه های زیر برای گفتگو استفاده کنید:

      متن نوشته : mgr

      حداقل نقش : کاربر فوق العاده - 0

      خط مشی دسترسی : مجوزهای سفارشی

      از منوی بالا انتخاب کنید امنیت -> کنترل دسترسی. هیچ کس نمی تواند این آیتم منو را ببیند، مگر برای کاربری با حقوق نامحدود Super User (و سایر کاربران با این خط مشی دسترسی). اگر به عنوان یکی از ویرایشگرهای سایت وارد کنترل پنل می شوید، زیرمجموعه «مدیریت کاربر» وجود ندارد.

      بازگشت رو به جلو

      اما برای ما نیست؛).

      ما همه چیز را از ابتدا انجام خواهیم داد. چرا ما (من) به این نیاز داشتیم، زیرا گزینه های آماده وجود دارد؟ چون بیشتر دوستش دارم زیرا به نظر من این روش صحیح ترین است. از آنجا که ما قادر به توسعه خودمان هستیم، می توانیم به راحتی کد شخص دیگری را درک کنیم، خطاها را تغییر دهیم، رفع کنیم یا آن را با عملکردهای لازم در یک مورد خاص تکمیل کنیم. و در پایان، انجام کارهای خود اغلب بسیار خوب است!

      روایت بیشتر دلالت بر این دارد که خواننده دارد حداقل دانشبرنامه نویسی PHP. از نظر تئوری، افرادی که اصلاً کد را درک نمی کنند، می توانند کد را کپی کرده و تمام اقداماتی را که در زیر مورد بحث قرار خواهد گرفت، بازتولید کنند. با این حال، ممکن است برای آنها بهتر باشد که از قطعه های آماده a la Ditto استفاده کنند، زیرا آنها فرصت های زیادی را برای پیکربندی خارجی بدون ورود به کد اصلی فراهم می کنند.

      من نمی خواهم در مورد اینکه چه چیزی برای کاربر بهتر است بحث کنم - آماده کردن یا توسعه خود را ... هر دو مزایا و معایب خود را دارند. برای من شخصاً در گزینه دوم مزایای بیشتری وجود دارد. همچنین، هر یک از خوانندگان برای خود تصمیم می گیرد.

      پس بیایید دوباره نگاهی به مال خود بیاندازیم. از آنجایی که بخش های نرم افزاری بسیار زیادی در سایت ما وجود دارد، اما باید با چیزی شروع کنید، پس بیایید برنامه ...

      منوی بالا

      منظور من از عبارت "منو بالا" مجموعه ای از پیوندها به صفحات بالای سایت است (شکل زیر را ببینید):

      من اولین نمونه از ایجاد یک قطعه را با جزئیات کامل شرح خواهم داد، در آینده عمدتاً روی مهمترین جزئیات تمرکز خواهم کرد.

      با درخت سایت ما در سیستم مدیریتی که در مقاله قبلی ساختیم مقایسه کنید:

      همانطور که از شکل مشخص است، چهار سند در درخت سایت برجسته شده اند (یعنی "وبلاگ"، "درباره نویسندگان"، "عکس ها" و "بازخورد") که متعاقباً پیوندهایی را در منوی بالا ایجاد می کنند.

      اجازه دهید همچنین به شما یادآوری کنم که ما قبلا اسنادی را پنهان کرده ایم که نمی خواهیم در منو نشان داده شوند. برای مثال، در تنظیمات سندی به نام «جستجو در سایت» تیک «نمایش در منو» حذف شد و دو سند باقیمانده «پیوندها» و «دسته‌ها» با برداشتن علامت «انتشار» در سایت پنهان شدند. در تنظیمات سند (برگه تنظیمات صفحه تنظیمات سند).

      بدین ترتیب در مقاله قبلی منوی بالا را در سیستم کنترل آماده کردیم.

      حال به موضوع نمایش مستقیم اعمال خود در سایت می پردازیم.

      اکثر برنامه های موجود در سایت توسط به اصطلاح انجام می شود. ""، یعنی قطعات جداگانه کد (همچنین می توان آنها را به عنوان توابع یا زیر روال های جداگانه درک کرد) در PHP. بنابراین برای پیاده سازی نمایش منوی بالا در MODx نیز باید یک قطعه جدید ایجاد کرده، آن را برنامه ریزی کرده و در قالب در جای مناسب یک فراخوان به این قطعه اضافه کنیم.

      بیایید به سیستم مدیریت برویم، تب "منابع" -> "مدیریت منابع" -> تب "Snippets" را باز کرده و روی پیوند "قطعه جدید" کلیک کنید. در قسمت "Snippet Name"، "TopMenu" را بدون نقل قول وارد کنید و فعلاً فقط قطعه خالی را بدون کد ذخیره کنید. پس از ذخیره، نام قطعه خود را در تب "Snippets" مشاهده خواهیم کرد.

      اجازه دهید به شما یادآوری کنم که در قالب ما منوی بالا را به قسمت "TOPMENU" منتقل کردیم. به تب "Chunks" بروید و بخش "" را باز کنید. در محتویات این قطعه کد زیر را مشاهده خواهیم کرد:


      • وبلاگ

      • درباره نویسندگان

      • عکس

      • بازخورد

      این کد فقط منوی ما را ایجاد می کند. بیایید آن را نظر بدهیم و یک تماس به قطعه "TopMenu" در بخش اضافه کنیم:


      []

      در اینجا مجدداً برای توضیح معنای این ساخت [] باید کمی دور شویم. واقعیت این است که با کمک ساختارهایی مانند [] یا [! SnippetName!] است که می‌توانیم با قطعه‌ها در هر نقطه از قالب‌ها، تکه‌ها و حتی فقط در هر صفحه‌ای از سایت تماس برقرار کنیم.

      در این مورد، ساختار [] نشان دهنده یک تماس است قابل ذخیره سازیقطعه، یعنی. فراخوانی به یک زیر روال پویا که نتیجه آن یک بار محاسبه و اجرا می شود و متعاقباً هنگام بارگذاری صفحه، جایی که این قطعه فراخوانی می شود، نتیجه بدون تغییر خواهد بود، زیرا قطعه دوباره فراخوانی نمی شود. بنابراین، ما منابع وب سرور خود را ذخیره می کنیم (و این همیشه زمانی که منبع بازدید زیادی دارد بسیار مهم است).

      با این حال، شرایطی وجود دارد که شما باید همیشه کد قطعه را دوباره اجرا کنید و نمی توانید نتایج را در حافظه پنهان ذخیره کنید. در چنین مواردی از ساختار [!SnippetName!] استفاده می‌شود که همیشه قطعه را مجبور می‌کند بدون ذخیره کش اجرا شود. به قیاس، این ساخت را فراخوانی می نامند غیر کشقطعه

      بنابراین بیایید قطعه "TOPMENU" را ذخیره کرده و صفحه سایت را به روز کنیم. هوم، به اندازه کافی عجیب، اما منوی بالا ناپدید شده است. اما آیا واقعاً اینقدر شگفت انگیز است؟ با کامنت گذاشتن کد HTML منو در قسمت، نمایش آن را در مرورگر پنهان کرده ایم (این را با نگاه کردن به کد منبع تأیید کنید. صفحات HTML). و قطعه "TopMenu" ما هیچ کاری انجام نمی دهد زیرا هنوز چیزی به آن اضافه نشده است. بیایید این نقص را برطرف کنیم :).

      بیایید به برگه "Snippets" برگردیم، قطعه "TopMenu" ایجاد شده را باز کنیم و سعی کنیم قابلیت های آن را آزمایش کنیم ... صبر، خوانندگان پیشرفته من، همه این جزئیات را نمی دانند.

      ابتدا ساده ترین کد (کد PHP معمولی) را بنویسیم:

      echo "تست..."؛
      ?>

      قبل از ذخیره، "ادامه ویرایش" را انتخاب کنید، زیرا. ما باید محتوای قطعه خود را بیش از یک بار تغییر دهیم و پس از آن قطعه را ذخیره خواهیم کرد. بیایید صفحه سایت را رفرش کنیم و به جای منوی بالا ببینیم... خب، راستش را بخواهیم، ​​در نگاه اول تقریباً هیچ تغییری نخواهیم دید، به جز یک پس زمینه منو آبی کمی باز شده. بیایید "CRTL+A" را فشار دهیم تا تمام متن در صفحه سایت انتخاب شود، و خواهیم دید که قطعه ما همچنان متن "Testing..." را به جای منو نمایش می دهد، فقط رنگ متن با رنگ پس زمینه مطابقت دارد. .

      کد قطعه را به صورت زیر تغییر دهید:

      پژواک" آزمایش کردن...";
      ?>

      اکنون به وضوح می توانیم ببینیم که قطعه ما کار می کند و حتی (!) مقداری متن را نمایش می دهد. خوب، این عالی است، اما برای وظیفه ما کافی نیست، زیرا باید اطمینان حاصل کنیم که قطعه ما لینک‌هایی را از سیستم کنترل و دقیقاً در همان کد HTML که در قسمت «TOPMENU» توضیح داده‌ایم، خروجی می‌دهد.

      و باز هم کمی حواس پرتی...

      کل سیستم روابط اسناد در MODx بر این اصل ساخته شده است که هر "سند والد" از صفر تا بسیاری از "اسناد فرزند" ("والد" -> "فرزندان") را شامل می شود.

      هر سند در پایگاه داده MODx شناسه منحصر به فرد خود را دارد "ID" - این عددی است که در پرانتز در درخت سایت در کنار هر یک از اسناد می بینیم.

      به هر حال، این شناسه منحصر به فرد تنها دارای یک مقدار واحد است - به طور منحصر به فرد یک سند خاص را در سیستم مدیریت شناسایی می کند. و نه چیزی بیشتر! من به طور خاص بر این واقعیت تأکید می کنم، زیرا من شاهد تلاش های مکرر برای تغییر این شناسه ها برای اهداف مختلف بوده ام... باید فوراً به خاطر داشته باشید که این به سادگی بی معنی است، بنابراین سعی نکنید این اعداد را تغییر دهید. اصلاً نباید به آنها توجه زیادی کنید، معمولاً از این اعداد صرفاً برای ایجاد پیوند به اسناد خاص استفاده می شود.

      پایگاه داده MODx همچنین دارای یک فیلد «والد» ویژه برای هر سند است. مقدار این فیلد عددی است که یا شناسه منحصربه‌فرد سند والد را نشان می‌دهد یا اگر سند در ریشه درخت باشد، صفر است. بنابراین، همیشه می توان بدون ابهام تعیین کرد که کدام سند سند اصلی برای یک سند معین است.

      برای مشاهده بصری آنچه که در مورد آن صحبت کردیم، phpMyAdmin را باز کنید، پایگاه داده خود را انتخاب کنید و جدول (PREFIX)site_content را پیدا کنید، جایی که (PREFIX) پیشوندی است که در هنگام نصب وارد کرده اید. شما فیلدهای زیادی را مشاهده خواهید کرد که داده های سند خاصی را ذخیره می کنند، از جمله "ID" - یک شناسه منحصر به فرد، "والد" - شماره سند والد، "pagetitle" - عنوان صفحه، و موارد دیگر.

      بنابراین با استفاده از این اطلاعاتدر مورد اصل ذخیره سازی و پیوند دادن اسناد در MODX، می توانیم بفهمیم که چگونه داده های لازم را برای نمایش لینک های منوی بالای صفحه بدست آوریم: باید تمام اسنادی را که در ریشه درخت سایت قرار دارند، در پایگاه داده پیدا کنیم. در قسمت "والد" مقدار صفر داشته باشید.

      با استفاده از زبان SQL، درخواست مشابهچیزی شبیه به این توضیح داده شده است (شما می توانید این پرس و جو را در قسمت ورودی SQL در phpMyAdmin وارد کنید، پس از جایگزینی "modx_" با پیشوند خود):

      انتخاب کنید *
      از "modx_site_content".
      WHERE "والد" = 0;

      با این حال، چنین درخواستی کاملاً تمام اسناد را از ریشه سایت به ما برمی گرداند، که کاملاً صحیح نیست، بر اساس وظیفه اصلی - نمایش پیوندها فقط به اسنادی که دارای:

      • وضعیت منتشر شده (در پایگاه داده، قسمت "منتشر شده" مسئول این مورد است که مقدار = 1 به معنای انتشار سند است و مقدار = 0 - منتشر نشده است).
      • بدون حذف (فیلد "حذف شده"، که در آن 1 - حذف شده و 0 - حذف نشده است)
      • و دارای مجموعه گزینه "نمایش در منو" هستند (فیلد "hidemenu"، جایی که 1 - پنهان کردن، و 0 - نمایش در منو).

      علاوه بر این، با نگاهی به آینده، بلافاصله اسناد را بر اساس پارامتر "موقعیت منو" مرتب می کنیم که موقعیت هر پیوند را در منوی ما تعیین می کند.

      خوب، از نظر SQL، این یک کار بسیار ساده است و به صورت زیر حل می شود:

      انتخاب کنید *
      از "modx_site_content".
      WHERE «منتشر شده» = 1
      و "والد" = 0
      و "حذف شده" = 0
      و "hidemenu" = 0
      ترتیب بر اساس "menuindex" ASC.

      از نظر تئوری، تمام پرس و جوهای SQL را می توان مستقیماً با استفاده از اسنیپت ها اجرا کرد اسکریپت های پی اچ پی، هر بار از نو به پایگاه داده متصل می شود و بسیاری از عملیات های معمول دیگر را انجام می دهد و آنها را بارها و بارها تکرار می کند... MODx، در میان مزایای دیگر، مجموعه ای آماده از ابزارهای رابط برنامه (API، Application Programming Interface) را فراهم می کند. APIها توابع نرم افزاری هستند که بسیاری از فرآیندهای پردازش داده را یکپارچه و تسهیل می کنند.

      بیایید از یکی از توابع API "getDocumentChildren" در قطعه خود استفاده کنیم. تابع "getDocumentChildren" داده های زیر را به عنوان پارامتر دریافت می کند:

      • $id - شماره سند والد،
      • $active - فقط اسناد منتشر شده یا منتشر نشده را انتخاب کنید (به ترتیب 1 یا 0)،
      • $deleted - فقط اسناد حذف شده یا حذف نشده را انتخاب کنید (1 | 0)،
      • فیلدهای $ - فیلدهایی که از پایگاه داده انتخاب می شوند،
      • $where - شرایط ویژه، به عنوان مثال. شرط WHERE در پرس و جو SQL،
      • $sort - فیلدی که نتایج باید بر اساس آن مرتب شوند
      • $direction - جهت مرتب‌سازی، می‌تواند ASC یا DESC باشد، یعنی. مرتب سازی از کوچکترین به بزرگترین مقدار یا بالعکس
      • $limit - محدودیت درخواست، i.e. شرط LIMIT در پرس و جو SQL

      $results = $modx->getDocumentChildren(
      $id = 0
      $active = 1
      $حذف شده = 0
      $where="hidemenu=0"،
      $sort="menuindex"،
      $dir="ASC"،
      $ حد
      );

      چاپ("

      Foreach ($نتایج به عنوان $key => $value) (
      print_r($value);
      }

      چاپ("");
      ?>

      قطعه را ذخیره کنید و صفحه را بازخوانی کنید. در نتیجه اجرای قطعه به روز شده "TopMenu"، لیستی از آرایه ها و مقادیر آنها را مشاهده خواهید کرد که بر اساس مقادیر فیلد "menuindex" از کوچکترین مقدار به بزرگترین مرتب شده اند. پارامتر $dir="ASC" را به $dir="DESC" تغییر دهید - در نتیجه، آرایه ها بازسازی می شوند و سند با بالاترین ارزشفیلدهای "menuindex".

      برنامه نویسان باتجربه احتمالاً می دانند که نتیجه به دست آمده قبلاً همه چیزهایی را که برای ایجاد یک منوی آماده با پیوندها نیاز دارید را ارائه می دهد. خوب، تقریباً همه چیز. در هر صورت ادامه می دهم: کد PHP را بازنویسی می کنیم تا هرچه بیشتر به نتیجه دلخواه نزدیک شویم.

      $results = $modx->getDocumentChildren(
      $id = 0
      $active = 1
      $حذف شده = 0
      "id, page title, منتشر شده, menuindex, deleted, hidemenu, menutitle"
      $where="hidemenu=0"،
      $sort="menuindex"،
      $dir="ASC"،
      $ حد
      );

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

      Foreach ($نتایج به عنوان $key => $value) (
      $items .= "


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

      اگر ($items != "") (
      $output = "

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

      برگردان $output;

      ما کد را با جزئیات تجزیه و تحلیل نمی کنیم، زیرا این رایج ترین کد PHP است، نه بیشتر. اگر کسی معنای هیچ سازه ای را نمی فهمد، در نظرات یا بهتر از آن - در انجمن های پشتیبانی مناسب می پرسم.

      کد قطعه جدید را ذخیره کرده و صفحه را رفرش کنید. در نتیجه اجرای کد، تقریباً آنچه را که می‌خواستیم دریافت کنیم، خواهیم دید:

      آن ها اینها لینک هایی هستند که قبلاً به طور خودکار تولید می شوند که ساختار آنها ساختار اسناد را در درخت MODx به طور کامل تکرار می کند. برای آزمایش این، سعی کنید یک سند آزمایشی در ریشه سایت ایجاد کنید و صفحه را بازخوانی کنید.

      با این حال، این همه چیز نیست. خیلی ها قبلاً متوجه شده اند که پیوندهایی وجود دارد، اما هیچ پیوندی وجود ندارد ... پارادوکس :). منظور من این است که عنوان اسناد در منو نمایش داده می شود، اما لینک آنها کار نمی کند. این منطقی است، زیرا تا کنون، "#" در کد پیوند به جای مسیرهای واقعی نمایش داده می شود.

      برای حل این مشکل، باید با یکی دیگر از ویژگی های بسیار مفید MODx آشنا شوید: آدرس هر صفحه داخلیسایت را می توان با استفاده از ساختار زیر به دست آورد [~id~]، که در آن id شماره منحصر به فرد سند مورد نظر است، یعنی. همان عدد در پرانتز در کنار نام هر سند در درخت سایت نشان داده شده است. بنابراین، با افزودن چنین ساختاری [~1~] در محتوای قالب/تکه/صفحه،

        • index – نام مستعار سند "Blog"، اگر "index" را به عنوان نام مستعار سند وارد کرده باشیم، یا
        • 1.html اگر در قسمت "Alias" برای سند "Blog" چیزی وارد نکرده باشیم
      • اگر پیوندهای دوستانه غیرفعال باشند، متن index.php?id=1 را مشاهده خواهیم کرد

      بیایید قطعه را با استفاده از این اطلاعات بازنویسی کنیم:

      $results = $modx->getDocumentChildren(
      $id = 0
      $active = 1
      $حذف شده = 0
      "id, page title, منتشر شده, menuindex, deleted, hidemenu, menutitle"
      $where="hidemenu=0"،
      $sort="menuindex"،
      $dir="ASC"،
      $ حد
      );

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

      Foreach ($نتایج به عنوان $key => $value) (
      $items .= "


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

      اگر ($items != "") (
      $output = "

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

      برگردان $output;

      بنابراین ما # را به [~".$value["id"]."~] تغییر دادیم، یعنی. در واقع، برای هر سند از آرایه، شناسه منحصربه‌فرد آن در ساختار [~id~] جایگزین می‌شود. در نتیجه، منویی با پیوندهای کاری دریافت می کنیم.

      تقریباً به ایده آل رسیده ایم ... با این حال، حتی در حال حاضر هنوز یک جزئیات وجود دارد که باید مورد توجه قرار گیرد: طراح تصمیم گرفت که پیوند فعال ما باید با پس زمینه سفید برجسته شود و رنگ پیوند باید به نارنجی تغییر کند. بر این اساس.

      برای رسیدن به این هدف، ما دوباره اسرار MODx CMS را فاش خواهیم کرد :). تابع $modx->documentIdentifier در API پنهان است که مقدار شناسه منحصر به فرد صفحه فعلی را برمی گرداند. برای تعیین صفحه فعال و انتخاب آن در منو به آن نیاز داریم:

      $results = $modx-> getDocumentChildren(
      $id = 0
      $active = 1
      $حذف شده = 0
      "id, page title, منتشر شده, menuindex, deleted, hidemenu, menutitle"
      $where="hidemenu=0"،
      $sort="menuindex"،
      $dir="ASC"،
      $ حد
      );

      $cid = $modx->documentIdentifier;

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

      Foreach ($نتایج به عنوان $key => $value) (
      if ($value["id"] == $cid) (
      $active = " id=\"فعال\"";
      }
      دیگر(
      $active = "";
      }
      $items .= "
      ".$value["pagetitle"]."
      \n"؛
      }

      اگر ($items != "") (
      $output = "

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

      برگردان $output;

      خوب، چگونه کار کرد؟ اتفاق افتاد!

      اما شما فکر نمی کردید که این پایان کار باشد، نه؟ و به درستی. ما بالاترین نوار را برای خود تعیین می کنیم، می خواهیم از حداکثر قابلیت های MODx استفاده کنیم. و جزئیات کوچک دیگری که ما از دست دادیم.

      بیایید نگاهی دقیق‌تر به نام فیلدهایی که با استفاده از تابع getDocumentChildren درخواست می‌کنیم بیاندازیم: "id, pagetitle, published, menuindex, deleted, hidemenu, menutitle". در میان آنها زمینه ای به عنوان "menutitle" وجود دارد. همانطور که از نام آن پیداست، این فیلد می تواند ذخیره کند عنوان منو. کنترل همچنین دارای یک فیلد ورودی "مورد منو" است. این فیلد اختیاری است. اما منطق این است که اگر این فیلد پر شد، باید متن لینک موجود در منو را با متن وارد شده توسط کاربر جایگزین کنیم. خوب بیایید این کار را انجام دهیم:

      /********************************
      نام: منوی بالا
      هدف: نمایش منوی بالا
      پروژه: سایت دمو MODx
      ********************************/

      $results = $modx->getDocumentChildren(
      $id = 0، // شناسه سند والد
      $active = 1، // فقط اسناد منتشر شده را انتخاب کنید
      $deleted = 0، // فقط اسناد حذف نشده را انتخاب کنید
      "id, pagetitle, منتشر شده, menuindex, deleted, hidemenu, menutitle" // انتخاب فیلدها از پایگاه داده
      $where = "hidemenu = 0"، // فقط اسنادی را انتخاب کنید که باید در منو منتشر شوند
      $sort="menuindex", // اسناد را بر اساس قسمت فهرست فهرست مرتب کنید
      $dir="ASC"، // اسناد را به ترتیب صعودی مرتب کنید
      $limit = "" // ما محدودیتی تعیین نمی کنیم (پارامتر LIMIT در پرس و جوی SQL)
      );

      $cid = $modx->documentIdentifier; //شناسه صفحه فعلی را دریافت کنید

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

      Foreach ($نتایج به عنوان $key => $value) (
      if ($value["id"] == $cid) (
      $active = " id=\"فعال\"";
      }
      دیگر(
      $active = "";
      }
      if ($value["menutitle"] != "") (
      $title = $value["menutitle"];
      }
      دیگر(
      $title = $value["pagetitle"];
      }
      $items .= "
      ".$title."
      \n"؛ //جمع آوری آیتم های منو
      }

      // اگر حداقل یک مورد از منو پیدا شد،
      // کد منوی HTML ایجاد کنید
      if ($items != "") (
      $output = "

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

      // نتیجه قطعه را برگردانید
      بازگشت $output;

      حالا سعی کنید متنی را در قسمت ورودی "مورد منو" هر سندی وارد کنید... کار می کند؟ فوق العاده!

      P.S.: شاید برخی از خوانندگان تعجب کنند که وقتی روی پیوندهای موجود در منوی ما کلیک می کنید ، محتوای صفحات تغییر نمی کند ، اگرچه به نظر می رسد با قضاوت بر اساس مسیر در آدرس مرورگر ، ما به صفحات جدیدی می رویم. باور کنید، این کاملا طبیعی است، زیرا. کاملاً همه صفحات در حال حاضر از یک الگو استفاده می کنند. در این قالب، در واقع، ما تا کنون فقط منوی بالا را پویا کرده ایم، سایر جزئیات بدون تغییر باقی می مانند. ما قطعاً بعداً با این موضوع برخورد خواهیم کرد، اما در حال حاضر - وحشت نکنید؛).

      نتیجه:

      بنابراین، مقاله دیگری به نتیجه منطقی خود رسیده است.

      نتایج یادگیری:

      • ما سعی کردیم هدف برخی از فیلدهای ورودی در اسناد MODX را درک کنیم و به ذخیره این اطلاعات در یک پایگاه داده نگاه کردیم.
      • در مورد ساختارهای ویژه MODx جدید یاد گرفت: [], [!SnippetName!], [~id~];
      • از در دسترس بودن یک API ویژه مطلع شد و از برخی از عملکردهای API استفاده کرد.
      • و بر اساس این دانش، قطعه جدید خود را در MODx ایجاد کردیم!