यदि वर्तमान पृष्ठ एक व्यवस्थापक पृष्ठ है तो परीक्षण कैसे करें?


9

कुछ बिंदु पर मैंने परीक्षण के लिए निम्न कोड का उपयोग करना शुरू कर दिया है यदि वर्तमान पृष्ठ एक व्यवस्थापक पृष्ठ है:

  $route = \Drupal::routeMatch()->getRouteObject();

  $is_admin = \Drupal::service('router.admin_context')->isAdminRoute($route);

लेकिन मैंने पाया कि यह hook_entity_load () में पृष्ठों को संपादित करने में विफल रहता है।

यदि हम Drupal 8 में एक व्यवस्थापक पृष्ठ पर हैं तो हम कैसे परीक्षण करेंगे? Drupal 7 में path_is_admin () जैसा कुछ?

मैंने पाया कि यदि मैं इस पृष्ठ पर कोड ( https://api.drupal.org/api/drupal/includes%21path.inc/function/ath_is_admin/7.x) का उपयोग करके बाहर के नोड से पृष्ठ पथ का परीक्षण करता हूं। ) यह काम करता हैं।

use Symfony\Component\HttpFoundation\Request;
use Symfony\Cmf\Component\Routing\RouteObjectInterface;

$path = '/node/75/edit';
$request = Request::create($path);

$route_match = \Drupal::service('router.no_access_checks')->matchRequest($request);
$route = $route_match[RouteObjectInterface::ROUTE_OBJECT];
$is_admin = \Drupal::service('router.admin_context')->isAdminRoute($route);

लेकिन अगर मैं वर्तमान कोड का उपयोग करके इस कोड को hook_entity_load में जोड़ने का प्रयास करता हूं, तो मुझे एक घातक लूप मिलता है।

मुझे लगता है कि जहां मैं फंस गया हूं वह वर्तमान मार्ग को hook_entity_load में लोड कर रहा है।


1
नोड एडिट एक व्यवस्थापक पृष्ठ नहीं है।
येक।

1
"प्रकटन" के अंतर्गत "सामग्री का संपादन या निर्माण करते समय" व्यवस्थापन विषय का उपयोग करके आप इसे एक व्यवस्थापक पथ बना सकते हैं। _node_operation_routeसक्षम किए गए विकल्प के साथ सभी मार्गों को भी विकल्प मिलता है _admin_route\Drupal::service('router.admin_context')->isAdminRoute()डिफ़ॉल्ट रूप से वर्तमान मार्ग के लिए ध्वज की जाँच करता है।
TwoD

जवाबों:


19

* अपडेट किया गया

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

if (\Drupal::service('router.admin_context')->isAdminRoute()) {
 // do stuff
}

यदि आप वर्तमान मार्ग के अलावा किसी मार्ग की जाँच करना चाहते हैं, तो आप इसे isAdminRoute () में पास कर सकते हैं।

ध्यान दें, यदि आप "व्यवस्थापक विषय का उपयोग करें या संपादन / निर्माण करते समय" विषयवस्तु व्यवस्थापक पृष्ठ पर / व्यवस्थापक / प्रकटन पर अनचेक करें तो नोड संपादित पृष्ठ या टैक्सोनॉमी शब्द संपादित करें पृष्ठों के लिए उपरोक्त तरीके से काम नहीं करेंगे। फिर आपको एक अलग जाँच की आवश्यकता होगी।

* मूल उत्तर: *

यह जांचने के लिए कि क्या पृष्ठ किसी व्यवस्थापक पृष्ठ का है, आप दो चरणों की प्रक्रिया का उपयोग कर सकते हैं। चूंकि नोड संपादित के लिए regex एडमिन थीम का उपयोग नहीं कर सकता है।

पहले मैं isAdminRoute विधि का उपयोग करता हूं:

  $route = \Drupal::routeMatch()->getRouteObject();

  $is_admin = \Drupal::service('router.admin_context')->isAdminRoute($route);

फिर आप यह देखने के लिए कि क्या यह नोड एडिट पेज है, पथ के लिए एक अतिरिक्त चेक का उपयोग कर सकते हैं:

  $current_path = \Drupal::service('path.current')->getPath();
  if(preg_match('/node\/(\d+)\/edit/', $current_path, $matches)) {
    $is_admin = TRUE;
  }

यहाँ एक बहुत विस्तृत, लेकिन नोड और टैक्सोनॉमी शब्द संपादित करने के पन्नों के साथ-साथ अन्य व्यवस्थापक मार्गों के लिए परीक्षण करने का बहुत अच्छा तरीका है:

  $route = \Drupal::routeMatch()->getRouteObject();

  $is_admin = FALSE;
  if (!empty($route)) {
    $is_admin_route = \Drupal::service('router.admin_context')->isAdminRoute($route);
    $has_node_operation_option = $route->getOption('_node_operation_route');
    $is_admin = ($is_admin_route || $has_node_operation_option);
  }
  else {
    $current_path = \Drupal::service('path.current')->getPath();
    if(preg_match('/node\/(\d+)\/edit/', $current_path, $matches)) {
      $is_admin = TRUE;
    }
    elseif(preg_match('/taxonomy\/term\/(\d+)\/edit/', $current_path, $matches)) {
      $is_admin = TRUE;
    }
  }

2
RegEx का उपयोग करना वास्तव में बुरा अभ्यास है और इससे बचना चाहिए। यदि मार्ग का नाम है 'entity.node.edit_form' तक एक समाधान पाया जाता है आप की जाँच करनी चाहिए
ईयाल

समस्या $ मार्ग अशक्त, खाली लौट रहा है। मैं regex करने की जरूरत नहीं है अगर -> getRouteObject () मार्ग वापस कर दिया।
ओकेनेट करें

अजीब। क्या आपने कोशिश की है\Drupal::routeMatch()->getRouteName()
ईयाल

1
\Drupal::routeMatch()->getRouteName()मुझे शून्य देता है (Drupal 8.3.2)
Guillaume Bois

1
आपकी अतिरिक्त जांच में नोड संशोधन, हटाएं और अनुवाद जैसे व्यवस्थापक पृष्ठ गायब हैं।
फिलिप माइकल

10

निम्नलिखित कुछ अधिक संक्षिप्त है, और व्यवस्थापक विषय का उपयोग करने के लिए कॉन्फ़िगर किए जाने पर नोड संपादित पृष्ठों को भी कैप्चर करता है। isAdminRouteविधि वर्तमान मार्ग का उपयोग करता है यदि कुछ भी निर्दिष्ट:

  /** @var \Drupal\Core\Routing\AdminContext $admin_context */
  $admin_context = \Drupal::service('router.admin_context');
  if (!$admin_context->isAdminRoute()) {
    // perform tasks.
  }

"जब वे व्यवस्थापक विषय का उपयोग करने के लिए कॉन्फ़िगर किए गए हैं, तो नोड संपादित करें पृष्ठों को कैप्चर करते हैं" यहां कुंजी है। मेरे द्वारा प्रश्न पूछे जाने का कारण यह है कि मुझे गैर-व्यवस्थापक-विषय पृष्ठों जैसे नोड संपादित पृष्ठों को कैप्चर करने में समस्या हो रही थी, जब वे व्यवस्थापक विषय का उपयोग नहीं कर रहे थे।
ओकेनेट करें

आह, यह समझ में आता है। हां, यह अधिक जटिल होता है जब नोड संपादित पृष्ठ व्यवस्थापक पृष्ठों के रूप में सेट नहीं किए जाते हैं।
शॉन डिकको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.