Drupal 6 переопределение модулей Блокировка файлов шаблонов - PullRequest
1 голос
/ 09 января 2012

Я построил модуль с именем ap_news, и он создает несколько блоков. У меня есть файлы пользовательских шаблонов блоков в "sites / all / modules / custom / ap_news / theme /". Все это работает, но я хочу, чтобы дизайнеры могли переопределить эти файлы TPL, поместив их копию в "sites / mysite.com / themes / theme428 / templates / block" или в "sites / mysite.com / themes / theme428 / шаблоны / ap_news» Поэтому я бы хотел, чтобы Drupal сначала посмотрел в папку с темой сайтов, а если не нашел, то загляни в папку с моими темами. Я пробовал, но он использует только тот, что в моем модуле. Вот мой блок и код темы:

    function ap_news_block($op = 'list', $delta = 0, $edit = array()) {

    switch ($op) {

        case "list":

            // Generate listing of blocks from this module, for the admin/block page
            $block = array();
            $block['ap_news_national_news']['info'] = t('National news');
            $block['ap_news_national_news']['cache']=BLOCK_NO_CACHE;

            $block['ap_news_world_news']['info'] = t('World news');
            $block['ap_news_world_news']['cache']=BLOCK_NO_CACHE;           

            return $block;
            break;

        case "view":  

            switch ($delta) {

                case 'ap_news_national_news': // block-ap_news_national_news.tpl.php
                // Generate our block content       
                $html = ap_news_nationalNews();
                $block['subject'] = 'National News';  
                $block['content'] =  $html;
                $data = new stdClass(); $data->module = 'ap_news'; $data->content = $html; $data->delta = $delta; $data->subject = 'National News';
                $block['content'] =  theme('block-'.$delta, $data);
                break;
                //--------------------

                case 'ap_news_world_news': // block-ap_news-world_news.tpl.php
                $data = ap_news_allNews_block('WORLD', APNEWS_CID_WORLD_NEWS, 4);
                $block['subject'] = 'World News';
                $block['content'] =  theme('block-ap_news-all_news', $data, base_path().APNEWS_PATH_WORLD_NEWS, 'World News', 'worldNews');
                break;

            }

    }

    return $block;
}



function ap_news_theme() {

    return array(

        'block-ap_news-all_news' => array(
            'template' => 'theme/block-ap_news-all_news',
            'arguments' => array('data' => NULL, 'path' => NULL, 'sectionName' => NULL, 'sectionId' => NULL),
        ),
        'block-ap_news_national_news' => array(
            'template' => 'theme/block-ap_news_national_news',
            'arguments' => array('block' => NULL),
        ),

    );

}

UPDATE: Я создал функцию для поиска файлов.

        'block-ap_news-national_news' => array(
        'template' => 'block-ap_news-national-news',
        'arguments' => array('block' => NULL),
        'path' => ap_news_templatePath('block', 'block-ap_news-national-news', 'ap_news'),
    ),

/*
 * Find the template paths. 
 * First look in the sites custom theme template folder (/themes/theme428/templates/ap_news), 
 * then in sites normal theme template folder, 
 * then in the modules folder
 */
function ap_news_templatePath($type, $template, $custom=''){

    $siteThemePath = path_to_theme() . '/templates/' . $type. '/';
    $siteCustomThemePath = path_to_theme() . '/templates/' . $custom. '/';
    $moduleThemePath = drupal_get_path('module', 'ap_news') . '/theme/';

    if(file_exists($siteCustomThemePath . $template . '.tpl.php')){
      return $siteCustomThemePath;
    }elseif(file_exists($siteThemePath . $template . '.tpl.php')){ 
        return $siteThemePath;
    }else{
        return $moduleThemePath;
    }

}

1 Ответ

2 голосов
/ 10 января 2012

Проблема в том, что вы добавляете папку «theme» модулей к имени шаблона, что приводит к путанице в функции поиска предложений шаблона drupals - для этого вам следует использовать элемент «path», например ::100100

function ap_news_theme() {
  $path_to_templates = drupal_get_path('module', 'ap_news') . '/theme';
  return array(
    'block-ap_news-all_news' => array(
      'template' => 'block-ap_news-all_news',
      'arguments' => array('data' => NULL, 'path' => NULL, 'sectionName' => NULL, 'sectionId' => NULL),
      'path' => $path_to_templates,
    ),
    'block-ap_news_national_news' => array(
      'template' => 'block-ap_news_national_news',
      'arguments' => array('block' => NULL),
      'path' => $path_to_templates,
    ),
  );
}

При этом он все равно должен найти файлы шаблонов в вашем модуле, но переопределение их из папки темы должно работать.

Однако , я не уверен, найдет ли он их в предложенных вами дополнительных подпапках темы ('templates / ap_news' и 'templates / block'), поэтому сначала вам нужно проверить с переопределениями прямо в папку с темами (и шаблонами тем).

...