การเพิ่มคำแนะนำธีมโดยทางโปรแกรม


8

ฉันสร้างโมดูลคุณลักษณะที่มีเฉพาะมุมมองและประเภทเนื้อหา

ตอนนี้ไฟล์page-node-x.tpl.phpของฉันและviews-view-y.tpl.phpไฟล์ของฉันอยู่ในไดเรกทอรีธีมของฉัน

เป็นไปได้ไหมที่จะย้ายพวกมันไปไว้ในโมดูลคุณสมบัติของฉัน?

คำตอบ:


5

โมดูลที่ใช้hook_preprocess_page()หรือสามารถแนะนำไฟล์แม่แบบใหม่โดยการเปลี่ยนตัวแปรhook_preprocess_node()$variables['theme_hook_suggestions']

รหัสที่มีอยู่ในtemplate_preprocess_page ()ที่เริ่มต้นตัวแปรนั้นมีดังต่อไปนี้

// Populate the page template suggestions.
if ($suggestions = theme_get_suggestions(arg(), 'page')) {
  $variables['theme_hook_suggestions'] = $suggestions;
}

แต่ละความต้องการข้อเสนอแนะรูปแบบเพื่อให้ตรงกับรายการที่ส่งกลับโดยhook_theme ()

ในมุมมองควรมีฟังก์ชัน preprocess ที่เทียบเท่าเพื่อใช้ในวิธีที่คล้ายกันหรือวิธีที่อนุญาตhook_preprocess_page()ให้ฟังก์ชันนั้นเข้าใจว่าเพจนั้นเชื่อมโยงกับมุมมองหรือไม่


3

วิธีแก้ปัญหาเพื่อเพิ่มคีย์ 'ไฟล์เทมเพลต' ที่ยังhook_views_api()ไม่สามารถใช้งานได้ใน Drupal 7 อย่างไรก็ตามมันใช้งานได้ดีเหมือนมีเสน่ห์:

/**
 * Implements hook_theme().
 */
function bigtexas_theme() {
  return array(
    'views_view_fields__slideshow' => array(
    'variables' => array('view' => NULL, 'options' => NULL, 'row' => NULL),
    'template' => 'views-view-fields--slideshow',
    'base hook' => 'views_view_fields',
    'path' => drupal_get_path('module', 'bigtexas') . '/theme',
  ),
 );
}

2

ชุดรูปแบบรีจิสทรีเป็นที่ที่ Drupal จัดเก็บข้อมูลทุกประเภทเกี่ยวกับไฟล์เทมเพลตฟังก์ชันชุดรูปแบบและอื่น ๆ ที่จะใช้ การ Messing กับมันสามารถนำไปสู่ช่วงเวลา WTF ในภายหลังได้เนื่องจากสิ่งต่าง ๆ จะไม่ทำงานเหมือนค่าเริ่มต้น

ยังไงก็ตามทุกสิ่ง drupal มีเบ็ด: hook_theme_registry_alterคุณสามารถใช้เพื่อแก้ไขรูปแบบรีจิสทรีและย้ายไฟล์แม่แบบของคุณไปยังโมดูล ฉันไม่แนะนำให้ทำเช่นนี้เพราะจะทำให้การบำรุงรักษาเว็บไซต์มีความซับซ้อนมากขึ้น แต่ถ้าคุณต้องการที่จะทำนี่คือวิธีที่มันทำ


+1 - ฉันลองแล้ว แต่ไม่สำเร็จ .. คุณช่วยยกตัวอย่างได้ไหม
jantimon

@Ghommey: ลิงก์ที่ให้มามีรหัสตัวอย่างไม่แน่ใจว่าจะอธิบายได้อย่างไร
googletorp

2

สำหรับมุมมองมีอยู่ในทางทฤษฎีกลไกสำหรับมุมมองเทมเพลต

คุณสามารถตั้งค่าคีย์ "แม่แบบพา ธ " ในการใช้งาน hook_views_api ของโมดูลที่กำหนดเองของคุณ

เมื่อคุณมีมุมมองนี้จะสแกนไดเรกทอรีที่คุณระบุสำหรับไฟล์เทมเพลต น่าเศร้าที่ simpletest ล้มเหลวในขณะนี้ดังนั้นคุณสมบัตินี้อาจยังไม่ได้รับการย้ายไปยัง drupal7 แต่ถ้ามีคนต้องการเข้าไปดูดู _views_find_module_templates () ใน views.module


2

วิธีที่ง่ายที่สุดคือการใช้hook_theme_registry_alter()และเพียงเพิ่มเส้นทางของโมดูลของคุณไปยังเส้นทางธีม:

function mymodule_theme_registry_alter(&$theme_registry) {
  $theme_registry['[theme hook name, ie. page or views-view]']['theme paths'][] = drupal_get_path('module', 'mymodule');
}

มองไปที่theme()การนำไปปฏิบัติดูเหมือนจะไม่theme pathสามารถเป็นอาร์เรย์ได้ คุณแน่ใจเหรอ ดูapi.drupal.org/api/drupal/includes%21theme.inc/function/theme/7
Capi Etheriel

เกี่ยวกับความคิดเห็นของฉันด้านบน: theme pathsเคยทำงานใน Drupal 6 แต่ Drupal 7 เปลี่ยนพฤติกรรมในdrupal.org/node/678714 ดูเหมือนว่าจากความคิดเห็น # 29 และ # 31 ในประเด็นที่กล่าวถึงข้อเสนอแนะชุดรูปแบบจากโมดูลจะต้องมีการประกาศ ใน hook_theme ของโมดูลนั้น แต่จะทำเช่นนั้นได้อย่างไรเมื่อเหลือการออกกำลังกายให้กับผู้อ่าน: /
Capi Etheriel

1

วิธีการเกี่ยวกับใจลอยเล็กน้อยกับธีมปฏิกิริยาตอบสนอง?

http://drupal.org/project/context_reaction_theme

สรุปบริบทของคุณในคุณลักษณะและยังสามารถส่งออกได้ แต่บางทีนี่อาจเป็นคำถามของ Drupal ที่ต้องการสร้างสิ่งที่ลึกกว่าและรู้เส้นทาง


ไม่มีโมดูล D7 และความมุ่งมั่นครั้งล่าสุดเมื่อครึ่งปีที่แล้ว
jantimon

ยังคงทำงานได้ดีจริงบนของ Drupal 6 เว็บไซต์ :)
doublejosh

1

ฉันเริ่มด้วยคำตอบของ googletorpและสร้างฟังก์ชั่นทั่วไป:

/**
 * Overrides a third-party template file with a local copy.
 *
 * To be called from hook_theme_registry_alter():
 * @code
 * function mymodule_theme_registry_alter(&$theme_registry) {
 *   // Override variant of foo template using local copy.
 *   custom_override_template($theme_registry, 'foo--variant', drupal_get_path('module', 'mymodule') . '/templates');
 * }
 * @endcode
 *
 * @param array $theme_registry
 *   Theme registry array as passed to hook_theme_registry_alter().
 * @param string $template
 *   Name of template file without '.tpl.php' extension. Example: 'foo--variant'.
 * @param string $path
 *   Directory to load $template from.
 * @param string $preprocess_function
 *   Optional preprocess function.
 */
function custom_override_template(&$theme_registry, $template, $path, $preprocess_function = NULL) {
  if (strpos($template, '--') !== FALSE) {
    $hook_name = array_shift(explode('--', $template));
  }
  else {
    $hook_name = $template;
  }
  $hook_name = str_replace('-', '_', $hook_name);
  if (isset($theme_registry[$hook_name])) {
    // Copy hook info.
    $hook_info = $theme_registry[$hook_name];
    $hook_info['path'] = $path;
    $hook_info['template'] = $template;
    // Add to theme registry.
    $new_hook = str_replace('-', '_', $template);
    $theme_registry[$new_hook] = $hook_info;
    // Add preprocess function.
    if(!is_null($preprocess_function)){
      $theme_registry[$new_hook]['preprocess functions'][] = $preprocess_function;
    }
    return $new_hook;
  }
  else {
    throw new Exception(t('Unknown theme hook %hook.', array('%hook' => $hook_name)));
  }
}

อนุญาตให้ไม่เพียง แต่เขียนทับตำแหน่งและชื่อของโหนดและดูไฟล์ tpl แต่ยังจัดเตรียมฟังก์ชัน preprocess สำหรับมุมมอง

ดังนั้นหากคุณได้รับโมดูลของคุณเองmymoduleพร้อมไฟล์แม่แบบเช่นsites/all/modules/mymodule/templates/foo--variant.tpl.phpตอนนี้คุณสามารถปรับเปลี่ยนชุดรูปแบบรีจิสทรีเพื่อใช้ไดเรกทอรีแม่แบบของคุณเอง:

function mymodule_theme_registry_alter(&$theme_registry) {
   // Override variant of foo template using local copy.
   custom_override_template($theme_registry, 'foo--variant', drupal_get_path('module', 'mymodule') . '/templates');
}

นี่เป็นการบังคับให้ Drupal ใช้เทมเพลตในโฟลเดอร์โมดูลของคุณ ชุดรูปแบบจะไม่สามารถแทนที่ได้ (ซึ่งควรเป็น)
jcisio

1

ดังที่ @jcsio กล่าวว่าคำตอบที่ได้รับการยอมรับในหน้านี้ใช้งานได้ แต่เทมเพลตไม่สามารถถูกแทนที่ได้ด้วยธีม

http://www.metachunk.com/blog/adding-module-path-drupal-7-theme-registryเสนอโซลูชันที่ช่วยให้คุณเพิ่มเส้นทางของโมดูลของคุณ (และโฟลเดอร์ย่อย) เพื่อสแกนได้ทุกชนิด ของไฟล์. tpl.php

ฉันเปลี่ยนมันเล็กน้อยเนื่องจากมีตัวแปร 'เส้นทางของธีม' ที่ดูเหมือนว่า Drupal 7 จะไม่ได้ใช้

/**
 * Implements hook_theme_registry_alter()
**/
function mymodule_theme_registry_alter(&$theme_registry) {
  $mod_path = drupal_get_path('module', 'mymodule');
  $theme_registry_copy = $theme_registry;       // munge on a copy
  _theme_process_registry($theme_registry_copy, 'phptemplate', 'theme_engine', 'pow', $mod_path);
  $theme_registry += array_diff_key($theme_registry_copy, $theme_registry);
}

ฉันลองทั้งคำตอบที่ได้รับการยอมรับและวิธีแก้ปัญหานี้วิธีนี้ใช้ได้ผลกับฉันจนถึงตอนนี้!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.