Programlı olarak bloklar yerleştirilsin mi?


14

Drupal 7 kullanıyorum. Şu anda web sitemin başlığında bir ana menü gezinme ve Dil değiştirici var. Bunları CMS> Yapı> Bloklar'a gidip blokları başlık bölgesine sürükleyerek oraya yerleştirdim.

Bu bloğu başlıkta programlı olarak nasıl konumlandırabilirim?


Bu bloğu başlıkta nasıl programlayacağınızla ilgili sorunuza göre, http://drupal.org/project/examples Örnek modülünü gözden geçirmenizi öneririz ve özellikle bloğunuzu programlı bir şekilde test etmek için modül Blok Örneği'ni inceleyip etkinleştirebilirsiniz. . Sanırım block_example_block_info()ve 'bölge' değeri test etmek için yararlı olabilir.
cigotete

John, buna bir cevap buldun mu?
16'da

Yanıtlar:


4

Diğer modüller tarafından tanımlanan blokların yerleştirildiği bölgeyi değiştirmek için , aşağıdaki bağımsız değişkenleri alan hook_block_info_alter () yöntemini uygulayabilirsiniz :

  • $blocks (referans ile geçti): modül ve delta ile anahtarlanmış blok tanımlarını içeren dizi
  • $theme: blokların tanımlandığı tema
  • $code_blocks: hook_block_info()Değerleri veritabanından elde edilen değerlerle geçersiz kılmadan önce , uygulamalarda tanımlanan bloklar

3

Hook_page_build () içindeki herhangi bir sayfa bölgesine okunabilir bir dizi eklemek meşrudur. Altbilgi bölgesine bir minipanel eklemek için Drupal 7 örneği.

<?php
/**
 * Implements hook_page_build().
 */
function MODULE_page_build(&$page) {
  $block = module_invoke('panels_mini', 'block_view', 'blah');
  $blocks['blah'] = array('#markup' => $block['content']);

  $region = 'footer';
  if (isset($page[$region])) {
    $page[$region] = array_merge($page[$region], $blocks);
  }
  else {
    $page[$region] = $blocks;
  }
}

Bu, bağlam modülünü kullanan teknikle aynıdır.

Not: bunun çalışması için block.module enable komutuna ihtiyacınız yoktur.


2

D6'da aslında

$block = module_invoke("the_module_name", "block", "view", the_block_delta);
drupal_set_content("the_region_name", theme("block", $block));

D7'de sanırım

$block = module_invoke("the_module_name", "block_view", the_block_delta);
drupal_add_region_content("the_region_name", theme("block", $block));

ama hala D7'de hızlanıyorum.


Bu modüller, gösterilen kodla çağrılmayan hook_block_view_alter uygulayabileceğinden, üçüncü taraf modüllerin çıktıkları bloğu değiştirmesine izin vermez .
kiamlaluno

drupal_add_region_content()Sayfaları yükleme / yükseltme için tasarlandığından, inanın bir çıkmaz noktasıdır.
doublejosh

2

Özel bir blok ekliyorsanız bunu hook_block_info kullanarak yaparsınız, durum seçeneğini 1 olarak ve bölge seçeneğini de bloğun yerleştirilmesini istediğiniz bölgeye ayarlayın.

Misal:

MODULE_block_info() {
  $blocks = array();
  $blocks['my_block'] = array(
    'info' => t('My Block Name'),
    'status' => 1,
    'region' => 'THE_REGION_I_WANT',
   );
   return $blocks;
}

Mevcut bir bloğu değiştirmek istiyorsanız bunun yerine hook_block_info_alter () yöntemini kullanırsınız, aynı seçenekleri güncelleme aşağıda gösterilmiştir.

Misal:

MODULE_hook_block_info_alter(&$blocks, $theme, $code_blocks) {
  $blocks['my_block']['status'] = 1;
  $blocks['my_block']['region'] = 'THE_REGION_I_WANT';
}

Daha fazla bilgi için bkz. Https://api.drupal.org/api/drupal/modules%21block%21block.api.php/function/hook_block_info/7


0

Bu kod @ jonhattan'ın temelindedir, ancak blok konteyner HTML veya bağlamsal bağlantıları oluşturmaz. Ayrıca tüm blokları ve bölgeleri tek bir yerde belirtmek için basit bir yol sağladım.

<?php
/**
 * Implements hook_page_build().
 */
function MODULE_page_build(&$page) {
  global $theme;

  // A list of blocks you wish to display, keyed by region.
  // These are in the format of: 'module_name' => 'delta'.
  $blocks_to_render = array(
    'header' => array(
      'block' => 1,
    ),
  );

  // Add the blocks to each region.
  foreach ($blocks_to_render as $region => $block_list) {
    $block_objects = array();
    foreach ($block_list as $module_name => $delta) {
      $block = block_load($module_name, $delta);
      // Alter some of the defaults to match the current context.
      $block->theme = $theme;
      $block->region = $region;
      $block->weight = 0;
      $block_objects[] = $block;
    }
    $blocks_build = _block_get_renderable_array(_block_render_blocks($block_objects));

    if (isset($page[$region])) {
      $page[$region] = array_merge($page[$region], $blocks_build);
    }
    else {
      $page[$region] = $blocks_build;
    }
  }
}

Not: Kodunun aksine, block.module'un kurulu olması gerekir.


-1

Bu en iyi formu değil, ama olabilir elle böyle sayfa diziye içeriği yerleştirmek ...

function mymodule_page_alter(&$page) {
  $my_content = _mymodule_render_mycontent();
  $page['my_region']['my_special_insert']['content']['#markup'] = $my_content;
}

Rağmen Bağlam veya sadece çekirdek blokları kullanmaya bağlı olmalıdır . Yeni eklentiler yapmak göründüğü kadar kötü değil. Dosyaları doğru bir şekilde adlandırın, bir tetikleyici ve bir test kurun. örnek .


Aslında, ikinci düşüncede bu çözümü paylaştığım için neredeyse pişmanım. Bunu yapma.
doublejosh

-1

ayrıca temanızdaki blokları aşağıdaki gibi ayarlayabilirsiniz:

/**
 * Implements hook_preprocess_page().
 */
function your_theme_preprocess_page(&$variables) {

  if (drupal_is_front_page()) {
    $variables['page']['region_one'] = $variables['page']['region_two'];
    unset($variables['page']['region_two']);
  }
}

Bu, blokların nasıl oluşturulacağı veya işaretlemede nasıl tanımlanacağı sorusuna cevap vermez.
Christian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.