Łatwy sposób programowo tworzyć bloki? [Zamknięte]

26

Nauka Drupala. Wiem teraz, że mogę utworzyć blok za pomocą backendu, ale wolałbym je wstępnie programować, jeśli to możliwe. W rzeczywistości jestem całkiem pewien, że to możliwe. Ale jaki jest najłatwiejszy sposób?

jayarjo
źródło
blog szczegółowy: goo.gl/kD3TZu
Suresh Kamrushi

Odpowiedzi:

34

W przypadku Drupal 7:

Użyj hook_block_info i hook_block_view hooks w swoim module niestandardowym . hook_block_info definiuje blok. Pojawi się w admin > struktura > bloki . * hook_block_view * wyświetla zawartość. Zobacz przykłady poniżej z Drupal API.

Przykład hook_block_info, w którym zdefiniowano dwa bloki (zatytułowane Syndicate i Latest 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;
}
?>

Przykład widoku 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;
}
?>

Odnoszą się do strony API Bloki na Drupal.org pełną listę haków. Drupal 6 jest trochę inny. Nie ma haka hook_block_view; zamiast tego użyj hook_block do deklarowania bloków.

BLISKO CIEMNY
źródło
6

W przypadku Drupala 6 krótką odpowiedzią jest utworzenie niestandardowego modułu, który implementuje hook_block .

W przypadku Drupal 7 używasz Block API .

Jeśli jest to Twoja pierwsza próba opracowania modułu, bardzo polecam Pro Drupal Development lub Pro Drupal 7 Development . Jest tam prawie wszystko, co musisz wiedzieć.

mpdonadio
źródło
Wygląda na to, że hook_block może być używany tylko w osobnym module: | Nadal nie rozumiem, dlaczego ta złożoność ... Czy zwykłą praktyką jest posiadanie modułów do wszystkiego w Drupal?
jayarjo
2
Tak, moduły są kluczową koncepcją Drupala. W większości przypadków sam Drupal jest zestawem modułów i wszystko odbywa się za pomocą haków modułów.
mpdonadio
3

Być może szukasz tego, czego szukałem i znalazłeś to tutaj:


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

Ale kiedy spojrzysz na tę funkcję, zobaczysz, że możesz po prostu zrobić db_update samodzielnie.

db_update('block_custom')
->fields(array(
  'body' => $edit['body']['value'],
  'info' => $edit['info'],
  'format' => $edit['body']['format'],
))
->condition('bid', $delta)
->execute();
Dan Shumaker
źródło
2

W Drupal 7, przyjrzeć block_add_block_form_submitsię modules/block/block.admin.inc.

Jest to zwykły formularz tworzenia bloku; wydaje się, że wstawia rekordy bezpośrednio, zamiast wywoływać inną funkcję. Pamiętaj, że każdy rekord w tabeli bloków jest powiązany z jednym motywem (możesz po prostu użyć aktywnego, ale bezpieczniej jest wstawiać rekordy dla wszystkich motywów).

Block_custom stół posiada zawartość.

richardg
źródło
1

Możesz użyć modułu Dodatkowe funkcje do eksportowania bloków.

Alternatywnie, wystarczy utworzyć rekordy bezpośrednio w tabeli bloków.

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)
Dylan Tack
źródło
1
Dodatkowy moduł lub bezpośrednie zapytanie SQL ... myślę, że powinno być coś czystszego.
jayarjo