'arguments' => array('result' => NULL),

    ),

  );

}

Без такой регистрации вызов theme('currencies_block', $argument) будет невозможен. Сама функция темизации будет такой:

function theme_currencies_block($result) {

  $output = '<ul>';

  foreach($result as $k => $v) {

    if($v['diff'] > 0) {

      $color = '#5aaf43';

      $v['diff'] = '+' . $v['diff'];

    }

    else if($v['diff'] < 0) $color = '#f00';

    else if($v['diff'] == 0) $color = '#00f';

    $output .= '<li>' . $v['nominal'] . ' ' . $v['name'] . ' = '

      . $v['value'] . ' (<span style='color: ' . $color . ''>'

      . $v['diff'] . '</span>)</li>';

  }

  $output .= '</ul>';

  return $output;

}

Еще раз обратите внимание на то, что в функции currencies_theme в качестве имени функции темизации указывается название currencies_block, а реализация ее имеет имя theme_currencies_block(). Нужно это, чтобы в дальнейшем разработчики сайтов, использующие наш модуль, могли переопределить эту функцию, т. е. изменить формируемый ею HTML-код. Для этого им в папке со своей темой в файле template.php достаточно будет создать функцию с именем, совпадающим с именем функции темизации, но в котором слово theme заменено на название используемой темы оформления, т. е. создать функцию название_темы_оформления_currencies_block(). Ядро Drupal, когда встретит в коде модуля вызов вида theme('currencies_block', $result), сначала попробует найти функцию темизации в файле template.php используемой в данный момент темы оформления, и только если там ее не найдет, использует функцию theme_currencies_block().

Ядро Drupal пытается найти функцию темизации в файле template.php используемой в данный момент темы оформления.

В случае больших шаблонов удобнее вынести функцию темизации из файла template.php в отдельный файл. Для этого в массиве, возвращаемом реализацией хука hook_theme, нужно добавить элемент с ключом template и именем, соответствующим имени файла-шаблона, а в каталоге с модулем разместить файл-шаблон с указанным ранее именем и расширением .tpl.php. В итоге hook_theme() примет вид:

function currencies_theme() {

  return array(

    'currencies_block' => array(

      'arguments' => array('result' => NULL),

      'template' => 'cur-block',

    ),

  );

}

а в папке с модулем нужно разместить файл с именем cur-block.tpl.php и таким содержимым:

<ul>

<?php

  foreach($result as $k => $v) {

    if($v['diff'] > 0) {

      $color = '#5aaf43';

      $v['diff'] = '+' . $v['diff'];

    }

    else if($v['diff'] < 0) $color = '#f00';

    else $color = '#00f';

    print '<li>' . $v['nominal'] . ' ' . $v['name'] . ' = ' .

      $v['value'] . ' (<span style='color: ' . $color . ''>' .

      $v['diff'] . '</span>)</li>';

  }

?>

</ul>

Теперь, чтобы переопределить вывод данных, формируемых модулем Currencies, разработчику достаточно скопировать файл cur-block.tpl.php из папки с модулем в папку с используемой темой оформления и внести в него необходимые изменения.

Интерфейс пользователя

Сейчас наш модуль имеет интерфейс администратора, умеет автоматически соединяться с удаленным сервером, получать необходимую информацию, формировать из нее HTML-код и сохранять его в кэше. Осталась самая простая для программиста и наиболее значимая для посетителя сайта часть – вывод данных на экран.

Для решения этой задачи мы могли бы через созданную ранее функцию currencies_menu() зарегистрировать еще один путь и в качестве параметра page callback указать функцию currencies_contents (), которая получила бы необходимые данные (из кэша или от удаленного сервера) и вывела бы их на экран через функцию темизации. Но мы хотим, чтобы курсы валют выводились не отдельной страницей, а в блоке (оформленный особым образом элемент, содержащий данные) на любой заданной администратором сайта странице. Для этого необходимо создать реализацию хука hook_block() (см. листинг 4).

Листинг 4

function currencies_block($op = 'list', $delta = 0,

    $edit = array()) {

  switch ($op) {

    case 'list':

    $blocks[0] = array(

      'info' => t('Currencies block'),

    );

    return $blocks;

    case 'view':

    switch ($delta) {

      case 0:

      $block['subject'] = t('Currencies block');

      $block['content'] = currencies_contents();

      break;

    }

    return $block;

  }

}

Параметр $op (сокращение от operation), содержит информацию о том, какая операция над блоком в данный момент выполняется. Значение list сообщает модулю, что информация о нем выводится в списке модулей, здесь мы должны передать ядру Drupal один обязательный параметр – заголовок модуля и ряд необязательных параметров, информацию о которых можно найти в документации.

Значение view аргумента $op означает, что пользователь просматривает страницу, на которой должен

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату
×