Bir dal şablonunda programlı olarak bir blok oluşturma


28

Page.html.twig şablonumda bir görünüm bloğu oluşturmam gerekiyor. D7'de bunu yapardım:

<?php
  $block = module_invoke('module_name', 'block_view', 'block_delta');
  print render($block['content']);
?>

Drupal 8'de module_invoke kullanımdan kaldırıldı ve bunu kullanması önerilir: (bloğun adını ikinci parametre olarak ekledim)

Drupal::moduleHandler()->invoke($block, 'views_block__blog_block_1', $args = array());

Birkaç şey denedim. İlk önce bir dal şablonunda yapmaya çalıştım, ancak bir dal şablonunda php işlevlerini nasıl çağıracağımı bilmiyorum, bu yüzden çok iyi sonuçlanmadı.

Daha sonra, .theme dosyasındaki preprocess_page () işlevindeki işlevi çağırdım, ancak işe yaramadan önce, işe yaramayan dal şablonunun içinde değişken bir iş yapmayı denemek için daha basit bir şey denedim, örneğin:

.Theme dosyasındaki template_preprocess_page (& $ vars) işlevinde:

$test = 'Hello World';
$vars['$my_var'] = $test;

Twig şablonunun içinde my_var'ı aramaya çalıştım ancak çalışmadı ve "Site bir hatadır, lütfen yöneticiye başvurun" diyen bir hata mesajı aldım.

Yani, özetlemek gerekirse, benim sorum şu:

  1. Değişkenleri dal şablonlarında nasıl kullanılabilir hale getiririm?
  2. Dal şablonlarının içindeki fonksiyonları nasıl çağırırım?
  3. .Theme dosyasında veya dal şablonunda bloklar oluşturabilir miyim?

Yanıtlar:


47

Module_invoke () ile yanlış yolda. Bu, {$ module_name} _block_view () işlevini çağırmanın süslü bir yolu.

Değişmiş olması önemli değil, mesele şu ki blok sistemi 8.x'te tamamen değişti ve şimdi eklentiler ve konfigürasyon varlıkları kullanıyor, bu işlevler artık mevcut değil.

Birkaç seçeneğin var.

a) Mevcut bir blok yapılandırma öğesini tekrar kullanın ve görüntüleyin. Çok kolay, ancak bu yapılandırmanın, örneğin engelli bir blok olarak var olmasını gerektirir.

$block = \Drupal\block\Entity\Block::load('your_block_id');
$variables['block_output'] = \Drupal::entityTypeManager()
  ->getViewBuilder('block')
  ->view($block);

b) Doğrudan blok eklenti örneğini oluşturun, konfigürasyonu iletin (dışarı aktarılan bir blok konfigürasyon öğesinde blok eklenti kimliğini ve konfigürasyonu kolayca bulabilirsiniz). Dezavantajı ise, önbellekleme yapmamanızdır, ancak onu zaten önbelleğe alınmış bir yerde görüntülerseniz (bir düğüm şablonu gibi), bu gerçekten önemli değil.

$variables['block_output'] = \Drupal::service('plugin.manager.block')
  ->createInstance($plugin, $configuration)
  ->build();

c) Bir görünüm olması durumunda, görünümü doğrudan yükleyebilir ve görüntüleyebilirsiniz.

d) Yaklaşımınızı tamamen yeniden düşünebilir ve blok bölgeleri veya Sayfa Yöneticisini (8.x'te standart blok eklentileri kullanan) kullanabilirsiniz.


Cevabınız için teşekkür ederim. A veya B ile gitmek istiyorum. Bölge çalışacak ancak bölge kullanmaktan kaçınmak istiyorum. Yaptığım tek sorun dal şablonundaki block_output'u çağırdığımda bir hatam var - "Beklenmeyen etiket adı" block_output "bu yüzden bu değişkeni preprocess_page işlevinde oluşturduğum halde nasıl kullanılabilir hale getireceğimi bilmiyorum. Çalışmaya çalışacağım
Rick Bergmann

Görünüşe göre {%? {{Block_output}} kullanın.
Berdir

Evet, öyleydi! Hala dal asmaya çalışıyorum. Teşekkürler.
Rick Bergmann

Drupal 8.0.0'dan beri entityManager kullanımdan kaldırılmıştır. Kullanım entityTypeManager yerine.
Philipp Michael,

bu kodu nereye koyacağım? $ block = \ Drupal \ block \ Entity \ Block :: load ('your_block_id'); $ değişkenleri ['block_output'] = \ Drupal :: entityManager () -> getViewBuilder ('blok') -> görünüm ($ blok); Teşekkür ederim!

11

Drupal 8'de bu, bir preprocess_hook'ta bir blok eklentisi (yani, özel bir modülde oluşturduğunuz):

function mymodule_preprocess_something(array &$variables) {
  $customblock = \Drupal::service('plugin.manager.block')->createInstance('my_custom_block', []);
  $variables['content']['custom_block_output'] = $customblock->build();
}

Daha sonra bunu dal şablonunuzda şöyle yapabilirsiniz:

{{ content.custom_block_output }}

Not: Bu, bloğunuzun genel bir sürümünü yükler. Bloğunuzun bir örneğini değişkenlerle birlikte yüklemek istiyorsanız (/ admin / structure / block'ta oluşturduktan sonra), bu şekilde yüklemelisiniz:

    // Load Instance of custom block with variables
    $example_block = \Drupal::entityManager()->getStorage('block')->load('example_block_machine_name');
    if (!empty($example_block)){
      $example_block_content = \Drupal::entityManager()
        ->getViewBuilder('block')
        ->view($example_block);
      if ($example_block_content) {
        // Add block content to build array
        $variables['content']['custom_block_output'] = $example_block_content;
      }
    }

1
Bu benim için ve en kolay olanıydı.
Guillaume Bois

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.