Простой способ создавать блоки программно? [закрыто]

26

Изучение Друпала. Теперь я знаю, что могу создать блок через бэкэнд, но я бы предпочел создавать их программно, если это возможно. На самом деле я уверен, что это возможно. Но какой самый простой способ?

jayarjo
источник
подробный блог: goo.gl/kD3TZu
Суреш Камруши

Ответы:

34

Для Drupal 7:

Используйте ловушки hook_block_info и hook_block_view в вашем пользовательском модуле . hook_block_info определяет блок. Это будет отображаться в админ > структура > блоки . * hook_block_view * отображает содержимое. Ниже приведены примеры из Drupal API.

Пример hook_block_info, где определены два блока (под названием «Синдикат» и «Недавнее содержимое»):

    <?php
function hook_block_info() {
  // This example comes from node.module.
  $blocks['syndicate'] = array(
    'info' => t('Syndicate'), 
    'cache' => DRUPAL_NO_CACHE,
  );

  $blocks['recent'] = array(
    'info' => t('Recent content'),
    // DRUPAL_CACHE_PER_ROLE will be assumed.
  );

  return $blocks;
}
?>

Пример hook_block_view:

<?php
function hook_block_view($delta = '') {
  // This example is adapted from node.module.
  $block = array();

  switch ($delta) {
    case 'syndicate':
      $block['subject'] = t('Syndicate');
      $block['content'] = array(
        '#theme' => 'feed_icon', 
        '#url' => 'rss.xml', 
        '#title' => t('Syndicate'),
      );
      break;

    case 'recent':
      if (user_access('access content')) {
        $block['subject'] = t('Recent content');
        if ($nodes = node_get_recent(variable_get('node_recent_block_count', 10))) {
          $block['content'] = array(
            '#theme' => 'node_recent_block', 
            '#nodes' => $nodes,
          );
        }
        else {
          $block['content'] = t('No content available.');
        }
      }
      break;
  }
  return $block;
}
?>

Обратитесь к странице API Blocks на Drupal.org для получения полного списка хуков. Drupal 6 немного отличается. Нет ловушки hook_block_view; вместо этого используйте hook_block для объявления блоков.

РЯДОМ ТЕМНО
источник
6

Для Drupal 6 краткий ответ заключается в том, что вы создаете пользовательский модуль, реализующий hook_block .

Для Drupal 7 вы используете Block API .

Если это ваш первый опыт разработки модулей, я настоятельно рекомендую Pro Drupal Development или Pro Drupal 7 Development . Здесь есть почти все, что вам нужно знать.

mpdonadio
источник
Кажется, что hook_block может использоваться только в отдельном модуле: | Я до сих пор не понимаю, почему эта сложность ... Это обычная практика - иметь модули для всего в Drupal?
Джаярджо
2
Да, модули являются ключевой концепцией Drupal. В большинстве случаев сам Drupal представляет собой набор модулей, и все это делается с помощью хуков модулей.
mpdonadio
3

Возможно, вы искали то, что я искал, и нашли это здесь:

/modules/block/block.module:
block_custom_block_save ($ edit, $ delta).

Но когда вы посмотрите на эту функцию, вы увидите, что вы можете просто сделать db_update самостоятельно.

db_update('block_custom')
->fields(array(
  'body' => $edit['body']['value'],
  'info' => $edit['info'],
  'format' => $edit['body']['format'],
))
->condition('bid', $delta)
->execute();
Дэн Шумейкер
источник
2

В Drupal 7, взгляните на block_add_block_form_submitв modules/block/block.admin.inc.

Это обычная форма создания блока; Кажется, он просто вставляет записи напрямую, а не вызывает другую функцию. Обратите внимание, что каждая запись в таблице блоков связана с одной темой (вы можете просто использовать активную тему, но безопаснее вставить записи для всех тем).

Таблица block_custom содержит содержимое.

richardg
источник
1

Вы можете использовать модуль Features Extra для экспорта блоков.

Или просто создайте записи прямо в таблице блоков.

INSERT INTO blocks (
  module, delta, theme, status, weight, region, custom,
  throttle, visibility, pages, title, cache)
VALUES (
  'views','blog-block_1','mytheme',1,10,'sidebar_first',0,0,1,'blog\r\nblog/*','',-1)
Дилан Тэк
источник
1
Дополнительный модуль или прямой SQL-запрос ... я думаю, должно быть что-то более чистое.
Джаярджо