permissions_repository-1.0.x-dev/src/Service/PermissionsRepositoryFactory.php

src/Service/PermissionsRepositoryFactory.php
<?php

declare(strict_types=1);

namespace Drupal\permissions_repository\Service;

use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\Utility\CallableResolver;

/**
 * @todo Add class description.
 */
class PermissionsRepositoryFactory implements PermissionsRepositoryFactoryInterface {
  use StringTranslationTrait;

  /**
   * Constructs a PermissionsRepositoryFactory object.
   */
  public function __construct(
    private readonly EntityTypeManagerInterface $entityTypeManager,
    private readonly CallableResolver $callableResolver
  ) {}

  protected function parsePermissionCallbacks(array $ary, string $provider, PermissionsRepositoryInterface $permissionObj) {
    foreach ($ary as $callbackDefinition) {
      $callback = $this->callableResolver->getCallableFromDefinition($callbackDefinition);
      $permissions = call_user_func($callback);
      if (!$permissions || !is_iterable($permissions)) {
        continue;
      }

      // Add any callback permissions to the array of permissions. Any
      // defaults can then get processed below.
      foreach ($permissions as $key => $permissionAry) {
        if (!is_array($permissionAry)) {
          $permissionAry = [
            'title' => $permissionAry,
          ];
        }

        if (empty($permissionAry['title'])) {
          continue;
        }

        $permissionAry['key'] = $key;
        $permissionAry['title'] = $this->tWrapper($permissionAry['title'], [], ['context' => 'permissions: permission title']);
        $permissionAry['description'] = isset($permissionAry['description']) ? $this->tWrapper($permissionAry['description'], [], ['context' => 'permissions: permission description']) : NULL;
        $permissionAry['provider'] = !empty($permissionAry['provider']) ? $permissionAry['provider'] : $provider;
        $permissionAry['extended_help'] = !empty($permissionAry['extended_help']) ? $this->tWrapper($permissionAry['extended_help'], [], ['context' => 'permissions: extended help']) : '';

        $permissionObj->addPermission($provider, $permissionAry);
      }
    }
  }

  protected function parseMain(array $ary, string $provider, PermissionsRepositoryInterface $permissionObj) {
    if (!empty($ary['extended_help'])) {
      $ary['extended_help'] = $this->tWrapper($ary['extended_help'], [], ['context' => 'permissions: extended help']);

      $permissionObj->setMain($provider, $ary);
    }
  }

  protected function parseSections(array $ary, string $provider, PermissionsRepositoryInterface $permissionObj) {
    foreach ($ary as $section) {
      if (empty($section['title'])) {
        continue;
      }

      $section['key'] = $section['title'];
      $section['title'] = $this->tWrapper($section['title'], [], ['context' => 'permissions: section title']);
      $section['extended_help'] = !empty($section['extended_help']) ? $this->tWrapper($section['extended_help'], [], ['context' => 'permissions: extended help']) : '';

      $permissionObj->addSection($provider, $section);
    }
  }

  protected function parseSectionCallbacks(array $ary, string $provider, PermissionsRepositoryInterface $permissionObj) {
    foreach ($ary as $callbackDefinition) {
      $callback = $this->callableResolver->getCallableFromDefinition($callbackDefinition);
      $sections = call_user_func($callback);
      if (!$sections || !is_iterable($sections)) {
        continue;
      }

      foreach ($sections as $section) {
        if (!is_array($section)) {
          $section = [
            'title' => $section,
          ];
        }

        if (empty($section['title'])) {
          continue;
        }

        $section['key'] = $section['title'];
        $section['title'] = $this->tWrapper($section['title'], [], ['context' => 'permissions: section title']);
        $section['extended_help'] = !empty($section['extended_help']) ? $this->tWrapper($section['extended_help'], [], ['context' => 'permissions: extended help']) : '';

        $permissionObj->addSection($provider, $section);
      }
    }
  }

  protected function parseLoosePermissions($permissions, $provider, $permissionObj) {
    foreach ($permissions as $key => $permissionAry) {
      if (!is_array($permissionAry)) {
        $permissionAry = [
          'title' => $permissionAry,
        ];
      }

      if (empty($permissionAry['title'])) {
        continue;
      }

      $permissionAry['key'] = $key;
      $permissionAry['title'] = $this->tWrapper($permissionAry['title'], [], ['context' => 'permissions: permission title']);
      $permissionAry['description'] = isset($permissionAry['description']) ? $this->tWrapper($permissionAry['description'], [], ['context' => 'permissions: permission description']) : NULL;
      $permissionAry['provider'] = !empty($permissionAry['provider']) ? $permissionAry['provider'] : $provider;
      $permissionAry['extended_help'] = !empty($permissionAry['extended_help']) ? $this->tWrapper($permissionAry['extended_help'], [], ['context' => 'permissions: extended help']) : '';

      $permissionObj->addPermission($provider, $permissionAry);
    }
  }

  protected function tWrapper($s, $options = [], $context = []) {
    if (is_object($s)) {
      return $s;
    }

    if (is_array($s)) {
      $s = json_encode($s);
    }

    if (!is_string($s)) {
      $s = '' . $s;
    }

    return $this->t($s, $options, $context);
  }

  /**
   */
  public function createPermissionsRepository(array $list) {
    $all_permissions = [];
    $all_callback_permissions = [];

    $permissionObj = new PermissionsRepository();

    foreach ($list as $provider => $permissions) {
      // The top-level 'permissions_callback' is a list of methods in callable
      // syntax, see \Drupal\Core\Utility\CallableResolver. These methods
      // should return an array of permissions in the same structure.
      if (!empty($permissions['permission_callbacks'])) {
        if (is_iterable($permissions['permission_callbacks'])) {
          $this->parsePermissionCallbacks($permissions['permission_callbacks'], $provider, $permissionObj);
        }
        unset($permissions['permission_callbacks']);
      }

      if (!empty($permissions['main'])) {
        if (is_iterable($permissions['main'])) {
          $this->parseMain($permissions['main'], $provider, $permissionObj);
        }
        unset($permissions['main']);
      }

      if (!empty($permissions['section_callbacks'])) {
        if (is_iterable($permissions['section_callbacks'])) {
          $this->parseSectionCallbacks($permissions['section_callbacks'], $provider, $permissionObj);
        }
        unset($permissions['section_callbacks']);
      }

      if (!empty($permissions['sections'])) {
        if (is_iterable($permissions['sections'])) {
          $this->parseSections($permissions['sections'], $provider, $permissionObj);
        }
        unset($permissions['sections']);
      }

      if (!empty($permissions)) {
        $this->parseLoosePermissions($permissions, $provider, $permissionObj);
      }
    }

    $permissionObj->sortAll();

    return $permissionObj;

    return $permissionObj->getAllPermissions(PermissionsRepositoryReturnStyle::SectionArray);
    return $permissionObj->getAllData(PermissionsRepositoryReturnStyle::SectionArray);
    return $permissionObj->getProviderData('permissions_repository', PermissionsRepositoryReturnStyle::SectionArray);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc