【问题标题】:How to allow multiple blocks in a module of Drupal如何在 Drupal 的一个模块中允许多个块
【发布时间】:2012-09-17 03:29:19
【问题描述】:

我正在尝试为 Drupal 7 制作一个模块,该模块提供一个块并具有某些配置设置。现在我想要的是我想为用户提供 5 个块,以便他们可以在每个块中使用不同的设置。换句话说,我想为每个块提供一组单独的设置。我该怎么做?

编辑: 实际上我已经制作了一个显示单个块的模块。如果您使用了 superfish 菜单模块,那么您可以在那里看到它们允许我们选择应该提供多少块可用的选项。这样对于每个块我们可以使用不同的菜单来显示。我说的是那个功能

【问题讨论】:

    标签: php drupal module drupal-7 drupal-modules


    【解决方案1】:

    创建配置页面:

    function my_module_admin_settings($form, &$form_state) {
      $form['my_module_number_of_blocks'] = array(
        '#title' => t('Post to Blog by default'),
        '#description' => t('Should content post to blog by default or only when selected?'),
        '#type' => 'select',
        '#options' => drupal_map_assoc(array(2, 3, 4, 5, 6, 7, 8, 9, 10)),
        '#default_value' => 2,
      );
    
      return system_settings_form($form);
    }
    

    您使用hook_block_info 在模块中创建块,您定义一个数组,如:

    hook_block_info() {
      number_blocks = variable_get('my_module_number_of_blocks', 0);
      $x=0
      while ($x < number_of_blocks) {
        $blocks['myblock-' . $x] = array(
          'info' => t('Block ' . $x), 
          'cache' => DRUPAL_NO_CACHE,
        );
      }
      return $blocks
    }
    

    您将在hook_block_configure 中配置值:

    function hook_block_configure($delta = '') {
      // This example comes from node.module.
      $form = array();
      $parts = explode($delta, '-');
    
      if ($parts[0] == 'my_block') {
        $form['my_block_' . $parts[1] . '_option1'] = array(
          '#type' => 'select', 
          '#title' => t('Some option'), 
          '#default_value' => variable_get('my_block_' . $parts[1] . '_option1', 'first_option'), 
          '#options' => drupal_map_assoc(array('first option', 'second option')),
        );
      }
      return $form;
    }
    

    一旦你定义了你的块,你需要告诉他们如何用hook_block_view显示。比如:

    function hook_block_view($delta = '') {
      $block = array();
      $parts = explode($delta, '-');
    
      if ($parts[0] == 'myblock') {
        $block['subject'] = t('Block' . $parts[1]);
        $block['content'] = my_module_block_b_generate($parts[1]);
      }
    
      return $block;
    }
    

    然后你将使用块号和配置来确定输出:

    my_module_block_b_generate($block_number) {
      $option1 = variable_get('my_block_' . $block_number . '_option1', 'first_option');
    
      return t('this is block ' . $block_number . '. It has chosen option ' . $option1 . ' for option1');
    }
    

    【讨论】:

    • 嗨@danielson317!实际上我已经制作了一个显示单个块的模块。如果您使用了 superfish 菜单模块,那么您可以在那里看到它们允许我们选择应该提供多少块可用的选项。这样对于每个块我们可以使用不同的菜单来显示。我说的是那个功能。
    • 这本来是很好的问题信息。让我稍微修改一下我的答案。
    • 非常感谢!我可以根据这些信息扩展我的模块。
    • @CAR182 还没有评论的声誉,但他们指出:“想补充一下,你的 hook_block_info() 代码中缺少 x+=1。没有这个,你会得到一个破坏你的模块的无限循环......不好玩......我也花了很长时间才找到!哈哈”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2011-04-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    相关资源
    最近更新 更多