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();
}
}
}
}
}
}
}
