以编程方式创建块的简单方法?[关闭]


26

学习Drupal。我现在知道我可以在后端创建块,但是如果可能的话,我宁愿以编程方式预先创建它们。实际上,我非常确定这是可能的。但是最简单的方法是什么?


Answers:


34

对于Drupal 7:

自定义模块中使用hook_block_infohook_block_view挂钩。hook_block_info定义块。它将显示在admin > 结构 > 块中。* 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;
}
?>

有关钩子的完整列表,请参见Drupal.org上的Blocks API页面。Drupal 6有点不同。没有hook_block_view挂钩;而是使用hook_block声明块。


6

对于Drupal 6,简短的答案是您创建一个实现hook_block的自定义模块。

对于Drupal 7,可以使用Block API

如果这是您首次涉足模块开发,我强烈建议您使用Pro Drupal开发Pro Drupal 7开发。您几乎需要知道的所有内容都在其中。


似乎hook_block只能在单独的模块中使用:我仍然不明白为什么会如此复杂……在Drupal中为所有组件都配备模块是一种惯例吗?
jayarjo 2011年

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_submitin 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 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.