Programlı olarak bir bloğu nasıl yerleştiririm?


10

Kullanıcı arayüzünden bir bölgeye şu şekilde bir blok ekleyebilirsiniz:

  1. Yönetici -> Yapı -> Blok düzeni'ne (/ admin / structure / block) gidin.
  2. Bölge adının yanındaki "Blok yerleştir" düğmesini tıklayın.

Aynı şeyi programlı olarak yapmak istiyorum. Mevcut bir bloğu bir bölgeye nasıl eklerim ve kaydederim? Bu blok daha sonra bu bölgede görüntülenmeli ve Blok düzeni sayfasında kullanılabilir olmalıdır.


Bloğu oluşturduktan sonra bloğun konumunu yeniden düzenleyebilirsiniz: site_name / admin / structure / block
Crazyrubixfan

"Bölgeye bir blok ata" diye yanlış yazıldığını varsayıyorum.
cilefen

@IcecreamJelly yapmaya çalıştığım şey bunu programlı olarak yapmak. cilefen, evet bu demek istediğim% -)
jmzea

@ShawnConn teşekkürler, bu benzer, ama tam olarak aynı değil. Cevabı başka bir yerde buldum.
jmzea

Yanıtlar:


9

Bir eklenti bloğu sağlamak için , bir dizi ayar \Drupal\block\Entity\Block::create()oluşturabilir ve Block nesnesini oluşturmak ve örneği kaydetmek için iletebilirsiniz .

Örneğin , Yedi temasına bir Devel Execute PHP bloğu eklemek istiyorsanız :

$values = array(
  // A unique ID for the block instance.
  'id' => 'devel_execute_php_1',
  // The plugin block id as defined in the class.
  'plugin' => 'devel_execute_php',
  // The machine name of the theme region.
  'region' => 'content',
  'settings' => array(
    'label' => 'Execute PHP',
  ),
  // The machine name of the theme.  
  'theme' => 'seven',
  'visibility' => array(),
  'weight' => 100,
);
$block = \Drupal\block\Entity\Block::create($values);
$block->save();

Merhaba, yardıma ihtiyacım var. Kullanıcı arabirimini kullanarak özel bir blok oluşturdum ve test amacıyla altbilgi bölgesine programlı olarak yerleştirmek istiyorum. UI tarafından oluşturulan özel bloklardan nasıl eklenti alacağımı bilmiyorum .. teşekkürler
Mudassar Ali

Bunu başka bir soru olarak sorun. Yorumlar soru sormak için değildir.
Shawn Conn


Nedir kimliği burada? blok adıyla aynı mı?
Crazyrubixfan

@RubberDuckIsKing İstediğiniz idher şeyi benzersiz olduğu sürece adlandırabileceğinize inanıyorum . Örneğin, modülün adıyla başlamak isteyebilirsiniz.
Parag

7

Twig tweak modülünü kullanabilirsiniz :

Twig Tweak modülü, geliştirici deneyimini geliştirebilecek bazı yararlı işlevlere ve filtrelere sahip bir Twig uzantısı sağlar.

Ve sonra dal şablonu bölgenizde:

{{ drupal_block('block_id') }}

Bu çözümle ilgili sorun, dal ayarlarının hala bloğu yerleştirmenizi ve ardından 'devre dışı bırakmanızı' gerektirmesidir.
lexicant

6

Bir blok ( "blok türü", konfigürasyon ve yerleştirme) her örneği bir yapılandırma varlık: \Drupal\block\Entity\Block. Tek yapmanız gereken, bu varlığın doğru ayrıntılara sahip yeni bir örneğini oluşturmak ve işiniz bitti.

Bu yapılabilir ama çılgın bir kompleks, eklenti sistemini, blok eklenti sistemini ve çok daha fazlasını anlamanız gerekir.

Bunun \Drupal\block\BlockForm::submitFormiçin bir fikir edinmek için bir göz atabilirsiniz veya \Drupal\simpletest\BlockCreationTrait::placeBlock. Bu gerçekten ihtiyacınız olan bir şeyse, bloğun görünürlüğü oldukça karmaşıktır.


4
Belki görünürlük koşullarının dışında, bu kadar karmaşık olduğunu düşünmüyorum. \ Drupal \ simpleletest \ BlockCreationTrait :: placeBlock () muhtemelen bakmak için daha iyi bir örnektir, ayrıca bazı dışa aktarılan yapılandırma dosyalarını da içe aktarabilirsiniz.
Berdir

@Berdir Test özelliğine bağlantı için teşekkürler, ekledi. Drupal 8 hala çok genç olduğundan, birçok insan eklenti sistemi hakkında çok fazla şey bilmiyor ve belgeler daha fazla kullanım durumu vb.
googletorp

Felix Eve en iyi cevabı veriyor. Çılgın bir kompleks değil.
kratos

@kratos Felix'in verdiği cevap aslında "programlı" bir bloğun nasıl yerleştirileceği sorusunu çözmüyor, bunun yerine yapılandırma dosyalarını kullanıyor. Config yalnızca drush, config senkronizasyon arayüzü veya modül kurulumu yoluyla içe aktarılabilir. Zamanında, vb bir bölüm frontpage düğüm türü tasarrufu fx yazı sırasında, gerçekleşmesi gerekiyorsa, bu stratejiyi :) kullanmak yararsız olacaktır
googletorp

4

Ben sadece D8 öğreniyorum ama programlı bir blok yerleştirmek için çok daha kolay bir yol bulmuş gibi görünüyor (googletorp cevabını okuduktan sonra oldukça korkutucu görünüyordu!)

Bloğu tanımlayan özel modülümü etkinleştirdiğimde, bloğun otomatik olarak doğru bölgeye yerleştirilmesini istedim. Bunu başarmak için kullandığım adımlar:

  1. Modülü etkinleştirin ve UI'yi kullanarak bloğu yerleştirin. /admin/structure/block
  2. Adresindeki Tek Öğe yapılandırması dışa aktarma sayfasına gidin admin/config/development/configuration/single/export
  3. Yapılandırma türü bloğu'nu seçin ve Yapılandırma adı için UI'yi kullanarak yeni yerleştirdiğiniz bloğu seçin ve sonra oluşturulan kodu kopyalayın.
  4. Modülünüzde klasörü oluşturun /config/install/
  5. Oluşturulan kod textarea altında size kullanmanız gereken dosya adını söyler. Bu dosyayı /config/installdizinde oluşturun ve kodu buraya kopyalayın.
  6. Şimdi modülünüzü kaldırıp yeniden etkinleştirdiğinizde blok otomatik olarak yerleştirilecektir.

bunun diğer geliştiriciler veya ortamlarda çalışması için UUID'yi kaldırmanız gerekmez mi?
powpow12

Evet - UUID'yi kaldırmak iyi bir fikir olacaktır.
Felix Eve

Ayrıca, bu görevlerin bazılarını otomatikleştirmeye özen gösteren Drupal konsolunu da kullanabilirsiniz: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/…
Beau


2

Yukarıdaki örnek yeterince yakındır ancak yine de doğru değildir. Fikir, blok örneğinin kendi kimliğinizi (benim durumumda devel_execute_php_1112 (belki 1112 kez çalışmayı denediğim için, gizem olarak kalacaktır)) ve ardından gerçek blok kimliğini (ki ek açıklamadaki özel bloklar için bildirilir) ve tema. Sonra sadece bölgeyi ayarlayın ve gitmek için iyidir. İstenen bölge altında bir blok örneği oluşturuldu.

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'devel_execute_php_1112',
      'plugin' => 'devel_execute_php',
      'theme' => 'seven'
  )
);
$block->setRegion('content');
$block->save();

edit1: Aslında yukarıdaki yorumu daha sonra kontrol ettim - ve doğru. Sadece kimliğin ortaya çıkması gereken bir şey olduğu açık değildir. Topal yorumum için bir itfa olarak, özel bir blok varlığının bir blok örneğinin nasıl oluşturulacağına dair bir çözüm göndereceğim:

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'ggggggggsssssss',
      'plugin' => 'block_content:79d53b4e-9e60-4f97-befc-101da919bb7a',
      'theme' => 'visitb_he_theme'
  )
);
$block->setRegion('content');

temelde aynı ama bir eklenti için block_content yazıyorsunuz: uuid_of_custom_block_entity_instance

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.