user_dashboard_bootstrap-1.0.2/src/Controller/UserDashboardController.php

src/Controller/UserDashboardController.php
<?php

namespace Drupal\user_dashboard_bootstrap\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Database\Connection;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\Url;
use Drupal\user_dashboard_bootstrap\UserDashboardBlocks;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;

/**
 * Returns responses for User dashboard Bootstrap routes.
 */
class UserDashboardController extends ControllerBase {

  /**
   * Constructor.
   *
   * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
   *   Request.
   * @param \Drupal\user_dashboard_bootstrap\UserDashboardBlocks $userDashboardBlocks
   *   User dashboard blocks.
   * @param \Drupal\Core\Render\RendererInterface $renderer
   *   Service render.
   * @param \Drupal\Core\Database\Connection $database
   *   Service database.
   */
  public function __construct(protected RequestStack $requestStack, protected UserDashboardBlocks $userDashboardBlocks, protected RendererInterface $renderer, protected Connection $database) {
    $this->currentUser();
    $this->entityTypeManager();
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new self(
      $container->get('request_stack'),
      $container->get('user_dashboard_bootstrap.blocks'),
      $container->get('renderer'),
      $container->get('database'),
    );
  }

  /**
   * Page user dashboard.
   *
   * @inheritDoc
   */
  public function dashboard($user) {
    $js_settings = [
      'dashboard' => [
        'drawer' => Url::fromRoute('user_dashboard_bootstrap.drawer', ['user' => $user])
          ->toString(),
        'blockContent' => Url::fromRoute('user_dashboard_bootstrap.block_content', ['user' => $user])
          ->toString(),
        'updatePath' => Url::fromRoute('user_dashboard_bootstrap.update', ['user' => $user])
          ->toString(),
        'customize' => Url::fromRoute('user_dashboard_bootstrap.customize', ['user' => $user])
          ->toString(),
        'dashboard' => Url::fromRoute('user_dashboard_bootstrap.id_dashboard', ['user' => $user])
          ->toString(),
        'emptyBlockText' => $this->t('empty'),
        'emptyRegionTextInactive' => $this->t('This dashboard region is empty. Click <em>Customize dashboard</em> to add blocks to it.'),
        'emptyRegionTextActive' => $this->t('DRAG HERE'),
      ],
    ];
    $regions = $this->userDashboardBlocks->getUserdashboardRegionsBlocks($user);
    $theme = 'user_dashboard_page';
    $library = 'user_dashboard';
    $config = $this->config('user_dashboard_bootstrap.settings');
    if ($config->get('gridstack')) {
      $theme = 'user_dashboard_gridstack';
      $library = 'user_dashboard_gridstack';
      $regionGridStack["main"]["user_dashboard_main"] = $regions["main"]["user_dashboard_main"];
      $regions = $regionGridStack;
    }
    $build = [
      '#theme' => $theme,
      '#regions' => $regions,
      '#message' => $this->t('To customize the dashboard page, move blocks to the dashboard regions on the <a href="@dashboard">Dashboard administration page</a>, or enable JavaScript on this page to use the drag-and-drop interface.', [
        '@dashboard' => Url::fromRoute('user_dashboard_bootstrap.set_default')
          ->toString(),
      ]),
      '#configuration' => $this->t('Drag and drop these blocks to the columns below. Changes are automatically saved. More options are available on the UserDashboard <a href="@dashboard">configuration page</a>.', [
        '@dashboard' => Url::fromRoute('user_dashboard_bootstrap.settings')
          ->toString(),
      ]),
    ];
    $hasPermission = $this->currentUser->hasPermission('customize user_dashboard blocks') ||
      $this->currentUser->hasPermission('set default user_dashboard blocks');
    $userRoles = $this->currentUser->getRoles();
    if (in_array('administrator', $userRoles)) {
      $hasPermission = TRUE;
    }
    if ($hasPermission) {
      $build['#customize'] = $this->t('Customize dashboard');
      $build['#attached'] = [
        'library' => ['user_dashboard_bootstrap/' . $library],
        'drupalSettings' => $js_settings,
      ];
    }

    return $build;
  }

  /**
   * Customize.
   *
   * @inheritDoc
   */
  public function customize($user) {
    $blocks = $this->getBlocksAvailable($user);
    // Remove blocks selected.
    $blockSelected = $this->userDashboardBlocks->getUserdashboardBlocks($user);
    foreach ($blocks as $delta => $block) {
      if (!empty($blockSelected[$delta])) {
        unset($blocks[$delta]);
      }
    }
    $config = $this->config('user_dashboard_bootstrap.settings');
    $theme = $config->get('gridstack') ? 'user_dashboard_gridstack_blocks' : 'user_dashboard_disabled_blocks';
    $build = [
      '#theme' => $theme,
      '#blocks' => $blocks,
    ];
    return new Response($this->renderer->render($build));
  }

  /**
   * Drawer.
   *
   * @inheritDoc
   */
  public function drawer(Request $request, $user) {
    $region = $request->request->get('region');
    $blockId = $request->request->get('blockId');
    $bid = 0;
    if (!empty($region) && !empty($blockId)) {
      $query = $this->database->select('user_dashboard_block', 'b')
        ->fields('b', ['bid'])
        ->condition('delta', $blockId)
        ->condition('uid', $user);
      $bid = $query->execute()->fetchField();
      if (empty($bid)) {
        $bid = $this->database->insert('user_dashboard_block')
          ->fields(['delta', 'status', 'weight', 'region', 'uid'])
          ->values([$blockId, 1, 0, $region, $user])
          ->execute();
      }
    }
    elseif (!empty($grid = $request->request->get('gridStack'))) {
      $gridStacks = json_decode($grid, TRUE);
      $query = $this->database->select('user_dashboard_block', 'b')
        ->fields('b', ['bid', 'delta', 'position'])
        ->condition('uid', $user);
      $blocks = $query->execute()->fetchAllAssoc('delta');
      $region = 'user_dashboard_main';
      foreach ($gridStacks as $weight => $gridStack) {
        $blockId = $gridStack['id'];
        $position = json_encode($gridStack);
        if (empty($blocks[$blockId])) {
          $bid = $this->database->insert('user_dashboard_block')
            ->fields(['delta', 'status', 'weight', 'region', 'uid', 'position'])
            ->values([$blockId, TRUE, $weight, $region, $user, $position])
            ->execute();
        }
        elseif ($blocks[$blockId]->postion != $position) {
          $query = $this->database->update('user_dashboard_block')
            ->fields(['position' => $position, 'region' => $region]);
          $query->condition('bid', $blocks[$blockId]->bid);
          $query->execute();
        }
      }
    }

    return new JsonResponse([
      'data' => ['id' => $bid],
      'method' => 'GET',
      'status' => 200,
    ]);
  }

  /**
   * Update status user dashboard.
   *
   * @inheritDoc
   */
  public function update(Request $request, $user) {
    $bid = $request->request->get('bid');
    $action = $request->request->get('action');
    $result = FALSE;
    if ($action == 'delete') {
      $query = $this->database->delete('user_dashboard_block');
      $query->condition('bid', $bid);
      $query->condition('uid', $user);
      $result = $query->execute();
    }
    if ($action == 'collapse') {
      $status = $request->request->get('status');
      $status = empty($status) ? 2 : 0;
      $query = $this->database->update('user_dashboard_block')
        ->fields(['custom' => $status]);
      $query->condition('bid', $bid);
      $query->condition('uid', $user);
      $result = $query->execute();
    }
    if ($action == 'weight') {
      $bids = $request->request->get('bids');
      foreach (explode(',', $bids) as $weight => $bid) {
        $query = $this->database->update('user_dashboard_block')
          ->fields(['weight' => $weight]);
        $query->condition('bid', $bid);
        $query->condition('uid', $user);
        $result = $query->execute();
      }
    }
    if ($action == 'move' && is_numeric($bid)) {
      $requestRegion = explode('--', $request->request->get('region'));
      $region = end($requestRegion);
      $query = $this->database->update('user_dashboard_block')
        ->fields(['region' => $region]);
      $query->condition('bid', $bid);
      $query->condition('uid', $user);
      $result = $query->execute();
    }
    return new JsonResponse([
      'data' => ['result' => $result],
      'method' => 'GET',
      'status' => 200,
    ]);
  }

  /**
   * Show block content.
   *
   * @inheritDoc
   */
  public function showBlockContent($user, $delta = '') {
    $build = $this->userDashboardBlocks->renderUserdashboardBlock($user, $delta);
    return new Response($this->renderer->render($build));
  }

  /**
   * Get all blocks available.
   *
   * @inheritDoc
   */
  private function getBlocksAvailable($user) {
    $settings = $this->config('user_dashboard.settings');
    $blocksAvailable = $settings->get('user_dashboard_available_blocks');
    $definitions = $this->userDashboardBlocks->getDefinitions();
    if (empty($blocksAvailable)) {
      return $definitions;
    }
    else {
      foreach ($blocksAvailable as $index => $available) {
        $blocksAvailable[$index] = $definitions[$available];
      }
    }
    return $blocksAvailable;
  }

  /**
   * Redirect to user dashboard.
   *
   * @inheritDoc
   */
  public function goto() {
    return $this->redirect('user_dashboard_bootstrap.id_dashboard', [
      'user' => $this->currentUser->id(),
    ]);
  }

}

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

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