Değişkeni Özel Blok şablon dosyasına geçir


11

Drupal 8'de özel içerikli özel bloğumu oluşturmak istiyorum, başlangıçta üzerinde sadece basit metin bulunan Blok oluşturuyorum ve düzgün çalışıyorum, Sorunum özel değişkenimi ona nasıl iletebilirim? Bu konuda bazı öğretici gördüm, Modül adı tcdevve bu .moduledosyanın içeriği .

function tcdev_theme($existing, $type, $theme, $path) {
    return array('tcdev' =>
        array(
            'variables' => array(
                'title' => 'Default title',
                'description' => null
            ),
            'template' => 'block--sliderblock'
        )
    );
}

ve benim SliderBlock.php

    namespace  Drupal\tcdev\Plugin\Block;
use Drupal\Core\block\BlockBase;


/**
 * Provides a 'SliderBlock' block.
 *
 * @Block(
 * id = "slider_block",
 * admin_label = @Translation("Slider Block"),
 * )
 */

class SliderBlock extends BlockBase{
    /**
     * {@inheritdoc}
     */
    public function build(){
        return array(
            '#title' => 'my title ',
            '#description' => 'my custom desc'
        );
}
}

ve son olarak şablon dosyam block--sliderblock.html.twig

  <h2>My Custom Block{{ title }}-{{ description }}</h2>

Ancak Sonuç yalnızca "Özel Bloğum" dur. Sorun değişkenler şablon dosyasına geçirilmiyor, benim hatam nerede?

herhangi bir yardımı takdir et

Yanıtlar:


15

Dönüş diziniz bir #themeanahtar içermiyor . Şu anda bir şablon dosyası kullanmıyorsunuz.

Muhtemelen dış blok ile bloğun içindeki içeriği teması arasında bir karışım vardır. İçinizdeki şablonunuz tcdev adına sahiptir, çünkü dizinin en üstünde tanımladığınız ad *_theme()budur ve tcdev.html.twig değişkenlerinizin sona ereceği yerdir.

Kodunuz aşağıdaki gibi görünecektir.

function tcdev_theme($existing, $type, $theme, $path) {
  return array('tcdev' =>                  // this is the name of the template
           array(
            'variables' => array(
                'title' => 'Default title',
                'description' => null
            ),
        )
    );
}

SliderBlock.php

namespace  Drupal\tcdev\Plugin\Block;
use Drupal\Core\block\BlockBase;


/**
 * Provides a 'SliderBlock' block.
 *
 * @Block(
 * id = "slider_block",
 * admin_label = @Translation("Slider Block"),
 * )
 */

class SliderBlock extends BlockBase{
    /**
     * {@inheritdoc}
     */
    public function build() {
        return array(
            '#theme' => 'tcdev',
            '#title' => 'my title ',
            '#description' => 'my custom desc'
        );
   }
}

tcdev.html.twig

  <h2>My Custom Block{{ title }}-{{ description }}</h2>

Bununla ilgili bazı öğreticiler gördüğünüzü yazdınız. Muhtemelen bu iki farklı konuydu ve bunları aynı anda uygulamaya çalışıyorsunuz.

İlk bağlantıdaki özel şablon tcdev.html.twig'dir. İkinci bağlantıdaki yöntemle yapmaya çalıştığınız şey block - sliderblock.html.twig içindir.


Ama block--sliderblock.html.twigrender, sorun nasıl benim değişken geçmek için !!! koduma göre bana ne öneriyorsun. ? İlginiz için tnx
Yusef

Bir blok içindeki değişkenlerin içeriğini ister misiniz? Sonra bu bir blok şablonuna bağlı değildir, çünkü bu bloğun dış kısmı içindir. ( block--sliderblock.html.twigoluşturuldu, bir tema önerisinin adını kullandığınız için, blok tamamen boş olsa bile bu işlem olurdu, bunu deneyebilirsiniz)
4k4

Kodları bir şeyleri daha net hale getirmek için değiştirmeye çalıştım, umarım bu işe yarar, hata ayıklamadı.
4k4

Kodunuzu uyguladım, önbelleği yeniden oluşturdum, ama yine de okudum block--sliderblock.html.twigve hiçbir şey geçmedi. Hata ayıklama bilgilerini etkinleştiriyorum ve hata ayıklama bilgileri<!-- END OUTPUT from 'themes/bootstrap/templates/block/block--system-branding-block.html.twig' <!-- FILE NAME SUGGESTIONS: x block--sliderblock.html.twig * block--slider-block.html.twig * block--tcdev.html.twig * block.html.twig --> <!-- BEGIN OUTPUT from 'themes/gttc_2016/templates/block--sliderblock.html.twig' --> <h2>Block-</h2>
Yusef

Değişkenleriniz tarafından okunmuyor block--sliderblock.html.twig. Bu şablonlar kendi değişken kümeleriyle çalışır. (Bu dal kullanmak istiyorsanız, çekirdek veya temel temadan kopyalamanız gerekir ve daha sonra içinde hangi değişkenlerin olduğunu görürsünüz). Yapım işlevinin oluşturma dizisinde ayarlanan değişkenleriniz sonuçlanır tcdev.html.twig. Bu dal dosyasını yarattınız mı?
4k4

3

Bulduğum için, özel bir blok (modül) şablonuyla varsayılan bir blok şablonunun üzerine yazmak ve ardından değişkenlerinizi ona aktarmak istiyorsunuz, her şeyden önce şablonunuzun üzerine yazdığınızdan emin olmalısınız, çünkü mevcut blok şablonunuz Tema dizini (modül değil):

<!-- BEGIN OUTPUT from 'themes/gttc_2016/templates/block--sliderblock.html.twig' -->

Bunu yapmak için önce templates/modül kökünüzde adlandırılan bir dizin oluşturmanız ve ardından şablonunuzu buraya yerleştirmeniz gerekir.

Şimdi Drupal'a şablonu modülünüzde sakladığınızı bildirin. içinde your_module.modulebu işlevi ekleyin:

function YOUR_MODULE_theme($existing, $type, $theme, $path) {
  return array(
    'block__my_module' => array(
      'render element' => 'elements',
      'template' => 'block--my-module',
      'base hook' => 'block'
    )
  );
}

Son olarak dal dosyanızı nereye koyduğunuza ve adını verdiğiniz konusunda dikkatli olun. Modül dizininizde bir şablon dizini oluşturun _ve tema işlevinin adının yerine şunu yazın -:
mymodule-block.html.twig

Önbelleği temizlemeyi unutmayın.


NicensinBu yazıda yazılan cevap yardımıyla :
Drupal 8 özel blok (modül) dal şablon dosyası oluşturun


1
OP'nin istediği değişkenler ne olacak?
leymannx

1

Ben de bu noktaya geldim. Değişkenler blok şablonuna aktarılmış gibi görünmüyor. Seninle neredeyse aynı koda sahibim, benim durumumda twig hata ayıklamayı etkinleştirdiler ve services.yml'de önbelleği devre dışı bıraktım. Önbelleği bile temizleyerek bu sorunu yaşıyordum ama geliştirici ortamımda bu yapılandırmayı etkinleştirdikten sonra çözüldüm.

twig.config:    
# Not recommended in production environments
# @default false
debug: true
# Not recommended in production environments
# @default null
auto_reload: true
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.