arch-8.x-1.x-dev/arch.module
arch.module
<?php
/**
* @file
* Arch base module.
*/
use Drupal\Core\Form\FormStateInterface;
use Drupal\node\Entity\Node;
/**
* Implements hook_theme().
*/
function arch_theme($existing, $type, $theme, $path) {
return [
'arch_terms_of_use' => [
'render element' => 'elements',
],
];
}
/**
* Implements hook_theme_suggestions_HOOK().
*/
function arch_theme_suggestions_arch_terms_of_use(array $variables) {
$settings = _arch_content_settings();
$suggestions = [];
$suggestions[] = 'arch_terms_of_use__' . strtolower($settings['mode']);
return $suggestions;
}
/**
* Preprocess arch terms of use theme.
*/
function template_preprocess_arch_terms_of_use(array &$variables) {
$variables += [
'settings' => [],
'mode' => '_none',
'tc_link' => NULL,
'node_tc' => NULL,
'pp_link' => NULL,
'node_pp' => NULL,
'content' => '',
];
$settings = _arch_content_settings();
$variables['settings'] = $settings['settings'];
$variables['mode'] = $settings['mode'];
if (!empty($settings['mode']) && $settings['mode'] != '_none') {
$variables['tc_link'] = NULL;
$variables['node_tc'] = $settings['node_tc'];
if (!empty($settings['node_tc'])) {
$variables['tc_link'] = $settings['node_tc']->toLink()->toRenderable();
}
$variables['pp_link'] = NULL;
$variables['node_pp'] = $settings['node_pp'];
if (!empty($settings['node_pp'])) {
$variables['pp_link'] = $settings['node_pp']->toLink()->toRenderable();
}
$template = t('I accept the Terms of Use', [], ['context' => 'arch_terms_of_use']);
if ($variables['mode'] === 'TCPP') {
$template = t('I accept the {{ tc_link }} and the {{ pp_link }}', [], ['context' => 'arch_terms_of_use']);
}
elseif ($variables['mode'] === 'TC') {
$template = t('I accept the {{ tc_link }}', [], ['context' => 'arch_terms_of_use']);
}
elseif ($variables['mode'] === 'PP') {
$template = t('I accept the {{ pp_link }}', [], ['context' => 'arch_terms_of_use']);
}
$variables['content'] = [
'#type' => 'inline_template',
'#template' => (string) $template,
'#context' => [
'tc_link' => $variables['tc_link'],
'pp_link' => $variables['pp_link'],
],
];
}
}
/**
* Implements hook_form_FORM_ID_alter().
*
* Alters the theme form to use the admin theme on node editing.
*
* @see arch_form_system_themes_admin_form_submit()
*/
function arch_form_system_themes_admin_form_alter(&$form, FormStateInterface $form_state, $form_id) {
$form['admin_theme']['use_admin_theme_arch'] = [
'#type' => 'checkbox',
'#title' => t('Use the administration theme when administrating store', [], ['context' => 'arch']),
'#default_value' => \Drupal::configFactory()->getEditable('arch.settings')->get('use_admin_theme'),
];
$form['#submit'][] = 'arch_form_system_themes_admin_form_submit';
}
/**
* Form submission handler for system_themes_admin_form().
*
* @see node_form_system_themes_admin_form_alter()
*/
function arch_form_system_themes_admin_form_submit($form, FormStateInterface $form_state) {
\Drupal::configFactory()->getEditable('node.settings')
->set('use_admin_theme', $form_state->getValue('use_admin_theme_arch'))
->save();
\Drupal::service('router.builder')->setRebuildNeeded();
}
/**
* Implements hook_library_info_alter().
*/
function arch_library_info_alter(&$libraries, $extension) {
if ($extension == 'toolbar_themes') {
if (isset($libraries['toolbar_seven.icons'])) {
$libraries['toolbar_seven.icons']['dependencies'][] = 'arch/toolbar_themes.seven.icons';
}
if (isset($libraries['toolbar_admin_menu.icons'])) {
$libraries['toolbar_admin_menu.icons']['dependencies'][] = 'arch/toolbar_themes.admin_menu.icons';
}
}
elseif ($extension === 'arch') {
$core = '/core/assets/vendor/underscore/underscore-min.js';
if (is_file(DRUPAL_ROOT . $core)) {
$libraries['underscorejs']['js'][$core] = [
'weight' => -20,
'minified' => TRUE,
];
unset($libraries['underscorejs']['js']['assets/js/underscore/underscore-min.js']);
}
}
}
/**
* Get content settings.
*
* @return array
* All settings with keys:
* - settings: stored settings.
* - mode: selected mode.
* - node_tc: Terms&Conditions node.
* - node_pp: PrivacyPolicy node.
*/
function _arch_content_settings() {
$settings = drupal_static(__FUNCTION__);
if (!isset($settings)) {
$langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
$config = \Drupal::keyValue('arch.content_settings');
$settings['settings'] = $config->getAll();
$settings['mode'] = $config->get('mode', '_none');
if ($settings['mode'] != '_none') {
foreach (['tc', 'pp'] as $item) {
$key = 'node_' . $item;
$settings[$key] = NULL;
if (!in_array($settings['mode'], [strtoupper($item), 'TCPP'])) {
continue;
}
$nid = $config->get('nodes.' . $item);
if (!$nid) {
continue;
}
/** @var \Drupal\node\NodeInterface $node */
$node = Node::load($nid);
if (!$node || !$node->isPublished()) {
continue;
}
if ($node->hasTranslation($langcode)) {
$node = $node->getTranslation($langcode);
}
$settings[$key] = $node;
}
}
if (
($settings['mode'] == 'TC' && empty($settings['node_tc']))
|| ($settings['mode'] == 'PP' && empty($settings['node_pp']))
) {
$settings['mode'] = '_none';
}
elseif ($settings['mode'] == 'TCPP' && empty($settings['node_tc'])&& !empty($settings['node_pp'])) {
$settings['mode'] = 'PP';
}
elseif ($settings['mode'] == 'TCPP' && empty($settings['node_pp']) && !empty($settings['node_tc'])) {
$settings['mode'] = 'TC';
}
}
return $settings;
}
/**
* Implements hook_toolbar_alter().
*/
function arch_toolbar_alter(&$items) {
$items['administration']['#attached']['library'][] = 'arch/toolbar';
}
