Kod ile blok görünürlüğünü nasıl kontrol edebilirim?


11

Drupal 6'da, blok UI yapılandırmasında PHP kodunu kullanarak blok görünürlüğünü kontrol edebilirim:

<?php return MYMODULE_abc() || MYMODULE_def() ; ?>

Bu işlevler, bloğun görüntülenip görüntülenmeyeceğine karar vermek için mevcut düğümü, sınıflandırmayı vb. Bu PHP seçeneği Drupal 8'de gitti, ancak içinde bir $visibilityalan var BlockBase. Çalışma zamanında görünürlüğü programlı olarak ayarlamak için bunu kullanabilir miyim?


1
Bunun yerine özel bir koşul eklentisi bildirmelisiniz. Çalışma örneklerini bulmak için çekirdeği @Condition'da arayın.
Eyal

Genellikle veritabanına PHP kodu yazmak kötü bir uygulamadır ve omuzdan mümkün olduğunca kaçınılmalıdır.
Eyal

Php filtre modülü D8'den kaldırıldı. Genel olarak, kullanıcı arayüzüne girilen ve bu şekilde yürütülen php kullanmak kötü bir fikirdir. Kötü bir fikir çünkü eksik bir; bütün bir siteyi sakat ve sonra eksik bulmak için db aramak için işe alacak; Bu oldu
Frank Robert Anderson

Kabul! Modüle girebildiğim kadar kod taşınır ve bunu D8'de saf kodla yapabileceğime sevindim!
Nic

Yanıtlar:


15

Bir çalışma kodu snippet'i nasıl kullanılır hook_block_access(). Burada durumu geçerli düğümün bir alanından alıyorum:

use Drupal\block\Entity\Block;
use Drupal\Core\Session\AccountInterface;
use Drupal\node\NodeInterface;
use Drupal\Core\Access\AccessResult;

/**
 * Implements hook_block_access().
 */
function MYMODULE_block_access(Block $block, $operation, AccountInterface $account) {

  $node = \Drupal::routeMatch()->getParameter('node');

  $hero_image_exists = FALSE;

  if ($node instanceof NodeInterface) {
    if ($node->hasField('field_hero_image')) {
      if (!$node->get('field_hero_image')->isEmpty()) {
        $hero_image_exists = TRUE;
      }
    }
  }

  if ($operation == 'view' && $block->getPluginId() == 'MYBLOCK') {
    return AccessResult::forbiddenIf($hero_image_exists == FALSE)->addCacheableDependency($block);
  }

  return AccessResult::neutral();
}

Yorumlarda aşağıdaki cevheri paylaştığınız için teşekkür ederiz. Programlı olarak oluşturulan özel bloklar için görünürlüğü doğrudan blok sınıfının içinden kontrol edebilirsiniz blockAccess():

class MyBlock extends BlockBase {
  /**
   * {@inheritdoc}
   */
  public function build() {
    return [
      '#markup' => $this->t('This is a simple block!'),
    ];
  }

  /**
   * {@inheritdoc}
   */
  protected function blockAccess(AccountInterface $account) {
    return AccessResult::allowedIfHasPermission($account, 'access content');
  }

}

Kaynak: Programlı olarak Drupal 8'de bir blok nasıl oluşturulur


1
Erişim kontrolünü blok sınıfınıza bile yazabilirsiniz -> webwash.net/programmatically-create-block-drupal-8
Insasse

7

Drupal 8'de php filtresinden yoksun, bu artık kullanıcı arayüzünden mümkün olmayacak.

Tek seçenek api bloğunu kullanmaktır.

hook_block_access en iyi adayınızdır. Buradan $operation, koşullarınıza bağlı olarak bir AccessResult'u kontrol edebilir ve iade edebilirsiniz.

Sadece kullanıcı arayüzü gibi php bir modül içine koyarak.


4

İşte Drupal 8 çözümü: Sayfaları Engelle .

Bu modül, bloklar için hariç tutulan sayfalar filtresi ekler.

Joker karakterden sonra veya joker karakterler arasında belirli sayfaları hariç tutmak için, yol deseninin önüne '!' blok sayfası görünürlük yapılandırmasında.

Bu, "listelenen sayfalar için göster" olarak ayarlanan görünürlük için çalışır; bu durumda hariç tutma yolları, gösterilecek joker karakter kümesine rağmen eşleşen sayfalardaki bloğu gizler.

Ya da başka bir yolla, sayfa listesi "listelenen sayfalar için gizle" olarak ayarlanmışsa, hariç tutulan yollar, joker karakter gizlenecek şekilde ayarlanmış olmasına rağmen desenin eşleştiği sayfalardaki bloğu gösterir.

Block Exclude Pages screenshot



1

blok görünürlük olanaklarını genişletmek için şu yamayı deneyebilirsiniz:

https://www.drupal.org/project/drupal/issues/923934#comment-12401360

o tanıtır VE / VEYA bunu my_content_type ait olup olmadığını oh bu blok görünür istiyorum söyleyebiliriz böylece görünürlük koşulları için birlikte operatörü VEYA kullanıcı yönetici rolü vardır YA benim / yolu ile url başlar / için / * vb de .. koşulları engellenebilir, böylece bloğunuzun görünür olmasını istemediğiniz birçok koşul ayarlayabilirsiniz

Ayrıca Drupal Commerce modülünü kullanırsanız, modülü takmış olsanız bile , https://www.drupal.org/project/commerce_quick_purchase modül notunu yükleyerek yukarıdaki işlemi deneyerek sistemdeki tüm bloklar için bu işlevselliği açığa çıkarabilirsiniz. t Modül tarafından sağlanan bloğu kullanın

https://github.com/drugan/commerce_quick_purchase#block-visibility

buna ek olarak kendi durum eklentinizi oluşturabilirsiniz.

https://cgit.drupalcode.org/commerce_quick_purchase/tree/src/Plugin/Condition

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.