मैं कोड के साथ ब्लॉक दृश्यता को कैसे नियंत्रित कर सकता हूं?


11

Drupal 6 में, मैं ब्लॉक UI कॉन्फ़िगरेशन में PHP कोड का उपयोग करके दृश्यता को नियंत्रित कर सकता हूं जैसे:

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

इन कार्यों ने ब्लॉक को प्रदर्शित करने के बारे में निर्णय करने के लिए वर्तमान नोड, टैक्सोनॉमी, आदि को देखा। यह PHP विकल्प Drupal 8 में चला गया है, लेकिन इसमें एक $visibilityफ़ील्ड है BlockBase। क्या मैं इसका उपयोग क्रमिक रूप से दृश्यता निर्धारित करने के लिए कर सकता हूँ?


1
आपको इसके बजाय एक कस्टम कंडीशन प्लगइन घोषित करना चाहिए। कार्य उदाहरणों को खोजने के लिए @Condition के लिए कोर खोजें।
ईयाल

आमतौर पर डेटाबेस में PHP कोड लिखना बुरा व्यवहार है और कंधे को जितना संभव हो उतना टाला जाना चाहिए।
ईयल

D8 से php फ़िल्टर मॉड्यूल को हटा दिया गया है। सामान्य तौर पर यह UI में दर्ज php का उपयोग करने और इस तरह से निष्पादित करने के लिए एक बुरा विचार है। यह एक बुरा विचार है क्योंकि लापता एक; एक पूरी साइट को पंगु बना सकता है और फिर मुझे लापता को खोजने के लिए डीबी को खोजने के लिए काम पर रखा जाएगा; यह हुआ है,
फ्रैंक रॉबर्ट एंडरसन

माना! मॉड्यूल में जितना संभव हो उतना कोड ले जाया गया है, और मुझे खुशी है कि मैं डी 8 में शुद्ध कोड के साथ ऐसा कर सकता हूं!
निक

जवाबों:


15

एक काम कोड स्निपेट का उपयोग कैसे करें hook_block_access()। यहाँ मैं वर्तमान नोड के एक क्षेत्र से स्थिति को पुनः प्राप्त करता हूं:

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();
}

धन्यवाद @ टिप्पणी में निम्नलिखित मणि साझा करने के लिए धन्यवाद। प्रोग्रामेटिक रूप से बनाए गए कस्टम ब्लॉक के माध्यम से आप सीधे ब्लॉक क्लास के अंदर से दृश्यता को नियंत्रित कर सकते हैं 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');
  }

}

स्रोत: Drupal 8 में प्रोग्राम को ब्लॉक करने का तरीका


1
आप अपने ब्लॉक वर्ग में एक्सेस चेक भी लिख सकते हैं -> webwash.net/programmatically-create-block-drupal-8
Insasse

7

Drupal 8 में php फ़िल्टर को खोना, यह UI से संभव नहीं होगा।

ब्लॉक आपी का उपयोग करने का एकमात्र विकल्प है।

hook_block_access आपका सबसे अच्छा कैनेडेट है। वहां से आप $operationअपनी शर्तों के आधार पर AccessResult की जांच कर सकते हैं।

जैसे UI में केवल इस बार php को एक मॉड्यूल में रखना।


4

यहाँ Drupal 8 solution है: Block Exclude Pages

यह मॉड्यूल ब्लॉक के लिए एक बहिष्कृत पृष्ठ फ़िल्टर जोड़ता है।

वाइल्ड कार्ड के बाद या वाइल्डकार्ड के बीच के विशिष्ट पृष्ठों को बाहर करने के लिए, बस उपसर्ग के साथ पथ पैटर्न को उपसर्ग करें '!' ब्लॉक पेज विजिबिलिटी कॉन्फ़िगरेशन में।

यह "सूचीबद्ध पृष्ठों के लिए दिखाने" के लिए सेट दृश्यता के लिए काम करता है, इस मामले में, बहिष्कृत पथ उन पृष्ठों पर ब्लॉक को छिपाएगा जो दिखाने के लिए वाइल्डकार्ड के बावजूद मेल खाते हैं।

या दूसरे तरीके से, यदि पृष्ठ सूची "सूचीबद्ध पृष्ठों के लिए छिपाने के लिए" सेट है, तो बाहर किए गए रास्ते उन पृष्ठों पर ब्लॉक दिखाएंगे जहां छिपाने के लिए वाइल्ड कार्ड सेट के बावजूद पैटर्न मेल खाता है।

Block Exclude Pages screenshot


3

8.2.x के लिए आपको एक शर्त प्लगइन बनाने और ContextProviderInterface को लागू करने की आवश्यकता है

डीओ से एक उदाहरण देखें लेकिन यह किसी भी तरह से पुराना है (क्योंकि एक संदर्भ भंडार सेवा के पक्ष में BlockEvent और BlockSubscriberBase हटा दिया गया है)।

प्लगइन उत्पन्न करने के लिए Drupal कंसोल का उपयोग करना अच्छा होगा:

drupal generate:plugin:condition

1

ब्लॉक दृश्यता संभावनाओं का विस्तार करने के लिए आप इस पैच को आज़मा सकते हैं:

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

यह दृश्यता स्थितियों के लिए AND / या संयोजन ऑपरेटर का परिचय देता है ताकि आप कह सकें कि ओह, मैं यह ब्लॉक दृश्यमान चाहता हूं यदि यह my_content_type का है या उपयोगकर्ता की व्यवस्थापक भूमिका है या url मेरे / पथ / से / * आदि से शुरू होता है। इसलिए इसे उपेक्षित किया जा सकता है ताकि आप बहुत सारी स्थितियाँ निर्धारित कर सकें जिस पर आप नहीं चाहते कि आपका ब्लॉक दिखाई दे

यहां तक ​​कि अगर आप ड्रुपल कॉमर्स मॉड्यूल का उपयोग करते हैं, तो आप https://www.drupal.org/project/commerce_quick_purchase मॉड्यूल नोट को स्थापित करके ऊपर की कोशिश कर सकते हैं कि मॉड्यूल स्थापित किया जा रहा है, भले ही वह 'सिस्टम के सभी ब्लॉक के लिए इस कार्यक्षमता को उजागर नहीं करता है' मॉड्यूल द्वारा प्रदान किए गए ब्लॉक को अधिक देखें

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

इसके अलावा आप अपने खुद के हालत प्लगइन बना सकते हैं मॉड्यूल से उदाहरण देखें

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.