it-swarm-eu.dev

Jak motivovat vlastní blok

Vytvořil jsem blok pomocí hook_block_info A hook_block_theme A podobně. Ale jak to mohu motivovat?

Mám to práci vrátit pole s klíči 'subject' A 'content'. Značku jsem však vytvořil přímo v háčku hook_block_view() a to není to, co chci.

V dokumentech se uvádí, že obsah by se měl přednostně vracet jako vykreslitelné pole a ne jako označení. Co je to vykreslitelné pole? Říkají, že by to měla být data namísto značkování, ale vše, co vidím v příkladech, je to, že se používá pouze jako obal pro značkování, takže tam nic nezískalo.

Chci mít v mém tématu možnost block--MYMODULE--DELTA.tpl.php, Ale jak tomu mohu říkat a jak mohu data předat do bloku?

26
yunzen

Způsob, jakým to dělám, je následující ...

function MYMODULE_block_info() {

  $blocks = [];

  $blocks['my_block_machine_name'] = [
    'info'  => t('My Block Title'),
    // @see https://api.drupal.org/api/drupal/includes!common.inc/group/block_caching/7.x
    // You can use different caching options.
    'cache' => DRUPAL_NO_CACHE,
  ];

  return $blocks;
}

function MYMODULE_block_view($delta = '') {

  $block = [];

  switch ($delta) {
    case 'my_block_machine_name':
      // Good idea to check user permissions here.
      if (user_access('access content')) {
        $block['subject'] = t('My Block Title');
        $block['content'] = MY_BLOCK_CONTENT_CALLBACK();
      }
      break;
  }

  return $block;
}

function MY_BLOCK_CONTENT_CALLBACK()() {

  $items = [];

  // This is the simplest kind of renderable array.
  $items['VAR_ONE'] = ['#markup' => 'VAR_ONE_OUTPUT'];

  // Here I added a prefix and a suffix.
  $items['VAR_TWO'] = [
    '#prefix' => '<div class="foo-bar">',
    '#markup' => 'VAR_TWO_OUTPUT',
    '#suffix' => '</div>',
  ];

  // This is where the $items get sent to your my-template.tpl.php template
  // that got registered below.
  return theme('my_cool_block', ['items' => $items]);
}

function MYMODULE_theme() {

  // Here you are registering your template for the block output above.
  $module_path = drupal_get_path('module', 'MYMODULE');

  // Drupal will now look up your modules /theme folder first to grab the
  // template.
  $base = [
    'path' => "$module_path/theme",
  ];

  return [
    'my_cool_block' => $base + [
        // Leave off .tpl.php.
        'template'  => 'my-template',
        // Define variables you want to pass to the template.
        // Here I just pass items, but you can pass any other data as well.
        'variables' => [
          'items' => NULL,
        ],
      ],
  ];
}

A pak v podsložce ve vašem modulu s názvem theme by měl být soubor s názvem my-template.tpl.php které by to mohlo obsahovat:

<?php 

$items = $variables['items'];

print render($items['VAR_ONE']); 
print render($items['VAR_TWO']); 

A pokud jste chtěli, můžete skutečně přepsat implementaci "výchozího" modulu, kterou jste právě udělali pro my-module.tpl.php ve vašem motivu, jak si přejete v block--MYMODULE--DELTA.tpl.php.

27
nedwardss

Vyzkoušejte modul Theme Developer . Pokud jste ji povolili, můžete zaškrtnout políčko v levém dolním rohu vás Drupal stránka. Poté můžete kliknout na váš blok a získat užitečné informace týkající se jejich tematiky. Můžete vidět možné .tpl Například názvy souborů .php pro váš blok.

Vyberte jedno z těchto jmen. První je nejkonkrétnější. Bude to téma pouze jednoho bloku. Vytvořte soubor s tímto názvem ve složce motivu, pokud tam již není. Pokud se chcete organizovat, můžete jej vložit do podsložky.

Zkopírujte obsah block.tpl.php do souboru a začněte měnit věci tak, jak chcete.

Uložte soubor, vymažte mezipaměti a znovu načtěte stránku.

6
jiv-e

Na tuto otázku již existuje řada odpovědí, ale pokusil jsem se poskytnout velmi zjednodušující přístup. Doufejme, že identifikujete devs strukturu pole očekávanou Drupal při vrácení vašeho obsahu bloku).

Za tímto účelem jsem otázku rozdělil na samostatné příklady kódu jako takové,

/**
 * Implements hook_theme().
 */
function examplemodule_theme() {
  return array(
    'examplemodule_output' => array(
      'variables' => array(
        'title' => NULL,
        'content' => NULL,
        'popular_content' => NULL,
       ),
      'template' => 'templates/examplemodule-sweet--block',
    ),
  );
}

Úplné vysvětlení naleznete zde drupal 7 vytváří vlastní blokování témat

5
Nicolas

Toto je starý příspěvek, ale našel jsem lepší řešení pro potlačení šablon bloků z vlastního modulu pro Drupal 7.

Přidejte to do svého vlastního modulu:

/**
 * Implements hook_theme().
 */
function MYMODULE_theme($existing, $type, $theme, $path) {

  // Custom template for that overrides the default block.tpl.php.
  $themes['block__my_custom_module'] = [
    'template'      => 'block--my_custom_module',
    'original hook' => 'block',
    'path'          => drupal_get_path('module', 'my_custom_module') . '/templates',
  ];

  return $themes;
}

Pak potřebujete následující kód:

/**
 * Implements hook_block_info().
 */
function MYMODULE_block_info() {

  $blocks = [];

  $blocks['my_custom_module'] = [
    'info'  => t('My Custom Module Block'),
    'cache' => DRUPAL_CACHE_PER_ROLE,
  ];

  return $blocks;
}

/**
 * Implements hook_block_view().
 */
function MYMODULE_block_view($delta = '') {

  $block = [];

  switch ($delta) {
    case 'my_custom_module':
      $block['content'] = _my_custom_module_helper_function();
      break;
  }

  return $block;
}

/**
 * Helper function to generate HTML.
 *
 * @return string
 *   generated HTML
 */
function _my_custom_module_helper_function() {

  $output = '';

  // ...

  return $output;
}

Jediné, co musíte udělat, je vytvořit templates/block--my-custom-module.tpl.php uvnitř složky vašeho modulu.

Napsal jsem o tom tutorial Drupal Tutorial - Jak potlačit šablony bloků z vlastního modul

3
iStryker