stacks-8.x-1.x-dev/stacks.module

stacks.module
<?php

use Drupal\Component\Serialization\Json;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\stacks\Entity\WidgetInstanceEntity;

/**
 * @file
 * Contains stacks.module.
 */

// Contains hook_theme().
use Drupal\Core\Url;

module_load_include('inc', 'stacks', 'inc/theme');

// Contains all hook_form_alter().
module_load_include('inc', 'stacks', 'inc/form_alters');

// Contains hook_cron().
module_load_include('inc', 'stacks', 'inc/cron');

// Contains all hooks and functions related to the admin.
module_load_include('inc', 'stacks', 'inc/admin');

/**
 * Get the stacks table.
 */
function _stacks_get_existing_stacks_table($title = '', $type = '', $sort = 'widget_times_used', $page = 0, $limit = 10, $asyn = FALSE) {

  $bundles_get = \Drupal::service('entity_type.bundle.info')->getBundleInfo('widget_entity');

  $query = \Drupal::database()->select('widget_entity', 'w');
  $query->join('widget_instance_entity', 'wi', 'w.id = wi.widget_entity');

  $query->condition('w.status', "1", '=');
  $query->condition('wi.enable_sharing', "1", '=');
  $query->condition('wi.required', "0", '=');

  if (!empty($title)) {
    $query->condition('wi.title', "%$title%", 'LIKE');
  }

  if (!empty($type)) {
    $query->condition('w.type', "{$type}%", 'LIKE');
  }

  $pager_query = clone $query;
  $pager_query->addExpression('COUNT(w.id)');
  $pager_result = $pager_query
    ->execute()
    ->fetchCol();

  $query->fields('w', ['type', 'widget_times_used'])
    ->fields('wi', ['id', 'title']);

  if ($sort == 'widget_times_used') {
    $query->orderBy('w.widget_times_used', 'DESC');
  }
  $query->orderBy('wi.title', 'ASC');

  $query->range($page * $limit, $limit);

  $result = $query->execute();

  $rows = [];

  while ($widget = $result->fetchAssoc()) {
    $rows[$widget['id']] = [
      'wname' => $widget['title'],
      'wtype' => $bundles_get[$widget['type']]['label'],
    ];
  }

  $headers = [
    'wname' => t('Widget Name'),
    'wtype' => t('Widget Type'),
  ];

  if (!empty($title)) {
    $emptymessage = t('Your search for :title did not match any widgets', [':title' => $title]);
  }
  else {
    $emptymessage = t('Your search did not match any widgets');
  }

  $form = [
    '#type' => 'tableselect',
    '#header' => $headers,
    '#options' => $rows,
    '#empty' => $emptymessage,
    '#multiple' => FALSE,
    '#js_select' => FALSE,
    '#attributes' => [
      'class' => ['existing-widgets-table'],
    ],
  ];

  $page_count = ceil((isset($pager_result[0]) ? intval($pager_result[0]) : 0) / $limit);

  $pager = _stacks_existing_stacks_pager_html($page_count, $page);

  $form['#prefix'] = "<div class='existing_stacks_dashboard'>";
  $form['#suffix'] = "<div class='existing_stacks_pager'>$pager</div></div>";

  return $form;
}

/**
 * Get the pager for our table.
 */
function _stacks_existing_stacks_pager_html($page_count, $page_number) {
  $pager = "";

  if ($page_count > 0) {
    $pager_array = [
      '#theme' => 'item_list',
      '#items' => [],
      '#attributes' => [
        'class' => [
          'pager__items',
          'js-pager__items',
        ],
      ],
    ];
    if ($page_number > 0) {
      $pager_array['#items'][] = [
        '#type' => 'link',
        '#title' => '‹ ' . t('Previous'),
        '#url' => Url::fromUri('internal:', ['fragment' => ' ']),
        '#attributes' => [
          'rel' => 'prev',
          'data-page-number' => $page_number - 1,
        ],
        '#wrapper_attributes' => [
          'class' => [
            'pager__item',
            'pager__item--previous',
          ],
        ],
      ];
    }

    for ($i = 0; $i < $page_count; $i++) {
      $id = $i + 1;
      if ($i == $page_number) {
        $pager_array['#items'][] = [
          '#type' => 'link',
          '#title' => $id,
          '#url' => Url::fromUri('internal:', ['fragment' => ' ']),
          '#attributes' => [
            'data-page-number' => $i,
          ],
          '#wrapper_attributes' => [
            'class' => [
              'pager__item',
              'is-active',
            ],
          ],
        ];
      }
      else {
        $pager_array['#items'][] = [
          '#type' => 'link',
          '#title' => $id,
          '#url' => Url::fromUri('internal:', ['fragment' => ' ']),
          '#attributes' => [
            'data-page-number' => $i,
          ],
          '#wrapper_attributes' => [
            'class' => [
              'pager__item',
            ],
          ],
        ];
      }
    }

    if ($page_number < ($page_count - 1)) {
      $pager_array['#items'][] = [
        '#type' => 'link',
        '#title' => t('Next') . ' ›',
        '#url' => Url::fromUri('internal:', ['fragment' => ' ']),
        '#attributes' => [
          'rel' => 'next',
          'data-page-number' => $page_number + 1,
        ],
        '#wrapper_attributes' => [
          'class' => [
            'pager__item',
            'pager__item--next',
          ],
        ],
      ];
    }

    $pager = \Drupal::service('renderer')->render($pager_array);
  }

  return $pager;
}

/**
 * Implements hook_hook_info().
 */
function stacks_hook_info() {
  $hooks = [
    'widget_node_results_alter' => [
      'group' => 'stacks',
    ],
  ];
  return $hooks;
}

/**
 * Implements hook_contextual_links_view_alter().
 *
 * Change Configure Blocks into offcanvas links.
 */
function stacks_contextual_links_view_alter(&$element, $items) {

  $stacks_links = [
    'stacksedit-widget',
  ];

  $width = 0;
  $height = 0;

  $contains_stacks_links = FALSE;

  foreach ($stacks_links as $stacks_link) {
    if (isset($element['#links'][$stacks_link])) {

      // Alter dimensions depending on the links
      switch ($stacks_link) {
        case 'stacksedit-widget':
          $width = 1000;
          $height = 600;
          break;
      }

      $query = $element['#links'][$stacks_link]['url']->getOption('query');
      if (!$query) {
        $query = [];
      }
      $query['stacks_dialog'] = 1;
      $element['#links'][$stacks_link]['url']->setOption('query', $query);
      $element['#links'][$stacks_link]['attributes'] = [
        'class' => ['use-ajax'],
        'data-dialog-type' => 'dialog',
        'data-dialog-options' => Json::encode([
          'width' => $width,
          'height' => $height,
          'target' => '#edit-widget-dialog',
        ]),
      ];
      $contains_stacks_links = TRUE;
    }

  }

  if ($contains_stacks_links) {
    $element['#attached']['library'][] = 'stacks/admin';
  }

}

/**
 * Implements hook_ajax_render_alter().
 */
function stacks_ajax_render_alter(array &$data) {
  if (\Drupal::request()->query->get('stacks_dialog') && \Drupal::request()->request->get('op') == t('Save')) {
    foreach ($data as &$command) {
      if (array_key_exists('selector', $command)) {
        $command['selector'] = '#edit-widget-dialog-wrapper';
      }
    }
   }
}


/**
 * Implements hook_entity_delete().
 *
 * Removed non-reuseable widgets from the node.
 */
function stacks_entity_delete(EntityInterface $entity) {
  // Here we are gonna remove widgets if they are not reusable when an entity
  // That has a stack fields is removed
  if ($entity instanceof ContentEntityInterface) {
    $fields = $entity->getFields();
    foreach ($fields as $field) {
      if ($field->getFieldDefinition()->getType() == 'stacks_type') {
        foreach ($field as $item) {
          $widget_instance_id = $item->get('widget_instance_id')->getValue();
          if ($widget_instance_id) {
            $widget_instance = WidgetInstanceEntity::load($widget_instance_id);
            if ($widget_instance && !$widget_instance->isShareable()) {
              $widget_entity = $widget_instance->getWidgetEntity();
              $widget_entity->delete();
              $widget_instance->delete();
            }
          }
        }
      }
    }
  }
}

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

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