خیلی وقتها هست که میخواهیم برای یک حالت خواص از یک Node یا Term یا User یا Menu یا Block یا Region یا Page یا هر Entity دیگری یک فایل قالب اختصاصی ایجاد کنیم و داخلش هر نوع کد دلخواهی وارد کنیم که اختصاص به اون حالت داشته باشد.
مثلا: ما به صورت پیشفرض میتونیم فایل node.html.twig را برای هر نوع NodeType دلخواه overwrite کنیم مثلا میشه اینجوری: node--[myNodeType].html.twig و داخل این فایل هرجور دوست داریم به دلخواه خود برای نمایش این نوع از نود استایل بزنیم. اما اگر بخواهیم برای این نوع نود فایل page.html.twig هم اختصاصی باشد چطور؟
این حالت به صورت پیشفرض تعریف نشده است اما هوکهایی هست که به راحتی امکان ایجاد هر نوع سفارشی سازی را برای نام فایلهای قابل بازنویسی در قالب ایجاد میکنند. الگوی این هوکها به این صورت است:
function [myThemeName]_theme_suggestions_[themeFileForOverwrite]_alter
مثلا هوک زیر برای ایجاد یک نام پیشنهادی جدید برای فایلهای page است :
function myTheme_theme_suggestions_page_alter(array &$suggestions, array $variables) {
}
وهوک زیر برای ایجاد یک نام پیشنهادی جدید جهت فایل menu :
function myTheme_theme_suggestions_menu_alter
خب حالا یک هوکی مینویسیم که بشود برای هر نوع از نودها فایل page.html.twig را هم به صورت اختصاصی و جداگانه بازنویسی کرد:
function sfae_theme_suggestions_page_alter(array &$suggestions, array $variables) {
# if the page is node then add node_type to file name suggestion as "page--node-type--myNodeType.html.twig"
if ($node = \Drupal::routeMatch()->getParameter('node')) {
$variables['node'] = $node;
$suggestions[] = 'page__node_type__'.$variables['node']->getType();
}
}
و بعد از این میتونیم از این الگو برای بازنویسی فایلهای page.html.twig استفاده کرد:
page--node-type--[myNodeType].html.twig
حالا با همین هوک آخر یک حالتی بنویسید که برای هر نود به ازای هر یک از term ها یا دسته هایی که عضو آنها هست بتوان فایل page را بازنویسی کرد! میتونیم نوع نود را هم در این حالتها دخالت بدهیم تا صدها پیشنهاد یا suggestions جدید ایجاد گردد :)
خبر خوشحالی بخش اینکه اگر تنظیمات حالت develop روی پروژه شما فعال باشد در مروگر خود در هر صفحه ای و هرجایی از سایت که کد را باز کنید (inspect) فایل نام های پیشنهادی موجود جهت overwrite کردن فایل در آن قسمت را در حالت کامنت به شما نمایش میدهد و فایل فعال فعلی را با یک ضربدر مشخص کرده است.
برای استفاده از این امکان دولوپری در فایل development.services.yml پروژه حالت زیر را اضافه کنید:
parameters:
twig.config:
debug: true
موفق باشید
ارسال پیام