it-swarm.asia

إضافة اقتراح موضوع برمجيا

لقد أنشأت وحدة ميزات تحتوي فقط على طريقة عرض ونوع محتوى.

الآن page-node-x.tpl.php وملفات views-view-y.tpl.php تكمن في دليل السمات الخاص بي.

هل من الممكن نقلها إلى وحدة الميزة الخاصة بي؟

8
jantimon

لقد بدأت بـ إجابة 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 ولكن أيضًا لتوفير وظيفة معالجة مسبقة للمشاهدات.

لذلك إذا حصلت على وحدتك الخاصة التي تسمى 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');
}
1
jantimon

الوحدة النمطية التي تنفذ 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 () .

في طرق العرض ، يجب أن تكون هناك وظيفة معالجة مسبقة مكافئة لاستخدامها بنفس الطريقة ، أو طريقة تسمح لـ hook_preprocess_page() التي تسمح للوظيفة بفهم ما إذا كانت الصفحة مرتبطة بطريقة عرض.

5
kiamlaluno

لا يبدو أن الحل لإضافة مفتاح "ملف القالب" إلى 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',
  ),
 );
}
3
Joe Hyde

لوجهات النظر هناك من الناحية النظرية آلية لقوالب طرق العرض (ربما تعمل لجميع القوالب).

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

بمجرد الحصول على طرق العرض هذه ، سيقوم بفحص الدليل المحدد لملفات القالب. للأسف فشل أبسط حاليا ، لذلك ربما لم يتم نقل هذه الميزة إلى drupal7 ، ولكن إذا كان هناك شخص يريد الدخول إليها ، فراجع _views_find_module_templates () في views.module.

2
Daniel Wehner

تسجيل السمة هو المكان الذي يتم فيه تخزين Drupal جميع أنواع المعلومات حول ملفات القالب ووظائف السمة وما إلى ذلك. يمكن أن يؤدي العبث به إلى لحظات WTF لاحقًا ، حيث لن تعمل الأشياء مثل الإعداد الافتراضي.

على أي حال مثل كل الأشياء دروبال ، هناك خطاف: hook_theme_registry_alter يمكنك استخدامه لتغيير تسجيل السمة وهذا ينقل ملفات القالب إلى وحدة نمطية. لا أنصح بذلك ، لأنه سيجعل الحفاظ على الموقع أكثر تعقيدًا. ولكن إذا كنت ترغب في ذلك ، فهذه هي الطريقة التي يتم بها.

2
googletorp

أسهل طريقة هي استخدام 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');
}
2
Damien Tournoud

كما قال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);
}

لقد جربت كل من الجواب المقبول وهذا الحل ، هذا الأخير يناسبني حتى الآن!

1
lmeurs

ماذا عن نهج مجردة قليلا مع موضوع رد فعل السياق؟

http://drupal.org/project/context_reaction_theme

اختتم السياق الخاص بك في الميزات وحتى أنه قابل للتصدير. ولكن ربما هذا في الواقع Drupal يبحث عن إنشاء شيء أعمق ومعرفة الطريق.

1
doublejosh