Простий спосіб створити блоки програмно? [зачинено]


26

Навчання Drupal. Зараз я знаю, що я можу створити блок через бекенд, але я б скоріше попередньо створити їх програмно, якщо це можливо. Насправді я майже впевнений, що це можливо. Але який найпростіший спосіб?


докладний блог: goo.gl/kD3TZu
Суреш Камруші

Відповіді:


34

Для Drupal 7:

Використовуйте гачки_блока_інфо та гачки_віто_вигляньте у власному модулі . ho_block_info визначає блок. Він з’явиться в адміністраторі > структура > блоки . * ho_block_view * відображає вміст. Дивіться приклади нижче з API Drupal.

Приклад mock_block_info, де визначено два блоки (з назвою Syndicate and Recent content):

    <?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;
}
?>

Приклад прив'язки_блока_перегляду:

<?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 блоків на Drupal.org для повного списку гачків. Drupal 6 трохи відрізняється. Немає гачка_всмоктування гачка; замість цього використовуйте гачку_блок для оголошення блоків.


6

Для Drupal 6 коротка відповідь полягає в тому, що ви створюєте спеціальний модуль, який реалізує гачок_блок .

Для Drupal 7 ви використовуєте API Block .

Якщо це ваш перший прогрес у розробці модулів, я настійно рекомендую Pro Drupal Development або Pro Drupal 7 Development . Насправді все, що потрібно знати, є там.


Здається, що гачку_блока можна використовувати лише в окремому модулі: | Я досі не розумію, чому така складність ... Це звичайна практика мати модулі для всього в Drupal?
jayarjo

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 вміщує вміст.


1

Для експорту блоків можна використовувати модуль " Особливості" .

Крім того, просто створюйте записи безпосередньо в таблиці блоків.

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 ... Я думаю, що навколо повинно бути щось чистіше.
jayarjo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.