আমি কোড সহ ব্লক দৃশ্যমানতা কীভাবে নিয়ন্ত্রণ করতে পারি?


11

ড্রুপাল 6 এ, আমি ব্লক ইউআই কনফিগারেশনে পিএইচপি কোড ব্যবহার করে ব্লক দৃশ্যমানতা নিয়ন্ত্রণ করতে পারি:

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

এই ফাংশনগুলি ব্লকটি প্রদর্শিত হবে কিনা তা স্থির করার জন্য বর্তমান নোড, শ্রেণীবিন্যাস ইত্যাদি সন্ধান করেছে। এই পিএইচপি বিকল্পটি ড্রুপাল 8 এ চলে গেছে তবে এর মধ্যে একটি $visibilityক্ষেত্র রয়েছে BlockBase। আমি কি এটি চালুর সময় প্রোগ্রামালিমে দৃশ্যমানতা সেট করতে ব্যবহার করতে পারি?


1
পরিবর্তে আপনার পছন্দসই শর্ত প্লাগইন ঘোষণা করা উচিত। কার্যকারী উদাহরণগুলি খুঁজে পাওয়ার জন্য @ শর্তের মূলটি অনুসন্ধান করুন।
আইয়াল

সাধারণত ডাটাবেসে পিএইচপি কোড লেখা খারাপ অভ্যাস এবং কাঁধ যতটা সম্ভব এড়ানো যায়।
আইয়াল

পিএইচপি ফিল্টার মডিউলটি ডি 8 থেকে সরানো হয়েছে। সাধারণভাবে পিআইএইচপি ইউআইতে প্রবেশ করে এবং এইভাবে কার্যকর করা ব্যবহার করা খারাপ ধারণা। এটি একটি খারাপ ধারণা কারণ একটি অনুপস্থিত; একটি পুরো সাইট পঙ্গু করতে পারে এবং তারপরে আমি নিখোঁজদের সন্ধানের জন্য ডিবি অনুসন্ধান করার জন্য ভাড়া নেব; এটি ঘটেছে,
ফ্রাঙ্ক রবার্ট অ্যান্ডারসন

একমত! মডিউলে আমি যতটা কোড পেরেছি তাই সরানো হয়েছে, এবং খুশি যে আমি ডি 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');
  }

}

উত্স: ড্রুপাল 8 এ প্রোগ্রামিয়ালি ব্লক কীভাবে তৈরি করা যায়


1
এমনকি আপনি আপনার ব্লক শ্রেণিতে অ্যাক্সেস চেক লিখতে পারেন -> ওয়েবওয়াশ.এন.পি.
প্রোগ্রামাম্যাটিক-

7

ড্রুপাল 8 এ পিএইচপি ফিল্টার না থাকা, এটি আর ইউআই থেকে আর সম্ভব হবে না।

ব্লক এপিআই ব্যবহার করা একমাত্র বিকল্প।

হুক_ব্লক_অ্যাক্সেস আপনার সেরা ক্যানিডেট id সেখান থেকে আপনি চেক করতে পারেন $operationএবং আপনার অবস্থার উপর ভিত্তি করে একটি অ্যাক্সেসরসোল্ট ফিরে আসতে পারেন।

ঠিক ইউআই-তে কেবল এই সময় পিএইচপি মডিউলে রাখে।


4

এখানে Drupal এর 8 সমাধান: ব্লক বাদ দিন পেজ

এই মডিউলটি ব্লকগুলির জন্য বাদ দেওয়া পৃষ্ঠাগুলি যুক্ত করে।

ওয়াইল্ড কার্ডের পরে বা ওয়াইল্ডকার্ডের মধ্যে নির্দিষ্ট পৃষ্ঠাগুলি বাদ দিতে, কেবল 'উপসর্গযুক্ত' দিয়ে পথের প্যাটার্নটি উপস্থাপন করুন! ' ব্লক পৃষ্ঠাটির দৃশ্যমানতা কনফিগারেশনে।

এটি "তালিকাভুক্ত পৃষ্ঠাগুলির জন্য দেখানোর জন্য" দৃশ্যমানতার জন্য কাজ করে, এক্ষেত্রে, বাদ দেওয়া পথগুলি ওয়াইল্ডকার্ডটি দেখানোর জন্য সেট থাকা সত্ত্বেও পাতাগুলির সাথে ব্লকটি লুকিয়ে রাখবে।

বা অন্য কোনও উপায়ে, যদি পৃষ্ঠা তালিকাটি "তালিকাভুক্ত পৃষ্ঠাগুলির জন্য লুকোতে" সেট করা থাকে তবে বাদ দেওয়া পাথগুলি এমন পাতাগুলিতে ব্লকটি দেখায় যেখানে বুনো কার্ড লুকানোর জন্য সেট করা সত্ত্বেও প্যাটার্নটি মেলে।

Block Exclude Pages screenshot


3

8.2.x এর জন্য আপনাকে একটি শর্ত প্লাগইন তৈরি করতে হবে এবং কনটেক্সটপ্রোভিডারআইন্টারফেসটি প্রয়োগ করতে হবে

একটি দেখুন , তা থেকে উদাহরণ কিন্তু এটা একরকম পুরানো (কারণ BlockEvent এবং BlockSubscriberBase মুছে একটি প্রসঙ্গ সংগ্রহস্থলের সেবা পক্ষে)।

প্লাগইন উত্পন্ন করতে ড্রপাল কনসোল ব্যবহার করাও ভাল লাগবে:

drupal generate:plugin:condition

1

ব্লক দৃশ্যমানতার সম্ভাবনাগুলি প্রসারিত করতে আপনি এই প্যাচটি ব্যবহার করতে পারেন:

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

এটি দৃশ্যমানতার শর্তগুলির জন্য AND / OR সংযোগকারী অপারেটরটির সাথে পরিচয় করিয়ে দেয় যাতে আপনি বলতে পারেন ওহ আমি এই ব্লকটি দৃশ্যমান চাই যদি এটি আমার_সামগ্রী_প্রকারের হয় বা ব্যবহারকারীর প্রশাসকের ভূমিকা থাকে বা 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.