Özel kullanıcı sekmelerini nasıl oluştururum?


9

Varlığın torunları olan tüm yollarda görünen yeni bir özel sekme oluşturmaya çalışıyorum. {Entity_type} .canonical. Özellikle getDerivativeDefinitions yöntemini geçersiz kılan DeriverBase sınıfını genişletmeyi denedim. Ben LocalTaskDefault genişleterek ve getRouteParameters yöntemini geçersiz kılarak sekme kendisi oluşturdu. Sekme, www.mysite.com/user/1/ veya www.mysite.com/user/1/edit gibi standart bir Drupal kullanıcı yolunu ziyaret ettiğinizde görünür. Ancak, www.mysite.com/user/1/subscribe gibi yeni özel kullanıcı rotalarımızı eklediğimizde hiçbir sekme görünmez. Özel rotalarda yerel menü görevlerini tanımlamanın özel bir yolu var mı? Kodun bir örneği:

 $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;
}

Herhangi bir yardım için şimdiden teşekkürler.


Devel'in / devel yolu / yerel görevi ile ne yaptığına çok benziyor, bunu nasıl uyguladığına bir göz atmanızı öneririm.
Berdir

@Berdir bu başlangıç ​​noktasıydı ama hala bir şey eksik gibi görünüyor.
tflanagan

Özel sekmeniz için ayarlarla 'yourmodule.links.task.yml' dosyasını eklemeye çalıştınız mı?
Andrew

Yanıtlar:


7

Berdir'in önerdiği gibi Devel modülüne ve bunu nasıl uyguladığına bakabilirsiniz. Aşağıdaki kod Devel'den "çıkarıldı"

1) Güzergahlar oluşturun

İçinde ve içinde mymodule.routing.yml dosyasını oluşturun bir rota geri araması tanımlayın (dinamik yollar oluşturmak için kullanılır)

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

Src / Routing dizininde dinamik yollar oluşturmak için MyModuleRoutes sınıfını oluşturun

<?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) Dinamik yerel görevleri oluşturma

Mymodule.links.task.yml dosyasını oluşturun ve içinde bir türetici tanımlayın

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

Src / Plugin / Derivative dizininde dinamik yollar oluşturmak için MyModuleLocalTasks sınıfını oluşturun

<?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) Denetleyiciyi oluşturun

Src / Controller içinde MyModuleController sınıfını oluşturma

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
Bu benim uygulamaya başladığım şeye çok benziyordu. RouteMatchInterface $ route_match geçen benim sorunum için çözüm oldu. Oradan varlık nesnem denetleyicim tarafından kullanılabilir oldu.
tflanagan
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.