मैं कस्टम उपयोगकर्ता टैब कैसे बनाऊं?


9

मैं एक नया कस्टम टैब बनाने की कोशिश कर रहा हूं जो सभी मार्गों पर प्रकट होता है जो इकाई के वंशज हैं। {संस्था_type} .canonical मैंने विशेष रूप से getDerivativeDefinitions विधि को ओवरराइड करते हुए DeriverBase वर्ग का विस्तार करने की कोशिश की है। मैंने LocalTaskDefault का विस्तार करके और getRouteParameters विधि को ओवरराइड करके टैब स्वयं बनाया है। जब आप www.mysite.com/user/1/ या www.mysite.com/user/1/edit जैसे मानक Drupal उपयोगकर्ता पथ पर जाते हैं, तो टैब दिखाई देता है। हालाँकि, जब हम अपने नए कस्टम उपयोगकर्ता मार्ग जैसे www.mysite.com/user/1/subscribe जोड़ते हैं, तो कोई टैब दिखाई नहीं देते हैं। क्या कस्टम मार्गों पर स्थानीय मेनू कार्यों को परिभाषित करने का एक विशेष तरीका है? कोड का एक नमूना:

 $this->derivatives['recurly.subscription_tab'] = [
  'title' => $this->t('Subscription'),
  'weight' => 5,
  'route_name' => 'recurly.subscription_list',
  'base_route' => "entity.$entity_type.canonical",
];

foreach ($this->derivatives as &$entry) {
  $entry += $base_plugin_definition;
}

किसी भी मदद के लिए अग्रिम धन्यवाद।


लगता है कि यह / devel मार्ग / स्थानीय कार्य के साथ क्या कर रहा है, के बहुत करीब है, मेरा सुझाव है कि आप इसे कैसे लागू कर रहे हैं पर एक नज़र है।
बेरदीर

@ बर्डिर जो शुरुआती बिंदु था लेकिन मुझे अभी भी कुछ याद आ रहा है।
23 नवंबर को tflanagan

क्या आपने अपने कस्टम टैब के लिए सेटिंग्स के साथ 'yourmodule.links.task.yml' फ़ाइल जोड़ने का प्रयास किया था?
एंड्रयू

जवाबों:


7

जैसा कि बेर्दिर ने सुझाव दिया था कि आप देवल मॉड्यूल को देख सकते हैं और इसे कैसे लागू कर रहे हैं। निम्नलिखित कोड देवल से "निकाला गया" था

1) मार्ग बनाएं

फ़ाइल mymodule.rout.yml बनाएँ और अंदर एक मार्ग कॉलबैक को परिभाषित करें (जो गतिशील मार्गों को बनाने के लिए उपयोग किया जाता है)

route_callbacks:
  - '\Drupal\mymodule\Routing\MyModuleRoutes::routes'

Src / अनुमार्गण में आपके गतिशील मार्ग उत्पन्न करने के लिए वर्ग MyModuleRoutes बनाएँ

<?php

namespace Drupal\mymodule\Routing;

use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;

class MyModuleRoutes implements ContainerInjectionInterface {

  public function __construct(EntityTypeManagerInterface $entity_type_manager) {
    $this->entityTypeManager = $entity_type_manager;
  }

  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('entity_type.manager')
    );
  }

  public function routes() {
    $collection = new RouteCollection();

    foreach ($this->entityTypeManager->getDefinitions() as $entity_type_id => $entity_type) {
      if ($entity_type->hasLinkTemplate('canonical')) {
        $route = new Route("/mymodule/$entity_type_id/{{$entity_type_id}}");
        $route
          ->addDefaults([
            '_controller' => '\Drupal\mymodule\Controller\MyModuleController::doStuff',
            '_title' => 'My module route title',
          ])
          ->addRequirements([
            '_permission' => 'access mymodule permission',
          ])
          ->setOption('_mymodule_entity_type_id', $entity_type_id)
          ->setOption('parameters', [
            $entity_type_id => ['type' => 'entity:' . $entity_type_id],
          ]);

        $collection->add("entity.$entity_type_id.mymodule", $route);
      }
    }

    return $collection;
  }

}

2) गतिशील स्थानीय कार्य बनाएं

फ़ाइल बनाएँ mymodule.links.task.yml और अंदर एक व्युत्पन्न परिभाषित करें

mymodule.tasks:
  class: \Drupal\Core\Menu\LocalTaskDefault
  deriver: \Drupal\mymodule\Plugin\Derivative\MyModuleLocalTasks

Src / Plugin / Derivative में आपके गतिशील मार्ग उत्पन्न करने के लिए वर्ग MyModuleLocalTasks बनाएँ

<?php

namespace Drupal\mymodule\Plugin\Derivative;

use Drupal\Component\Plugin\Derivative\DeriverBase;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class MyModuleLocalTasks extends DeriverBase implements ContainerDeriverInterface {

  protected $entityTypeManager;

  public function __construct(EntityTypeManagerInterface $entity_type_manager) {
    $this->entityTypeManager = $entity_type_manager;
  }

  public static function create(ContainerInterface $container, $base_plugin_id) {
    return new static(
      $container->get('entity_type.manager')
    );
  }

  public function getDerivativeDefinitions($base_plugin_definition) {
    $this->derivatives = array();

    foreach ($this->entityTypeManager->getDefinitions() as $entity_type_id => $entity_type) {
      if ($entity_type->hasLinkTemplate('canonical')) {
        $this->derivatives["$entity_type_id.mymodule_tab"] = [
          'route_name' => "entity.$entity_type_id.mymodule",
          'title' => t('Mymodule title'),
          'base_route' => "entity.$entity_type_id.canonical",
          'weight' => 100,
        ] + $base_plugin_definition;
      }
    }

    return $this->derivatives;
  }

}

3) कंट्रोलर बनाएं

वर्ग MyModuleController के src / नियंत्रक में बनाएँ

namespace Drupal\mymodule\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Routing\RouteMatchInterface;

class MyModuleController extends ControllerBase {

  public function doStuff(RouteMatchInterface $route_match) {
    $output = [];

    $parameter_name = $route_match->getRouteObject()->getOption('_mymodule_entity_type_id');
    $entity = $route_match->getParameter($parameter_name);

    if ($entity && $entity instanceof EntityInterface) {
      $output = ['#markup' => $entity->label()];
    }

    return $output;
  }

}

3
यह बहुत कुछ वैसा ही था जैसा मैंने लागू किया। RouteMatchInterface $ मार्ग_match में पास होना मेरी समस्या का समाधान था। वहां से मेरी इकाई वस्तु मेरे नियंत्रक के लिए उपलब्ध थी।
tflanagan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.