it-swarm.asia

كيف أقوم بتغيير موضوع بناءً على عنوان URL؟

لدي Drupal مثيل قيد التشغيل على example.org. والذي يحتوي على السمة X مثبتة ومفعَّلة. الآن لفترة محدودة من المفترض أن يُعقد حدث على الموقع الذي يحتوي قسم خاص به تم "اقتطاعها". ستنتقل كل الأشياء المتعلقة بهذا الحدث إلى example.org/event2011.

أريد الحصول على موضوع مختلف لعرضه عند عرض صفحة ضمن هذا القسم (على سبيل المثال http://example.org/event2011/about ، http://example.org/event2011/node/12 ). كيف يمكنني فعل ذلك؟

لقد مررت بالعديد من الوحدات ، ولكن لا يدعم أي منها Drupal 7. ويفضل أن يتم ذلك باستخدام الوحدات ولا أريد أن أغير أي شيء بنفسي على مستوى الرمز .

38
Samyak Bhuta

وبالنظر إلى أن التغيير لفترة محدودة من الوقت ، وأن تنفيذ هذا الرمز ليس صعبًا ، أقترح تنفيذ وحدة مخصصة لتغيير السمة المستخدمة لصفحات معينة.

يكفي تنفيذ hook_custom_theme() كما يلي:

function mymodule_custom_theme() {
  if (arg(0) == 'event2011') {
    return 'the theme to use for that page';
  }
}

إذا كنت بحاجة إلى تغيير السمة فقط http://example.com/event2011 ، ولكن ليس لـ http://example.com/event2011/node/12 ، ثم يجب تغيير الرمز إلى

function mymodule_custom_theme() {
  if (arg(0) == 'event2011' && !arg(1)) {
    return 'the theme to use for that page';
  }
}

أما فيما يتعلق باستخدام استدعاءات السمة في تعريف استدعاء القائمة ، فإن الوثائق تقول:

كقاعدة عامة ، يجب أن يقتصر استخدام وظائف رد اتصال السمة على الصفحات التي ترتبط وظيفتها ارتباطًا وثيقًا بموضوع معين ، حيث لا يمكن تجاوزها إلا من خلال الوحدات التي تستهدف تلك الصفحات على وجه التحديد في hook_menu_alter(). يجب أن تستخدم الوحدات التي تنفذ وظائف تحويل السمات العامة (على سبيل المثال ، الوحدة التي تسمح بتعيين السمة ديناميكيًا بناءً على دور المستخدم الحالي) hook_custom_theme() بدلاً من ذلك.

33
kiamlaluno

ربما يكون الحل المخصص مثل اقتراح آخر هو الأفضل ، ولكن إذا كنت تريد حقًا استخدام وحدة نمطية ، فإن أفضل رهان هو ThemeKey . اعتبارًا من 5/23/11 ، كان لديها إصدار مستقر.

22
tim.plunkett

بدلاً من ذلك ، يمكنك استخدام خيار theme callback الجديد لنظام القائمة hook_menu_alter() كما هو موضح أدناه. p.s Checkout hook_menu () لمزيد من التفاصيل حول theme callback

<?php
/**
* Implements hook_menu_alter().
*/
function mymodule_menu_alter(&$items) {
  // Set the theme callback function for all node pages. As per the
  // standard behavior for hook_menu() properties, this will be
  // inherited by all paths underneath node/%node as well, unless
  // they define their own theme callback.
  $items['node/%node']['theme callback'] = 'mymodule_default_node_theme';

  // Set a different theme callback for node edit pages, and pass
  // along the node object to this function so we can make decisions
  // based on it.
  $items['node/%node/edit']['theme callback'] = 'mymodule_edit_node_theme';
  $items['node/%node/edit']['theme arguments'] = array(1);
}
/**
* Defaults to using the 'some_theme' theme for node pages.
*/
function mymodule_default_node_theme() {
  return 'some_theme';
}

/**
* For editing page nodes, uses the 'some_other_theme' theme.
*/
function mymodule_edit_node_theme($node) {
  return $node->type == 'page' ? 'some_other_theme' : mymodule_default_node_theme();
}
?>

بالإضافة إلى ذلك ، هناك أيضًا مثال على استخدام hook_custom_theme() الأكثر تقليدية

<?php 
/**
* Implements hook_custom_theme().
*/
function mymodule_custom_theme() {
  // check path using arg(0)
  // check $user
  // do whatever special checking you want and simply return theme key (name of theme folder most of the time)
    return 'special_theme';
  }
}
?>

مأخوذ من: http://drupal.org/node/224333#custom_theme

8
electblake

يعد استخدام ThemeKey أمرًا بسيطًا وهو أكثر الوحدات شيوعًا وقوة حتى الآن (مع دعم 8.x) لتبديل السمة القواعد التي تسمح بالاختيار التلقائي للسمة اعتمادًا على المسار الحالي ، ومصطلحات التصنيف ، واللغة ، ونوع العقدة ، والعديد من الخصائص الأخرى. يمكن أيضًا توسيعه بسهولة لدعم الخصائص الإضافية التي تتعرض لها الوحدات النمطية الأخرى. بجانب الميزات القياسية ، يقوم ThemeKey تلقائيًا بتوسيع ميزاته للعديد من وحدات المساهمة ولديه وحدات ممتدة لها.

الاستخدام (7.x)

بعد تمكين الوحدة النمطية ، انتقل إلى admin/config/user-interface/themekey. هناك العديد من الخيارات لتبديل السمة ، ولكن من المحتمل أنك ستهتم بـ path:node_alias ، لذلك قم بتعيين القيمة كما تريد كما تقول/my_url ثم حدد السمة التي تريد تمكينها في عنوان url هذا. يمكنك أيضًا استخدام أحرف البدل مثل web/* أو /^web/.*.

تحقق: كيفية تحميل سمة للمسار

الاستخدام المتقدم

يحتوي ThemeKey 7.x على وحدة اختيارية تسمى ThemeKey Example لتوضيح للمطورين كيفية توسيع ThemeKey.

المساعدة (7.x)

تحقق من فيديو تعليمي بواسطة Mustardseed (7.x).

يمكن العثور على مزيد من المساعدة حول هذا الموضوع على /admin/help/themekey.

تحقق أيضًا من أسئلة SE الأخرى المتعلقة themekey .


أو هناك أيضًا Switchtheme (7.x) الذي يضيف كتلة للسماح للمستخدمين بالتبديل بين السمات الممكّنة.

6
kenorb

يمكنك ببساطة استخدام Context واستخدام السمة ليتم تطبيقها عندما يكون المسار/event2011/يمكنك ببساطة تعيين المسار في حالة النص البرمجي وتغيير السمة في إجراء المحتوى. كان هذا هو أنه يمكنك بسهولة التبديل بين السمات الموجودة على الموقع بناءً على عنوان URL. حتى يعمل للهواتف النقالة ؛)

6
Amitav Roy

عند استخدام الأسماء المستعارة لعناوين URL أو وحدة Pathauto ، كن على دراية بالفروق الدقيقة والاختلافات عند استخدام مكونات المسار الحالي Drupal.

هناك حالات قد لا تريد استخدام arg () . في الواقع ، Drupal وثائق API تقترح في الواقع تجنب استخدام هذه الوظيفة حيثما أمكن ذلك ، حيث يصعب قراءة التعليمات البرمجية الناتجة.

خذ بعين الاعتبار المثال التالي ، كما اقترح kiamlaluno :

function mymodule_custom_theme() {
  if (arg(0) == 'event2011') {
    return 'custom_theme_machine_name';
  }
}

في Drupal 7 ، إذا كانت العقدة لها اسم مستعار = event2011 ، باستخدام arg(0) ستعود node كأول مكون URL ، على عكس الاسم المستعار.

print_r(arg(0));

Array
(
    [0] => node
    [1] => 150
)

بدلاً من ذلك ، إذا كنت بحاجة إلى العمل مع اسم مستعار ، فهناك عدة طرق للحصول على عنوان URL الحالي في Drupal ، بما في ذلك menu_get_object() ، current_path() ، request_path() و اخرين.

إليك مثال معاد استخدامه يستخدم اسمًا مستعارًا كمشغل لتبديل السمة:

function mymodule_custom_theme() {
  $current_page_path = explode('/', request_path());      

  if ($current_page_path[0] == 'event2011') {
    return 'custom_theme_machine_name';
  }
}
5
rjb

كيفية تبديل السمة بناءً على دور المستخدم:

أنشئ وحدة مخصصة وانسخ والصق ما يلي:

<?php
/**
 * Implementation of hook_init().
 */
function mymodule_init() {
  global $custom_theme, $user;
  if (in_array('my special role', $user->roles)) {
    $custom_theme = 'mytheme';
  }
}
?>

يجب عليك استبدال:

mymodule => مع اسم الوحدة الخاصة بك

دوري الخاص => مع اسم الدور الذي سيحتاج المستخدمون إلى القيام به حتى يتمكنوا من رؤية موضوع مختلف.

mytheme => باسم السمة التي تريد التبديل إليها

3
drupalfever

يمكنك استخدام سمة الصفحة الوحدة لتحقيق ذلك بالضبط

وحدة نسق الصفحة هي وحدة بسيطة وسهلة الاستخدام تسمح باستخدام سمات مختلفة عن الموقع الافتراضي على صفحات محددة.

الميزات

  • تعيين سمة لصفحة واحدة أو قائمة الصفحات. (تعيين صفحة على أنها Drupal))
  • اسمح باستخدام حرف "*" كحرف بدل في Drupal المسارات.
  • السماح لترتيب الموضوعات. (إذا تم تحديد عدة صفحات ، فسيتم استخدام السمة الأولى في القائمة)
  • السماح لتمكين/تعطيل سمة.
  • مبتدئ دروبال ودية.
1
IT Pro Manager

يمكنك استخدام وحدة سمات الصفحة لتحقيق ذلك بالضبط: وحدة سمات الصفحة هي وحدة بسيطة وسهلة الاستخدام تسمح باستخدام سمات مختلفة عن السمات الافتراضية للموقع في صفحات محددة.

ميزات :

تعيين سمة لصفحة واحدة أو قائمة الصفحات. (قم بتعيين صفحة على أنها Drupal) اسمح باستخدام حرف "*" كحرف بدل في Drupal. اسمح بترتيب السمات. (إذا كانت الصفحات عدة محددة ، سيتم استخدام السمة الأولى في القائمة) السماح بتمكين/تعطيل السمة. Drupal ودية للمبتدئين.

كما يمكنك استخدام: الأقسام التي تحتوي على معظم الميزات مثل سمة الصفحة ، ولكنها تضيف تحديدًا قائمًا على الأدوار ومنطقة "مقتطف php" لاختيار السمة.

ولكن إذا كنت ترغب في استخدام سمات مختلفة عن الموقع الافتراضي في إنشاء المحتوى وتحريره وعرضه ، فيمكنك استخدام Content Theme مما يسمح باستخدام سمات مختلفة عن الموقع الافتراضي في إنشاء المحتوى وتحريره و عرض الصفحات.

0
onlink