monster_menus-9.0.x-dev/src/AlterSearchReplace.php

src/AlterSearchReplace.php
<?php

/**
 * @file
 * Form data alteration code for mm_search_replace_inc
 */

namespace Drupal\monster_menus;

use Drupal\Core\Form\FormState;
use Drupal\Core\Render\Element;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\node\Entity\Node;
use Drupal\taxonomy\Entity\Vocabulary;
use Drupal\monster_menus\Form\EditContentForm;

class AlterSearchReplace {
  /**
   * Query segments can include substitutions:
   *   ={php code}
   *     Execute the PHP code contained within the braces. Multiple statements
   *     can be separated by ';'. Use 'return' to set the value to substitute
   *     for the expression. This return value is then parsed recursively for
   *     any further substitutions.
   *
   *   ${form variable name}
   *     Substitute the value with the given name, as POSTed to the form by the
   *     user. When the query expects an integer, be sure to use 'intval()', to
   *     avoid possible code injection.
   *
   *     Other, special variables that are available when a particular field is
   *     being added during the search query build process:
   *      - ${table} name of the table containing the field
   *      - ${val}   raw value from the search form; be careful with this!
   *      - ${ival}  the value as an integer
   *      - ${qval}  the value properly 'quoted'
   *
   *   ${'form variable name'}
   *     Substitute the value with the given name, as above, but enclose the
   *     result in single quotes and escape any single quotes in the string.
   *     This sanitizes form input so that it can be included in SQL queries or
   *     evaluated PHP code.
   *
   *   |{text}
   *     Split the current field value on commas, re-evaluating the text for
   *     each sub-value, and then join the results with ','. During each
   *     iteration, the ${*val} variables are set to the sub-value(see below).
   *     The result is usually surrounded with IN().
   *
   *     For example, if the query segment contained:
   *       SELECT * FROM foo WHERE col IN(|{${qval}})
   *     and the value started with 'v1,v2,v3', the result would be:
   *       SELECT * FROM foo WHERE col IN('v1', 'v2', 'v3')
   *
   *   {table name}
   *     Regular, Drupal-style escaping of a SQL table's name
   */

  static $nodeQueries = [
    'title' => [
      [],
      ['title' => '{node_field_data}.title ={return $query_segments["title"][intval(${search-title-0})]}'],
    ],
    'body' => [
      ['node_revision__body' => '{node_revision__body}.revision_id = {node}.vid'],
      ['body' => '{node_revision__body}.body_value ={return $query_segments["body"][intval(${search-body-0})]}'],
    ],
    'revision_log' => [
      ['node_revision' => '{node_revision}.nid = {node_field_data}.nid AND {node_revision}.vid = {node_field_data}.vid'],
      ['revision_log' => '{node_revision}.revision_log ={return $query_segments["revision_log"][intval(${search-revision_log-0})]}'],
    ],
    'owner-choose' => [
      [],
      ['owner' => '{node_field_data}.uid ={return $query_segments["owner-choose"][intval(${search-owner-choose-0})]}'],
    ],
    'groups_w' => [
      [],
      ['groups_w' => '={return $query_segments["groups_w"][intval(${search-groups_w-0})]}'],
    ],
    'created' => [
      [],
      ['created' => '={return $this->searchDate("created", "{node_field_data}.created")}'],
    ],
    'changed' => [
      [],
      ['changed' => '={return $this->searchDate("changed", "{node_field_data}.changed")}'],
    ],
    'publish_on' => [
      ['mm_node_schedule' => '{mm_node_schedule}.nid = {node_field_data}.nid'],
      ['publish_on' => '={return $this->searchDate("publish_on", "{mm_node_schedule}.publish_on")}'],
    ],
    'unpublish_on' => [
      ['mm_node_schedule' => '{mm_node_schedule}.nid = {node_field_data}.nid'],
      ['unpublish_on' => '={return $this->searchDate("unpublish_on", "{mm_node_schedule}.unpublish_on")}'],
    ],
  ];

  static $queryDefaults = [
    's' => [
      'contains'                              => '={return ${qval}=="" ? "IS NULL" : "LIKE CONCAT(\'%\',${qval},\'%\')"}',
      'is'                                    => '= ${qval}',
      'begins with'                           => '={return ${qval}=="" ? "IS NULL" : "LIKE CONCAT(${qval},\'%\')"}',
      'ends with'                             => '={return ${qval}=="" ? "IS NULL" : "LIKE CONCAT(\'%\',${qval})"}',
      'matches the regular expression'        => '={return ${qval}=="" ? "IS NULL" : "REGEXP \'".${qval}."\'"}',
      'does not contain'                      => '={return ${qval}=="" ? "IS NOT NULL" : "NOT LIKE CONCAT(\'%\',${qval},\'%\')"}',
      'is not'                                => '<> ${qval}',
      'does not begin with'                   => '={return ${qval}=="" ? "IS NOT NULL" : "NOT LIKE CONCAT(${qval},\'%\')"}',
      'does not end with'                     => '={return ${qval}=="" ? "IS NOT NULL" : "NOT LIKE CONCAT(\'%\',${qval})"}',
      'does not match the regular expression' => '={return ${qval}=="" ? "IS NOT NULL" : "NOT REGEXP \'".${qval}."\'"}'],
    'i' => array(
      'is'                                    => '= ${ival}',
      'is not'                                => '<> ${ival}'),
    'date' => array(
      'is exactly'                            => '=',
      'is newer than'                         => '>',
      'is older than'                         => '<',
      'is not'                                => '<>'),
  ];

  public static function alterNode(&$form) {
    defined('DATE_FORMAT_DATETIME') or define('DATE_FORMAT_DATETIME', 'Y-m-d H:i:s');
    $date_desc = t('Format: %time', ['%time' => mm_format_date(mm_request_time(), 'custom', DATE_FORMAT_DATETIME)]);

    _mm_ui_form_array_merge($form, 'settings_perms', ['#type' => 'details', '#open' => TRUE, '#title' => t('Who can edit or delete this content')]);

    _mm_ui_userlist_setup([], $form['settings_perms'], 'owner', t('Owner'), TRUE, '', '');

    $form['settings_perms']['groups_w'] = [
      '#type' => 'mm_grouplist',
      '#mm_list_popup_start' => mm_content_groups_mmtid(),
      '#mm_list_other_name' => 'others_w',
    ];

    _mm_ui_userlist_setup([], $form['settings_perms'], 'users_w', t('Individual users'), FALSE, '', 'others_w');

    $form['settings_perms']['others_w'] = [
      '#type' => 'checkbox',
      '#title' => t('Everyone'),
      '#attributes' => ['class' => ['settings-perms-others']],
    ];

    $form['title'] = [
      '#type' => 'textfield',
      '#title' => t('the title'),
    ];

    $form['body'] = [
      '#type' => 'textarea',
      '#title' => t('the body'),
    ];

    $form['revision_log'] = [
      '#type' => 'textarea',
      '#title' => t('the revision log message'),
    ];

    $form['is_recycled'] = [
      '#type' => 'checkbox',
    ];

    $form['changed'] = [
      '#type' => 'datetime',
      '#title' => t('the modification date/time'),
      '#mm-search-opt' => static::$queryDefaults['date'],
      '#mm-search-description' => $date_desc,
      '#default_value' => NULL,
    ];

    if (mm_module_exists('taxonomy')) {
      $vocabs = [];
      foreach (Vocabulary::loadMultiple() as $vid => $vocab) {
        if ($vocab->bundle() == 'taxonomy_vocabulary') {
          $vocabs[$vid] = $vocab->get('name');
        }
      }

      foreach (\Drupal::service('entity_field.manager')->getFieldMap()['node'] as $field_name => $info) {
        if ($info['type'] == 'entity_reference') {
          $field_info = FieldStorageConfig::loadByName('node', $field_name);
          if ($field_info && $field_info->getSetting('target_type') == 'taxonomy_term') {
            $node = Node::create(['type' => reset($info['bundles'])]);
            $definition = $node->get($field_name);
            $ids = (object) [
              'entity_type' => 'node',
              'bundle' => $node->getType(),
              'entity_id' => NULL,
            ];
            $temp_form = ['#entity' => _field_create_entity_from_ids($ids)];
            $items = $temp_form['#entity']->get($definition->getName());
            $form_state = new FormState();
            if ($element = $items->defaultValuesForm($temp_form, $form_state)) {
              if (isset($element['widget'][0]['target_id']['#selection_settings']['target_bundles'])) {
                $target = $element['widget'][0]['target_id'];
              }
              else if (isset($element['widget']['target_id']['#selection_settings']['target_bundles'])) {
                $target = $element['widget']['target_id'];
              }
              else {
                continue;
              }

              $vid = reset($target['#selection_settings']['target_bundles']);
              if (isset($vocabs[$vid])) {
                $key = 'taxonomy-' . $vid;
                $form[$key] = $target;
                $form[$key]['#field_parents'] = [];
                $form[$key] += [
                  '#mm-search' => t('the taxonomy "@taxon"', ['@taxon' => $vocabs[$vid]]),
                  '#mm-search-opt' => [
                    'contains the term' => '= ${qval}',
                    'does not contain the term' => 'IS NULL OR {taxonomy_term_field_data}.name <> ${qval}',
                  ],
                  '#mm-search-query' => [
                    $key => '{taxonomy_term_field_data}.name ={return $query_segments["' . $key . '"][intval(${search-' . $key . '-0})]}',
                  ],
                  '#mm-search-joins' => [
                    'taxonomy_index' => '{taxonomy_index}.nid = {node_field_data}.nid',
                    'taxonomy_term_field_data' => '{taxonomy_term_field_data}.tid = {taxonomy_index}.tid AND {taxonomy_term_field_data}.vid = \'' . $vid . "'",
                  ]
                ];
                unset($vocabs[$vid]);
              }
            }
          }
        }
      }
    }

    // ---------------- Begin alterations for node form elements ----------------
    $alter = [
      // -------------------------------------------------------------------
      [&$form['created']['widget'][0]['value'], '#mm-search', t('the creation date/time')],
      [&$form['created']['widget'][0]['value'], '#mm-search-opt', static::$queryDefaults['date']],
      [&$form['created']['widget'][0]['value'], '#mm-search-description', $date_desc],
      [&$form['created']['widget'][0]['value'], '#mm-search-key', 'created'],
      // -------------------------------------------------------------------
      [&$form['publish_settings']['publish_on'], '#mm-search', t('the "publish on" date/time')],
      [&$form['publish_settings']['publish_on'], '#mm-search-opt', static::$queryDefaults['date']],
      [&$form['publish_settings']['publish_on'], '#mm-search-description', $date_desc],
      // -------------------------------------------------------------------
      [&$form['publish_settings']['unpublish_on'], '#mm-search', t('the "unpublish on" date/time')],
      [&$form['publish_settings']['unpublish_on'], '#mm-search-opt', static::$queryDefaults['date']],
      [&$form['publish_settings']['unpublish_on'], '#mm-search-description', $date_desc],
      // -------------------------------------------------------------------
      [&$form['is_recycled'], '#mm-search', [(string) t('the content is in a recycle bin') => 'unused', (string) t('the content is not in a recycle bin') => 'unused']],
      [&$form['is_recycled'], '#mm-search-query', [
        'is_recycled-0' => '{mm_recycle}.id IS NOT NULL',
        'is_recycled-1' => '{mm_recycle}.id IS NULL']],
      [&$form['is_recycled'], '#mm-search-joins', ['mm_recycle' => "{mm_recycle}.type = 'node' AND {mm_recycle}.id = {node_field_data}.nid"]],
      // -------------------------------------------------------------------
      [&$form['settings_perms']['owner-choose'], '#mm-search', t('the author/owner')],
      [&$form['settings_perms']['owner-choose'], '#mm-search-opt', [
        'is' => '={return ${qval}=="" ? "IS NULL" : "= ${ival}"}',
        'is not' => '={return ${qval}=="" ? "IS NOT NULL" : "<> ${ival}"}']],
      [&$form['settings_perms']['owner'], '#required', NULL],
      [&$form['settings_perms']['owner'], '#title', ''],
      [&$form['settings_perms']['owner'], '#mm-search-weight', 9],
      [&$form['settings_perms']['owner'], '#mm_list_submit_on_add', FALSE],
      // -------------------------------------------------------------------
      [&$form['settings_perms']['groups_w'], '#mm-search', t('who can edit or delete this content')],
      [&$form['settings_perms']['groups_w'], '#mm-search-opt', [
        'contains' => '={
          list($a) = \Drupal\monster_menus\AlterSearchReplace::splitMMList(${qval}, "${users_w}");
          $o = array();
          if ($a[0]) $o[] = "{mm_node_write}.gid IN($a[0])";
          if ($a[1]) $o[] = "{mm_group}.uid IN($a[1])";
          return $o ?
            "SELECT COUNT(*) > 0 FROM {mm_node_write} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_node_write}.gid WHERE {mm_node_write}.nid = {node_field_data}.nid AND (" . join(" OR ", $o) . ")" :
            "FALSE";}',
        'exactly matches' => '={
          list($a) = \Drupal\monster_menus\AlterSearchReplace::splitMMList(${qval}, "${users_w}");
          return "SELECT IFNULL((SELECT GROUP_CONCAT(DISTINCT {mm_group}.uid ORDER BY {mm_group}.uid) FROM {mm_node_write} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_node_write}.gid WHERE {mm_group}.gid < 0 AND {mm_node_write}.nid = {node_field_data}.nid), \'\') = \'$a[1]\' AND IFNULL((SELECT GROUP_CONCAT(DISTINCT {mm_node_write}.gid ORDER BY {mm_node_write}.gid) FROM {mm_node_write} INNER JOIN {mm_group} ON {mm_group}.gid = {mm_node_write}.gid WHERE {mm_group}.gid > 0 AND {mm_node_write}.nid = {node_field_data}.nid), \'\') = \'$a[0]\'"}',
        'does not contain' => '={
          list($a) = \Drupal\monster_menus\AlterSearchReplace::splitMMList(${qval}, "${users_w}");
          $o = array();
          if ($a[0]) $o[] = "{mm_node_write}.gid IN($a[0])";
          if ($a[1]) $o[] = "{mm_group}.uid IN($a[1])";
          return $o ?
            "SELECT COUNT(*) = 0 FROM {mm_node_write} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_node_write}.gid WHERE {mm_node_write}.nid = {node_field_data}.nid AND (" . join(" OR ", $o) . ")" :
            "TRUE";}',
        'does not match' => '={
          list($a) = \Drupal\monster_menus\AlterSearchReplace::splitMMList(${qval}, "${users_w}");
          return "SELECT IFNULL((SELECT GROUP_CONCAT(DISTINCT {mm_group}.uid ORDER BY {mm_group}.uid) FROM {mm_node_write} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_node_write}.gid WHERE {mm_group}.gid < 0 AND {mm_node_write}.nid = {node_field_data}.nid), \'\') != \'$a[1]\' OR IFNULL((SELECT GROUP_CONCAT(DISTINCT {mm_node_write}.gid ORDER BY {mm_node_write}.gid) FROM {mm_node_write} INNER JOIN {mm_group} ON {mm_group}.gid = {mm_node_write}.gid WHERE {mm_group}.gid > 0 AND {mm_node_write}.nid = {node_field_data}.nid), \'\') != \'$a[0]\'"}']],
    ];
    // ----------------- End alterations for node form elements -----------------

    foreach ($alter as $a) {
      [&$ref, $key, $value] = $a;
      if (isset($ref)) {
        if (is_null($value)) {
          unset($ref[$key]);
        }
        else {
          $ref[$key] = $value;
        }
      }
    }
  }

  public static function alterMM(&$form, $is_group) {
    $x = mm_ui_strings($is_group);
    $opt1 = [
      (string) t('contains') => 's',
      (string) t('is') => 's',
      (string) t('begins with') => 's',
      (string) t('ends with') => 's',
      (string) t('matches the regular expression') => 's',
      (string) t('does not contain') => 's',
      (string) t('is not') => 's',
      (string) t('does not begin with') => 's',
      (string) t('does not end with') => 's',
      (string) t('does not match the regular expression') => 's'];
    $waur = [
      '[w]' => Constants::MM_PERMS_WRITE,
      '[a]' => Constants::MM_PERMS_SUB,
      '[u]' => Constants::MM_PERMS_APPLY,
      '[r]' => Constants::MM_PERMS_READ,
    ];
    if ($is_group) unset($waur['[u]']);

    $labels = EditContentForm::getPermsLabels(FALSE, $is_group, $x);
    foreach ($waur as $short) {
      $form['settings_perms'][$short] = [
        '#type' => 'details',
        '#open' => TRUE,
        '#title' => str_replace('&#8203;', '', (string) $labels[$short][0]),
      ];

      $form['settings_perms'][$short]["groups_$short"] = [
        '#type' => 'mm_grouplist',
        '#mm_list_popup_start' => mm_content_groups_mmtid(),
        '#mm_list_other_name' => "others_$short",
      ];

      _mm_ui_userlist_setup([], $form['settings_perms'][$short], "users_$short", t('Individual users'), FALSE, '', "others_$short");

      $form['settings_perms'][$short]["others_$short"] = [
        '#type' => 'checkbox',
        '#title' => t('Everyone'),
        '#attributes' => ['class' => ['settings-perms-others']],
      ];
    }

    $form['settings_perms2'] = [
      '#type' => 'fieldset',
      '#title' => $form['settings_perms']['#title'],
    ];
    _mm_ui_userlist_setup([''], $form['settings_perms2'], 'settings_perms2', t('User'), TRUE, '');
    $form['settings_perms2']['settings_perms2']['#mm_list_submit_on_add'] = FALSE;

    $form['flags']['flags_value'] = [
      '#type' => 'textfield',
    ];
    $form['flags']['flags_name'] = [
      '#type' => 'select',
      '#options' => [],
      '#weight' => -11,
    ];
    foreach (Element::children($form['flags']) as $child) {
      if (in_array($form['flags'][$child]['#type'], ['fieldset', 'details']) && $child != 'free_flags') {
        $fieldset = $form['flags'][$child]['#title'];
        foreach (Element::children($form['flags'][$child]) as $child2) {
          if (!empty($form['flags'][$child][$child2]['#input'])) {
            $title = $form['flags'][$child][$child2]['#title'];
            $form['flags']['flags_name']['#options'][$fieldset][$title] = $title;
            unset($form['flags'][$child][$child2]);
          }
        }
        unset($form['flags'][$child]);
      }
    }

    $form['flags2'] = [
      '#type' => 'details',
      '#open' => TRUE,
      '#title' => $form['flags']['#title'],
      'free_flags_name' => [
        '#type' => 'textfield',
        '#title' => t('named'),
        '#mm-search-weight' => -2,
      ],
      'free_flags' => [
        '#mm-search-weight' => -1,
      ],
      'free_flags_value' => [
        '#type' => 'textfield',
        '#mm-search-weight' => 0,
      ],
    ];
    unset($form['flags']['free_flags']);

    $form['recycled'] = [
      '#type' => 'details',
      '#open' => TRUE,
      '#title' => t('Recycle status'),
      'is_recycled2' => ['#type' => 'checkbox'],
    ];

    // ------------- Begin alterations for group/page form elements -------------
    $alter = [
      [0, &$form['settings_general']['name'], '#mm-search', t('the page name')],
      [1, &$form['settings_general']['name'], '#mm-search', t('the group name')],
      [-1, &$form['settings_general']['name'], '#mm-search-opt', $opt1],
      [-1, &$form['settings_general']['name'], '#mm-search-query', [
        'name' => '{mm_tree}.name ={return $query_segments["name"][intval(${search-name-0})]}']],
      [-1, &$form['settings_general']['name'], '#required', FALSE],
      // -------------------------------------------------------------------
      [1, &$form['members']['members-choose'], '#mm-search', t('the list of members')],
      [1, &$form['members']['members-choose'], '#mm-search-opt', [
        (string) t('contains') => '={
          list($a, $c) = \Drupal\monster_menus\AlterSearchReplace::splitMMList("${members}");
          return $a[0] ? "SELECT COUNT(*) = $c FROM {mm_group} g LEFT JOIN {mm_virtual_group} v ON v.vgid = g.vgid WHERE g.gid = {mm_tree}.mmtid AND (g.uid IN($a[0]) OR v.uid IN($a[0]))" : "FALSE";}',
        (string) t('exactly matches') => '={
          list($a, $c) = \Drupal\monster_menus\AlterSearchReplace::splitMMList("${members}");
          return "SELECT IFNULL((SELECT IF(v.vgid>0, GROUP_CONCAT(DISTINCT v.uid ORDER BY v.uid), GROUP_CONCAT(DISTINCT g.uid ORDER BY g.uid)) FROM {mm_group} g LEFT JOIN {mm_virtual_group} v ON v.vgid = g.vgid WHERE g.gid = {mm_tree}.mmtid GROUP BY g.gid, v.vgid), \'\') = \'$a[0]\'";}',
        (string) t('does not contain') => '={
          list($a, $c) = \Drupal\monster_menus\AlterSearchReplace::splitMMList("${members}");
          return $a[0] ? "SELECT COUNT(*) != $c FROM {mm_group} g LEFT JOIN {mm_virtual_group} v ON v.vgid = g.vgid WHERE g.gid = {mm_tree}.mmtid AND (g.uid IN($a[0]) OR v.uid IN($a[0]))" : "TRUE";}',
        (string) t('does not match') => '={
          list($a, $c) = \Drupal\monster_menus\AlterSearchReplace::splitMMList("${members}");
          return "SELECT IFNULL((SELECT IF(v.vgid>0, GROUP_CONCAT(DISTINCT v.uid ORDER BY v.uid), GROUP_CONCAT(DISTINCT g.uid ORDER BY g.uid)) FROM {mm_group} g LEFT JOIN {mm_virtual_group} v ON v.vgid = g.vgid WHERE g.gid = {mm_tree}.mmtid GROUP BY g.gid, v.vgid), \'\') != \'$a[0]\'";}',
      ]],
      [1, &$form['members']['members-choose'], '#mm-search-query', [
        'members' => '={return $query_segments["members-choose"][intval(${search-members-choose-0})]}']],
      [1, &$form['members']['members-choose']['#attributes'], 'class', NULL],
      // -------------------------------------------------------------------
      [-1, &$form['settings_general']['alias'], '#mm-search', t('the URL name')],
      [-1, &$form['settings_general']['alias'], '#mm-search-opt', $opt1],
      [-1, &$form['settings_general']['alias'], '#mm-search-query', [
        'alias' => '{mm_tree}.alias ={return $query_segments["alias"][intval(${search-alias-0})]}']],
      [-1, &$form['settings_general']['alias'], '#required', FALSE],
      // -------------------------------------------------------------------
      [-1, &$form['flags']['flags_value'], '#mm-search', t('the pre-defined flag')],
      [-1, &$form['flags']['flags_value'], '#mm-search-opt-list', [
        &$form['flags']['flags_name'],
        array_merge(
          $opt1,
          [
            (string) t('is set') => 'IS NOT NULL',
            (string) t('is not set') => 'IS NULL',
          ]
        ),
      ]],
      [-1, &$form['flags']['flags_value'], '#mm-search-query', [
        'flags_value' => '={$a = intval(${search-flags_value-1});
          if ($a < 10 && ${\'flags_value\'} == "") return "FALSE";
          if ($a == 10) return "SELECT COUNT(*)>0 FROM {mm_tree_flags} WHERE {mm_tree_flags}.mmtid = {mm_tree}.mmtid AND {mm_tree_flags}.flag = ${\'search-flags_value-0\'}";
          if ($a == 11) return "SELECT COUNT(*)=0 FROM {mm_tree_flags} WHERE {mm_tree_flags}.mmtid = {mm_tree}.mmtid AND {mm_tree_flags}.flag = ${\'search-flags_value-0\'}";
          return "SELECT COUNT(*)>0 FROM {mm_tree_flags} WHERE {mm_tree_flags}.mmtid = {mm_tree}.mmtid AND {mm_tree_flags}.flag = ${\'search-flags_value-0\'} AND {mm_tree_flags}.data " . $query_segments["flags_value-1"][$a]}']],
      [-1, &$form['flags']['flags_value'], '#mm-search-attr', ['onchange' => "return MMSR_onchange_flags(this, 'flags_value');"]],
      // -------------------------------------------------------------------
      [-1, &$form['flags2']['free_flags_value'], '#mm-search', t('the free-form flag')],
      [-1, &$form['flags2']['free_flags_value'], '#mm-search-opt-list', [
        &$form['flags2']['free_flags_name'],
        array_merge(
          $opt1,
          [
            (string) t('is set') => 'IS NOT NULL',
            (string) t('is not set') => 'IS NULL',
          ]
        ),
      ]],
      [-1, &$form['flags2']['free_flags_value'], '#mm-search-query', [
        'free_flags_value' => '={$a = intval(${search-free_flags_value-1});
          if (${\'search-free_flags_value-0\'} == "" || $a < 10 && ${\'free_flags_value\'} == "") return "FALSE";
          if ($a == 10) return "SELECT COUNT(*)>0 FROM {mm_tree_flags} WHERE {mm_tree_flags}.mmtid = {mm_tree}.mmtid AND {mm_tree_flags}.flag = ${\'search-free_flags_value-0\'}";
          if ($a == 11) return "SELECT COUNT(*)=0 FROM {mm_tree_flags} WHERE {mm_tree_flags}.mmtid = {mm_tree}.mmtid AND {mm_tree_flags}.flag = ${\'search-free_flags_value-0\'}";
          return "SELECT COUNT(*)>0 FROM {mm_tree_flags} WHERE {mm_tree_flags}.mmtid = {mm_tree}.mmtid AND {mm_tree_flags}.flag = ${\'search-free_flags_value-0\'} AND {mm_tree_flags}.data " . $query_segments["free_flags_value-1"][$a]}']],
      [-1, &$form['flags2']['free_flags_value'], '#mm-search-attr', ['onchange' => "return MMSR_onchange_flags(this, 'free_flags_value');"]],
      // -------------------------------------------------------------------
      [-1, &$form['settings_perms'], '#mm-search', t('permission')],
      [-1, &$form['settings_perms'], '#mm-search-opt', [
        $waur, [
          (string) t('contains') => '={
            $mode = substr("${search-settings_perms-0}", 0, 1);
            $a = \Drupal\monster_menus\AlterSearchReplace::splitMMListPerms($mode, $others);
            if ($others) return "LOCATE(\'$mode\', {mm_tree}.default_mode) > 0";
            $o = array();
            if ($a[0]) $o[]="{mm_tree_access}.gid IN($a[0])";
            if ($a[1]) $o[]="{mm_group}.uid IN($a[1])";
            return $o ? "SELECT COUNT(*) > 0 FROM {mm_tree_access} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_tree_access}.gid WHERE {mm_tree_access}.mmtid = {mm_tree}.mmtid AND {mm_tree_access}.mode=\'$mode\' AND (" . join(" OR ", $o) . ")" : "FALSE";}',
          (string) t('exactly matches') => '={
            $mode = substr("${search-settings_perms-0}", 0, 1);
            $a = \Drupal\monster_menus\AlterSearchReplace::splitMMListPerms($mode, $others);
            if ($others) $others = " AND LOCATE(\'$mode\', {mm_tree}.default_mode) > 0";
            return "SELECT IFNULL((SELECT GROUP_CONCAT(DISTINCT {mm_group}.uid ORDER BY {mm_group}.uid) FROM {mm_tree_access} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_tree_access}.gid WHERE {mm_group}.gid < 0 AND {mm_tree_access}.mode=\'$mode\' AND {mm_tree_access}.mmtid = {mm_tree}.mmtid), \'\') = \'$a[1]\' AND IFNULL((SELECT GROUP_CONCAT(DISTINCT {mm_tree_access}.gid ORDER BY {mm_tree_access}.gid) FROM {mm_tree_access} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_tree_access}.gid WHERE IFNULL({mm_group}.gid,1) > 0 AND {mm_tree_access}.mode=\'$mode\' AND {mm_tree_access}.mmtid = {mm_tree}.mmtid), \'\') = \'$a[0]\'$others"}',
          (string) t('does not contain') => '={
            $mode = substr("${search-settings_perms-0}", 0, 1);
            $a = \Drupal\monster_menus\AlterSearchReplace::splitMMListPerms($mode, $others);
            if ($others) return "IFNULL(LOCATE(\'$mode\', {mm_tree}.default_mode), 0) = 0";
            $o = array();
            if ($a[0]) $o[]="{mm_tree_access}.gid IN($a[0])";
            if ($a[1]) $o[]="{mm_group}.uid IN($a[1])";
            return $o ? "SELECT COUNT(*) = 0 FROM {mm_tree_access} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_tree_access}.gid WHERE {mm_tree_access}.mmtid = {mm_tree}.mmtid AND {mm_tree_access}.mode=\'$mode\' AND (" . join(" OR ", $o) . ")" : "TRUE";}',
          (string) t('does not match') => '={
            $mode = substr("${search-settings_perms-0}", 0, 1);
            $a = \Drupal\monster_menus\AlterSearchReplace::splitMMListPerms($mode, $others);
            if ($others) $others = " OR LOCATE(\'$mode\', {mm_tree}.default_mode) = 0";
            return "SELECT IFNULL((SELECT GROUP_CONCAT(DISTINCT {mm_group}.uid ORDER BY {mm_group}.uid) FROM {mm_tree_access} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_tree_access}.gid WHERE {mm_group}.gid < 0 AND {mm_tree_access}.mode=\'$mode\' AND {mm_tree_access}.mmtid = {mm_tree}.mmtid), \'\') != \'$a[1]\' OR IFNULL((SELECT GROUP_CONCAT(DISTINCT {mm_tree_access}.gid ORDER BY {mm_tree_access}.gid) FROM {mm_tree_access} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_tree_access}.gid WHERE IFNULL({mm_group}.gid,1) > 0 AND {mm_tree_access}.mode=\'$mode\' AND {mm_tree_access}.mmtid = {mm_tree}.mmtid), \'\') != \'$a[0]\'$others"}',
        ]]],
      [-1, &$form['settings_perms'], '#mm-search-query', [
        'search-settings_perms-0' => '={return $query_segments["settings_perms-1"][intval(${search-settings_perms-1})]}']],
      [-1, &$form['settings_perms'], 'owner', NULL],
      [-1, &$form['settings_perms'], 'owner-choose', NULL],
      // -------------------------------------------------------------------
      [-1, &$form['settings_perms2']['settings_perms2-choose'], '#title', ''],
      [-1, &$form['settings_perms2']['settings_perms2-choose'], '#mm_list_submit_on_add', FALSE],
      [-1, &$form['settings_perms2'], '#mm-search', t('the user')],
      [-1, &$form['settings_perms2'], '#mm-search-opt', [
        (string) t('is the owner', $x) => '={
          list($a) = \Drupal\monster_menus\AlterSearchReplace::splitMMList("${settings_perms2}");
          return $a[0] == "" ? "FALSE" : "{mm_tree}.uid = $a[0]";}',
        (string) t('can delete the @thing or change its settings', $x) => '={
          list($a) = \Drupal\monster_menus\AlterSearchReplace::splitMMList("${settings_perms2}");
          return $a[0] == "" ? "FALSE" : ($a[0] ? "LOCATE(\'w\', {mm_tree}.default_mode) > 0 OR (SELECT COUNT(*) > 0 FROM {mm_tree_access} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_tree_access}.gid WHERE {mm_tree_access}.mmtid = {mm_tree}.mmtid AND {mm_tree_access}.mode=\'w\' AND {mm_group}.uid=$a[0])" : "LOCATE(\'w\', {mm_tree}.default_mode) > 0");}',
        (string) t('can append @subthings to the @thing', $x) => '={
          list($a) = \Drupal\monster_menus\AlterSearchReplace::splitMMList("${settings_perms2}");
          return $a[0] == "" ? "FALSE" : ($a[0] ? "LOCATE(\'a\', {mm_tree}.default_mode) > 0 OR (SELECT COUNT(*) > 0 FROM {mm_tree_access} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_tree_access}.gid WHERE {mm_tree_access}.mmtid = {mm_tree}.mmtid AND {mm_tree_access}.mode=\'a\' AND {mm_group}.uid=$a[0])" : "LOCATE(\'a\', {mm_tree}.default_mode) > 0");}',
        (string) t('can add content to the page') => '={
          list($a) = \Drupal\monster_menus\AlterSearchReplace::splitMMList("${settings_perms2}");
          return $a[0] == "" ? "FALSE" : ($a[0] ? "LOCATE(\'u\', {mm_tree}.default_mode) > 0 OR (SELECT COUNT(*) > 0 FROM {mm_tree_access} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_tree_access}.gid WHERE {mm_tree_access}.mmtid = {mm_tree}.mmtid AND {mm_tree_access}.mode=\'u\' AND {mm_group}.uid=$a[0])" : "LOCATE(\'u\', {mm_tree}.default_mode) > 0");}',
        ($is_group ? (string) t('can see the members of the group') : (string) t('can read the page')) => '={
          list($a) = \Drupal\monster_menus\AlterSearchReplace::splitMMList("${settings_perms2}");
          return $a[0] == "" ? "FALSE" : ($a[0] ? "LOCATE(\'r\', {mm_tree}.default_mode) > 0 OR (SELECT COUNT(*) > 0 FROM {mm_tree_access} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_tree_access}.gid WHERE {mm_tree_access}.mmtid = {mm_tree}.mmtid AND {mm_tree_access}.mode=\'r\' AND {mm_group}.uid=$a[0])" : "LOCATE(\'r\', {mm_tree}.default_mode) > 0");}',
        (string) t('is not the owner', $x) => '={
          list($a) = \Drupal\monster_menus\AlterSearchReplace::splitMMList("${settings_perms2}");
          return $a[0] == "" ? "TRUE" : "{mm_tree}.uid <> $a[0]";}',
        (string) t('cannot delete the @thing or change its settings', $x) => '={
          list($a) = \Drupal\monster_menus\AlterSearchReplace::splitMMList("${settings_perms2}");
          return $a[0] == "" ? "FALSE" : ($a[0] ? "IFNULL(LOCATE(\'w\', {mm_tree}.default_mode), 0) = 0 AND (SELECT COUNT(*) = 0 FROM {mm_tree_access} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_tree_access}.gid WHERE {mm_tree_access}.mmtid = {mm_tree}.mmtid AND {mm_tree_access}.mode=\'w\' AND {mm_group}.uid=$a[0])" : "IFNULL(LOCATE(\'w\', {mm_tree}.default_mode), 0) = 0");}',
        (string) t('cannot append @subthings to the @thing', $x) => '={
          list($a) = \Drupal\monster_menus\AlterSearchReplace::splitMMList("${settings_perms2}");
          return $a[0] == "" ? "FALSE" : ($a[0] ? "IFNULL(LOCATE(\'a\', {mm_tree}.default_mode), 0) = 0 AND (SELECT COUNT(*) = 0 FROM {mm_tree_access} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_tree_access}.gid WHERE {mm_tree_access}.mmtid = {mm_tree}.mmtid AND {mm_tree_access}.mode=\'a\' AND {mm_group}.uid=$a[0])" : "IFNULL(LOCATE(\'a\', {mm_tree}.default_mode), 0) = 0");}',
        (string) t('cannot add content to the page') => '={
          list($a) = \Drupal\monster_menus\AlterSearchReplace::splitMMList("${settings_perms2}");
          return $a[0] == "" ? "FALSE" : ($a[0] ? "IFNULL(LOCATE(\'u\', {mm_tree}.default_mode), 0) = 0 AND (SELECT COUNT(*) = 0 FROM {mm_tree_access} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_tree_access}.gid WHERE {mm_tree_access}.mmtid = {mm_tree}.mmtid AND {mm_tree_access}.mode=\'u\' AND {mm_group}.uid=$a[0])" : "IFNULL(LOCATE(\'u\', {mm_tree}.default_mode), 0) = 0");}',
        ($is_group ? (string) t('cannot see the members of the group') : (string) t('cannot read the page')) => '={
          list($a) = \Drupal\monster_menus\AlterSearchReplace::splitMMList("${settings_perms2}");
          return $a[0] == "" ? "FALSE" : ($a[0] ? "IFNULL(LOCATE(\'r\', {mm_tree}.default_mode), 0) = 0 AND (SELECT COUNT(*) = 0 FROM {mm_tree_access} LEFT JOIN {mm_group} ON {mm_group}.gid = {mm_tree_access}.gid WHERE {mm_tree_access}.mmtid = {mm_tree}.mmtid AND {mm_tree_access}.mode=\'r\' AND {mm_group}.uid=$a[0])" : "IFNULL(LOCATE(\'r\', {mm_tree}.default_mode), 0) = 0");}',
      ]],
      [-1, &$form['settings_perms2'], '#mm-search-query', [
        'settings_perms2' => '={return $query_segments["settings_perms2"][intval(${search-settings_perms2-0})]}']],
      [-1, &$form['settings_perms2'], '#mm-search-weight', 10],
      // -------------------------------------------------------------------
      [0, &$form['appearance']['theme'], '#mm-search', t('the theme setting')],
      [0, &$form['appearance']['theme'], '#mm-search-opt', [
        'is' => 's',
        'is not' => 's']],
      [0, &$form['appearance']['theme'], '#mm-search-query', [
        'theme' => '{mm_tree}.theme ={return $query_segments["theme"][intval(${search-theme-0})]}']],
      // -------------------------------------------------------------------
      [0, &$form['appearance']['allowed_themes']['#attributes'], 'multiple', NULL],
      [0, &$form['appearance']['allowed_themes']['#attributes'], 'name', NULL],
      [0, &$form['appearance']['allowed_themes'], '#multiple', FALSE],
      [0, &$form['appearance']['allowed_themes'], '#mm-search', t('the allowed themes list')],
      [0, &$form['appearance']['allowed_themes'], '#mm-search-opt', [
        'contains any of' => '={return ${qval}=="" ? "FALSE" : "SELECT COUNT(*) FROM {mm_cascaded_settings} WHERE {mm_cascaded_settings}.mmtid = {mm_tree}.mmtid AND {mm_cascaded_settings}.name = \'allowed_themes\' AND {mm_cascaded_settings}.data IN(|{${qval}})"}',
        'is' => 's',
        'does not contain any' => '={return ${qval}=="" ? "" : "SELECT COUNT(*)=0 FROM {mm_cascaded_settings} WHERE {mm_cascaded_settings}.mmtid = {mm_tree}.mmtid AND {mm_cascaded_settings}.name = \'allowed_themes\' AND {mm_cascaded_settings}.data IN(|{${qval}})"}',
        'is set and not equal to' => '<> ${qval}']],
      [0, &$form['appearance']['allowed_themes'], '#mm-search-query', [
        'allowed_themes' => '={$iv = intval(${search-allowed_themes-0}); return ($iv==0 || $iv==2 ? "" : "(SELECT GROUP_CONCAT({mm_cascaded_settings}.data ORDER BY {mm_cascaded_settings}.data ASC) FROM {mm_cascaded_settings} WHERE {mm_cascaded_settings}.mmtid = {mm_tree}.mmtid AND {mm_cascaded_settings}.name = \'allowed_themes\') ") . $query_segments["allowed_themes"][$iv]}']],
      // -------------------------------------------------------------------
      [0, &$form['menu']['hide_menu'], '#mm-search', [(string) t('the @thing is visible', $x) => 'unused', (string) t('the @thing is not visible', $x) => 'unused']],
      [0, &$form['menu']['hide_menu'], '#mm-search-query', [
        'hide_menu-0' => '{mm_tree}.hidden = 0',
        'hide_menu-1' => '{mm_tree}.hidden = 1']],
      [0, &$form['menu']['hide_menu'], '#mm-search-joins', []],
      // -------------------------------------------------------------------
      [0, &$form['menu']['menu_start'], '#mm-search', t('the location on screen')],
      [0, &$form['menu']['menu_start'], '#mm-search-opt', [
        'is' => '{mm_tree_block}.bid ={return ${ival} < 0 ? "IS NULL" : "= ${qval}"}',
        'is not' => '{mm_tree_block}.bid ={return ${ival} < 0 ? "IS NOT NULL" : "<> ${qval} OR mm_tree_block.bid IS NULL"}']],
      [0, &$form['menu']['menu_start'], '#mm-search-query', [
        'menu_start' => '={return $query_segments["menu_start"][intval(${search-menu_start-0})]}']],
      [0, &$form['menu']['menu_start'], '#mm-search-joins', [
        'mm_tree_block' => '{mm_tree_block}.mmtid = {mm_tree}.mmtid']],
      // -------------------------------------------------------------------
      [0, &$form['menu']['max_depth'], '#mm-search', t('the max. number of child levels')],
      [0, &$form['menu']['max_depth'], '#mm-search-opt', [
        'is' => '{mm_tree_block}.max_depth ={return ${ival} < 0 ? "IS NULL OR mm_tree_block.max_depth < 0" : "= ${ival}"}',
        'is not' => '{mm_tree_block}.max_depth ={return ${ival} < 0 ? ">= 0" : "<> ${ival} OR mm_tree_block.max_depth IS NULL"}']],
      [0, &$form['menu']['max_depth'], '#mm-search-query', [
        'max_depth' => '={return $query_segments["max_depth"][intval(${search-max_depth-0})]}']],
      [0, &$form['menu']['max_depth'], '#mm-search-joins', [
        'mm_tree_block' => '{mm_tree_block}.mmtid = {mm_tree}.mmtid']],
      // -------------------------------------------------------------------
      [0, &$form['menu']['max_parents'], '#mm-search', t('the max. number of parent levels')],
      [0, &$form['menu']['max_parents'], '#mm-search-opt', [
        'is' => '{mm_tree_block}.max_parents ={return ${ival} < 0 ? "IS NULL OR mm_tree_block.max_parents < 0" : "= ${ival}"}',
        'is not' => '{mm_tree_block}.max_parents ={return ${ival} < 0 ? ">= 0" : "<> ${ival} OR mm_tree_block.max_parents IS NULL"}']],
      [0, &$form['menu']['max_parents'], '#mm-search-query', [
        'max_parents' => '={return $query_segments["max_parents"][intval(${search-max_parents-0})]}']],
      [0, &$form['menu']['max_parents'], '#mm-search-joins', [
        'mm_tree_block' => '{mm_tree_block}.mmtid = {mm_tree}.mmtid']],
      // -------------------------------------------------------------------
      [0, &$form['menu']['allow_reorder'], '#mm-search', t('allow menu reordering')],
      [0, &$form['menu']['allow_reorder'], '#mm-search-opt', [
        'is' => '{mm_cascaded_settings}.data ={return ${ival} < 0 ? "IS NULL" : "= ${ival}"}',
        'is not' => '{mm_cascaded_settings}.data ={return ${ival} < 0 ? ">= 0" : "<> ${ival} OR {mm_cascaded_settings}.data IS NULL"}']],
      [0, &$form['menu']['allow_reorder'], '#mm-search-query', [
        'allow_reorder' => '={return $query_segments["allow_reorder"][intval(${search-allow_reorder-0})]}']],
      [0, &$form['menu']['allow_reorder'], '#mm-search-joins', [
        'mm_cascaded_settings' => '{mm_cascaded_settings}.mmtid = {mm_tree}.mmtid AND {mm_cascaded_settings}.name = \'allow_reorder\'']],
      // -------------------------------------------------------------------
      [0, &$form['appearance']['previews'], '#mm-search', t('show only previews')],
      [0, &$form['appearance']['previews'], '#mm-search-opt-check', [
        '' => '{mm_tree}.previews = 0',
        'is enabled' => '{mm_tree}.previews <> 0']],
      [0, &$form['appearance']['previews'], '#mm-search-query', [
        'search-previews-0' => '={return $query_segments["previews"][intval(${search-previews-0})]}']],
      // -------------------------------------------------------------------
      [0, &$form['appearance']['rss'], '#mm-search', t('the rss feed')],
      [0, &$form['appearance']['rss'], '#mm-search-opt-check', [
        '' => '{mm_tree}.rss = 0',
        'is enabled' => '{mm_tree}.rss <> 0']],
      [0, &$form['appearance']['rss'], '#mm-search-query', [
        'search-rss-0' => '={return $query_segments["rss"][intval(${search-rss-0})]}']],
      // -------------------------------------------------------------------
      [0, &$form['appearance']['nodes_per_page'], '#mm-search', t('the pieces of content displayed')],
      [0, &$form['appearance']['nodes_per_page'], '#mm-search-opt', [
        'is' => '{mm_cascaded_settings}.data ={return ${qval} == "" ? "IS NULL" : "= ${qval}"}',
        'is not' => '{mm_cascaded_settings}.data ={return ${qval} == "" ? "IS NOT NULL" : "<> ${qval} OR {mm_cascaded_settings}.data IS NULL"}']],
      [0, &$form['appearance']['nodes_per_page'], '#mm-search-query', [
        'nodes_per_page' => '={return $query_segments["nodes_per_page"][intval(${search-nodes_per_page-0})]}']],
      [0, &$form['appearance']['nodes_per_page'], '#mm-search-joins', [
        'mm_cascaded_settings' => '{mm_cascaded_settings}.mmtid = {mm_tree}.mmtid AND {mm_cascaded_settings}.name = \'nodes_per_page\'']],
      // -------------------------------------------------------------------
      [0, &$form['defaults']['node_info'], '#mm-search', t('the default attribution style')],
      [0, &$form['defaults']['node_info'], '#mm-search-opt', [
        'is' => 'i',
        'is not' => 'i']],
      [0, &$form['defaults']['node_info'], '#mm-search-query', ['node_info' => '{mm_tree}.node_info ={return $query_segments["node_info"][intval(${search-node_info-0})]}']],
      // -------------------------------------------------------------------
      [0, &$form['defaults']['comments_readable'], '#mm-search', t('who can read comments by default')],
      [0, &$form['defaults']['comments_readable'], '#mm-search-opt', [
        'is' => '{mm_cascaded_settings}.data ={return ${ival} < 0 ? "IS NULL" : "= ${qval}"}',
        'is not' => '{mm_cascaded_settings}.data ={return ${ival} < 0 ? ">= 0" : "<> ${qval} OR {mm_cascaded_settings}.data IS NULL"}']],
      [0, &$form['defaults']['comments_readable'], '#mm-search-query', ['comments_readable' => '={return $query_segments["comments_readable"][intval(${search-comments_readable-0})]}']],
      [0, &$form['defaults']['comments_readable'], '#mm-search-joins', [
        'mm_cascaded_settings' => '{mm_cascaded_settings}.mmtid = {mm_tree}.mmtid AND {mm_cascaded_settings}.name = \'comments_readable\'']],
      // -------------------------------------------------------------------
      [0, &$form['defaults']['comment'], '#mm-search', t('who can add comments by default')],
      [0, &$form['defaults']['comment'], '#mm-search-opt', [
        'is' => 'i',
        'is not' => 'i']],
      [0, &$form['defaults']['comment'], '#mm-search-query', ['comment' => '{mm_tree}.comment ={return $query_segments["comment"][intval(${search-comment-0})]}']],
      // -------------------------------------------------------------------
      [0, &$form['settings_node_types']['allowed_node_types'], '#mm-search', t('the allowed content types list')],
      [0, &$form['settings_node_types']['allowed_node_types'], '#mm-search-opt', [
        'contains any of' => '={return ${qval}=="" ? "FALSE" : "SELECT COUNT(*) FROM {mm_cascaded_settings} WHERE {mm_cascaded_settings}.mmtid = {mm_tree}.mmtid AND {mm_cascaded_settings}.name = \'allowed_node_types\' AND {mm_cascaded_settings}.data IN(|{${qval}})"}',
        'is' => 's',
        'is "inherit from parent"' => 'IS NULL',
        'does not contain any of' => '={return ${qval}=="" ? "" : "SELECT COUNT(*)=0 FROM {mm_cascaded_settings} WHERE {mm_cascaded_settings}.mmtid = {mm_tree}.mmtid AND {mm_cascaded_settings}.name = \'allowed_node_types\' AND {mm_cascaded_settings}.data IN(|{${qval}})"}',
        'is set and not equal to' => '<> ${qval}',
        'is not "inherit from parent"' => 'IS NOT NULL']],
      [0, &$form['settings_node_types']['allowed_node_types'], '#mm-search-query', [
        'allowed_node_types' => '={$iv = intval(${search-allowed_node_types-0}); return ($iv==0 || $iv==3 ? "" : "(SELECT GROUP_CONCAT({mm_cascaded_settings}.data ORDER BY {mm_cascaded_settings}.data ASC) FROM {mm_cascaded_settings} WHERE {mm_cascaded_settings}.mmtid = {mm_tree}.mmtid AND {mm_cascaded_settings}.name = \'allowed_node_types\') ") . $query_segments["allowed_node_types"][$iv]}']],
      [0, &$form['settings_node_types']['allowed_node_types'], '#mm-search-attr', ['onchange' => 'return MMSR_onchange_node_types(this);']],
      [0, &$form['settings_node_types']['allowed_node_types'], '#suffix', NULL],
      [0, &$form['settings_node_types'], '#title', t('Allowed content types')],
      // -------------------------------------------------------------------
      [0, &$form['settings_archive']['archive'], '#mm-search', t('use an archive')],
      [0, &$form['settings_archive']['archive'], '#mm-search-opt-check', [
        [
          'is disabled' => '',
          'is enabled' => ''],
        'and the frequency' => [
          '(ignore)' => '',
          'is' => '',
          'is not' => ''],
        [
          'daily' => 'day',
          'weekly' => 'week',
          'monthly' => 'month',
          'yearly' => 'year'],
        'and the number of pieces of content shown on the main page' => [
          '(ignore)' => '',
          'is' => '=',
          'is more than' => '>',
          'is less than' => '<',
          'is not' => '<>'],
        $form['settings_archive']['inner']['main_nodes']['#options'] ?? [],
      ]],
      [0, &$form['settings_archive']['archive'], '#mm-search-query', [
        'search-archive-0' => '={if (!intval(${search-archive-0})) return "{mm_archive}.main_mmtid IS NULL";
        $q = "{mm_archive}.main_mmtid IS NOT NULL";
        if (intval(${search-archive-1}) > 0 && ($v = $query_segments["archive-2"][intval(${search-archive-2})]) != "")
            $q .= intval(${search-archive-1}) == 2 ? " AND {mm_archive}.frequency <> \'$v\'" : " AND {mm_archive}.frequency = \'$v\'";
        if ($op = $query_segments["archive-3"][intval(${search-archive-3})])
          $q .= " AND {mm_archive}.main_nodes $op " . $query_segments["archive-4"][intval(${search-archive-4})];
        return $q}']],
      [0, &$form['settings_archive']['archive'], '#mm-search-joins', [
        'mm_archive' => '{mm_archive}.main_mmtid = {mm_tree}.mmtid']],
      [0, &$form['settings_archive']['archive'], '#mm-search-attr', ['class' => ['inline']]],
      // -------------------------------------------------------------------
      [0, &$form['recycled']['is_recycled2'], '#mm-search', [(string) t('the page is in a recycle bin') => 'unused', (string) t('the page is not in a recycle bin') => 'unused']],
      [0, &$form['recycled']['is_recycled2'], '#mm-search-query', [
        'is_recycled2-0' => '{mm_recycle}.id IS NOT NULL',
        'is_recycled2-1' => '{mm_recycle}.id IS NULL']],
      [0, &$form['recycled']['is_recycled2'], '#mm-search-joins', ['mm_recycle' => "{mm_recycle}.type = 'cat' AND {mm_recycle}.id = {mm_tree}.mmtid"]],
      // -------------- End alterations for group/page form elements --------------
    ];

    foreach ($alter as $a) {
      if (($a[0] < 0 || $a[0] == $is_group) && isset($a[1])) {
        if (is_null($a[3])) {
          unset($a[1][$a[2]]);
        }
        else {
          $a[1][$a[2]] = $a[3];
        }
      }
    }

    if ($is_group) {
      $form['settings_perms_g'] = $form['settings_perms'];
      unset($form['settings_perms']);
      $form['settings_perms_g']['#groups'] = [];    // Prevent recursion.
      array_walk_recursive($form['settings_perms_g'], function (&$item) {
        if (is_string($item)) {
          $item = preg_replace('/\bsettings_perms\b/', 'settings_perms_g', $item);
        }
      });
      $form['settings_perms_g']['#mm-search-query']['search-settings_perms_g-0'] = $form['settings_perms_g']['#mm-search-query']['search-settings_perms-0'];

      unset($form['settings_perms2']['#mm-search-opt'][(string) t('can add content to the page')]);
      unset($form['settings_perms2']['#mm-search-opt'][(string) t('cannot add content to the page')]);
      $form['settings_perms2_g'] = $form['settings_perms2'];
      unset($form['settings_perms2']);
      array_walk_recursive($form['settings_perms2_g'], function(&$item) {
        if (is_string($item)) {
          $item = preg_replace('/\bsettings_perms2\b/', 'settings_perms2_g', $item);
        }
      });
      $form['settings_perms2_g']['#mm-search-query']['settings_perms2_g'] = $form['settings_perms2_g']['#mm-search-query']['settings_perms2'];
      $form['settings_perms2_g']['settings_perms2_g'] = $form['settings_perms2_g']['settings_perms2'];
      unset($form['settings_perms2_g']['settings_perms2']);
      $form['settings_perms2_g']['settings_perms2_g-choose'] = $form['settings_perms2_g']['settings_perms2-choose'];
      unset($form['settings_perms2_g']['settings_perms2-choose']);
    }
    else {
      if (isset($form['menu']['menu_start']['#options'])) {
        foreach ($form['menu']['menu_start']['#options'] as $k => $v) {
          $form['menu']['menu_start']['#options'][$k] = (string) $v;
        }
      }
    }
  }

  public static function splitMMList() {
    $count = 0;
    $out = [];
    foreach (func_get_args() as $a) {
      $o = [];
      if (preg_match_all('#(\d+(?:/\d+)?)\{([^}]*)\}#', $a, $matches, PREG_SET_ORDER)) {
        foreach ($matches as $match) {
          $o[] = $match[1];
        }
      }
      sort($o);
      $out[] = join(',', $o);
      $count += count($o);
    }
    return [$out, $count];
  }

  public static function splitMMListPerms($mode, &$others) {
    $_mmsr_vars = &drupal_static('_mmsr_vars');

    if ($others = $_mmsr_vars["others_$mode"]) {
      return ['', ''];
    }
    $others = '';
    [$a] = static::splitMMList($_mmsr_vars["groups_$mode"], $_mmsr_vars["users_$mode"]);
    return $a;
  }

}

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

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