Вы здесь

Как сделать проверку условия и только потом переход на node/add/page?

0

Хочу проверять некоторые условия и после этого переходить на страницу создания материала, если условие пройдено.

Если не пройдено, то редиректить пользователя на другую страницу.

Подскажите, в какую сторону лучше копать?

Версия Drupal: 
8.x
Категория: 
Access control
Вопрос задан 10.01.2018 - 18:30
Аватар пользователя shu
shu
159

Да, вопрос в том, где проверять, что пользователь хочет открыть страницу добавления материала /node/add/page?

Комментарий оставлен 12.01.2018 - 10:06

Ответы

0
class MyRouteSubscriber extends RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  public function alterRoutes(RouteCollection $collection) {
    $route = $collection->get('node.add_page');
    if ($route) {
      $route->setRequirement('_custom_access', MyAccessController::class . '::checkAccess');
    }
  }
}

class MyAccessController extends ControllerBase {
  function checkAccess() {
    $hasPermission = $this->userHasPermission();
    if ($hasPermission) {
      return AccessResult::allowed();
    }
    else {
      $redirectPath = Url::fromRoute('redirect_route_name', ['absolute' => TRUE])->toString();
      $response = new RedirectResponse($redirectPath);
      $response->send();
    }
  }
}

services:
  route.my_route_subscriber:
    class: Drupal\mymodule\Routing\MyRouteSubscriber
    tags:
      - { name: event_subscriber }

кривой путь

Ответ дан 11.01.2018 - 08:24

В принципе подходит, но тут одна проблема:
В строке

$route = $collection->get('node.add');

Роут 'node.add' отвечает за все ноды. Как проверить, что мне нужен именно определённый тип ноды?

Комментарий оставлен 12.01.2018 - 11:06

Сделал криво, наверное, но работает. В hook_form_alter сделал проверку условия и редирект, если условие не совпадает.

Комментарий оставлен 15.01.2018 - 09:56

в ::checkAccess должен приходить event, насколько я помню
из ивента можно достать весь контекст страницы

Комментарий оставлен 16.01.2018 - 07:06