Вход • Регистрация

исключающиеся слова из сортировки методом кейвордс

  • 24 октября 2015 г.
  • в модуле статьи есть тип сортировки кейвордс
    мне надо сделать чтоб я мог добавлять слова исключения в него, то есть слова по которым искать не надо, причем в словах должно учитываться точное вхождение, например я добавил слово - металл - его исключаем, слова металлы или металлический - НЕ ИСКЛЮЧАЮТСЯ


    Цитата
    сапорт диафана ответил это
    В функции show_block() файла modules/clauses/clauses.model.php есть строка:

    $names = $searchwords->prepare($title);

    $names - это массив слов для поиска. Ниже Вы можете исключать из него какие нужно слова.


    но я в пшп не понимаю ничего, может кто то помочь?
    в инете искал исключения из массива, но ничего не вышло
    • 24 октября 2015 г.
    • в раздел проекты обратитесь и вам помогут решить этот вопрос
    • 25 октября 2015 г.
    • Код

      /**
      * Генерирует данные для шаблонной функции: блок статей
      *
      * @param integer $count количество статей
      * @param array $site_ids страницы сайта
      * @param array $cat_ids категории
      * @param string $sort сортировка date - по дате, rand - случайно, keywords - статьи, похожие по названию для текущей страницы
      * @param integer $images количество изображений
      * @param string $images_variation размер изображений
      * @param string $tag тег
      * @param array $word_exception массив строк, которые необходимо исключить из поиска
      * @param array $word_exception_insensitive массив строк (регистронезависимых), которые необходимо исключить из поиска
      * @param array $word_exception_overlap массив строк (частично совпадающие и регистронезависимые), которые необходимо исключить из поиска
      * @return array
      */
      public function show_block($count, $site_ids, $cat_ids, $sort, $images, $images_variation, $tag, $word_exception = array(), $word_exception_insensitive = array(), $word_exception_overlap = array())
      {
      $time = mktime(23, 59, 0, date("m"), date("d"), date("Y"));

      if($sort == 'keywords')
      {
      if($this->diafan->_site->titlemodule)
      {
      $title = $this->diafan->_site->titlemodule;
      }
      else
      {
      $title = $this->diafan->_site->name;
      }
      }
      $where = '';

      //кеширование
      $cache_meta = array(
      "name" => "block",
      "cat_ids" => $cat_ids,
      "site_ids" => $site_ids,
      "count" => $count,
      "lang_id" => _LANG,
      "time" => $time,
      "sort" => $sort.($sort == 'keywords' ? $title : ''),
      "current" => ($this->diafan->_site->module == 'clauses' && $this->diafan->_route->show ? $this->diafan->_route->show : ''),
      "images" => $images,
      "images_variation" => $images_variation,
      "access" => ($this->diafan->configmodules('where_access_element', 'clauses') || $this->diafan->configmodules('where_access_cat', 'clauses') ? $this->diafan->_users->role_id : 0),
      "tag" => $tag,
      );

      if ($sort == "rand" || ! $result = $this->diafan->_cache->get($cache_meta, "clauses"))
      {
      $minus = array();
      $one_cat_id = count($cat_ids) == 1 && substr($cat_ids[0], 0, 1) !== '-' ? $cat_ids[0] : false;
      if(! $this->validate_attribute_site_cat('clauses', $site_ids, $cat_ids, $minus))
      {
      return false;
      }
      $inner = "";
      if($cat_ids)
      {
      $inner = " INNER JOIN {clauses_category_rel} as r ON r.element_id=e.id"
      ." AND r.cat_id IN (".implode(',', $cat_ids).")";
      }
      elseif(! empty($minus["cat_ids"]))
      {
      $inner = " INNER JOIN {clauses_category_rel} as r ON r.element_id=e.id"
      ." AND r.cat_id NOT IN (".implode(',', $minus["cat_ids"]).")";
      }
      $where = '';
      if($site_ids)
      {
      $where .= " AND e.site_id IN (".implode(",", $site_ids).")";
      }
      elseif(! empty($minus["site_ids"]))
      {
      $where .= " AND e.site_id NOT IN (".implode(",", $minus["site_ids"]).")";
      }
      if($sort == 'keywords')
      {
      Custom::inc('includes/searchwords.php');
      $searchwords = new Searchwords();
      $names = $searchwords->prepare($title);
      if(empty($names))
      {
      return false;
      }
      if ((!empty($word_exception_overlap))&&(!empty($names))
      {
      foreach ($word_exception_overlap as $word)
      {
      foreach ($names as $i => $name)
      {
      if (mb_stripos($name,$word) === false) continue;
      $names[$i] = '';
      }
      }
      }
      if ((!empty($word_exception_insensitive))&&(!empty($names))
      {
      foreach ($word_exception_insensitive as $word)
      {
      foreach ($names as $i => $name)
      {
      if (empty($name)) continue;
      if (mb_strtolower($word) === mb_strtolower($name)) $names[$i] = '';
      }
      }
      }
      foreach ($names as $i => $name)
      {
      if (empty($name))||((!empty($word_exception))&&(array_search($name,$names) !== false)) continue;
      $where .= ($i ? " OR ": " AND (")."LOWER(e.[name]) LIKE '%%".$name."%%'";
      }
      $where .= ")";
      }
      if($this->diafan->_site->module == 'clauses' && $this->diafan->_route->show)
      {
      $where .= $where.' AND e.id<>'.$this->diafan->_route->show;
      }
      if($tag)
      {
      $t = DB::query_fetch_array("SELECT id, [name] FROM {tags_name} WHERE [name]='%s' AND trash='0'", $tag);
      if(! $tag)
      {
      return false;
      }
      $inner .= " INNER JOIN {tags} AS t ON t.element_id=e.id AND t.element_type='element' AND t.module_name='clauses' AND t.tags_name_id=".$t["id"];
      }

      if ($sort == "rand")
      {
      $max_count = DB::query_result(
      "SELECT COUNT(DISTINCT e.id) FROM {clauses} as e"
      .$inner
      .($this->diafan->configmodules('where_access_element', 'clauses') ? " LEFT JOIN {access} AS a ON a.element_id=e.id AND a.module_name='clauses' AND a.element_type='element'" : "")
      ." WHERE e.[act]='1' AND e.trash='0' AND e.created<%d"
      .($this->diafan->_site->module == 'clauses' && $this->diafan->_route->show ? " AND e.id<>".$this->diafan->_route->show : '')
      ." AND e.date_start<=%d AND (e.date_finish=0 OR e.date_finish>=%d)"
      .$where
      .($this->diafan->configmodules('where_access_element', 'clauses') ? " AND (e.access='0' OR e.access='1' AND a.role_id=".$this->diafan->_users->role_id.")" : ''),
      $time, $time, $time
      );
      $rands = array();
      for ($i = 1; $i <= min($max_count, $count); $i++)
      {
      do
      {
      $rand = mt_rand(0, $max_count - 1);
      }
      while (in_array($rand, $rands));
      $rands[] = $rand;
      }
      }
      else
      {
      $rands[0] = 1;
      }
      $result["rows"] = array();

      foreach ($rands as $rand)
      {
      switch($sort)
      {
      case "date":
      $order = ' ORDER BY e.created DESC, e.id DESC';
      break;

      case "rand":
      $order = '';
      break;

      default:
      $order = ' ORDER BY e.sort DESC, e.id DESC';
      break;
      }
      $rows = DB::query_range_fetch_all(
      "SELECT e.id, e.[name],e.[anons], e.timeedit, e.site_id, e.created FROM {clauses} AS e"
      .$inner
      .($this->diafan->configmodules('where_access_element', 'clauses') ? " LEFT JOIN {access} AS a ON a.element_id=e.id AND a.module_name='clauses' AND a.element_type='element'" : "")
      ." WHERE e.[act]='1' AND e.trash='0' AND e.created<%d"
      .($this->diafan->_site->module == 'clauses' && $this->diafan->_route->show ? " AND e.id<>".$this->diafan->_route->show : '')
      ." AND e.date_start<=%d AND (e.date_finish=0 OR e.date_finish>=%d)"
      .$where
      .($this->diafan->configmodules('where_access_element', 'clauses') ? " AND (e.access='0' OR e.access='1' AND a.role_id=".$this->diafan->_users->role_id.")" : '')
      ." GROUP BY e.id"
      .$order,
      $time, $time, $time,
      $sort == "rand" ? $rand : 0,
      $sort == "rand" ? 1 : $count
      );

      $result["rows"] = array_merge($result["rows"], $rows);
      }
      $this->elements($result["rows"], array("count" => $images, "variation" => $images_variation));

      // если категория только одна, задаем ссылку на нее
      if (!empty($result["rows"]) && $one_cat_id)
      {
      $cat = DB::query_fetch_array("SELECT [name], site_id, id FROM {clauses_category} WHERE id=%d LIMIT 1", $one_cat_id);

      $result["name"] = $cat["name"];
      $result["link_all"] = $this->diafan->_route->link($cat["site_id"], $cat["id"], 'clauses', 'cat');
      $result["category"] = true;
      }
      // если раздел сайта только один, то задаем ссылку на него
      elseif (!empty($result["rows"]) && count($site_ids) == 1)
      {
      $result["name"] = DB::query_result("SELECT [name] FROM {site} WHERE id=%d LIMIT 1", $site_ids[0]);
      $result["link_all"] = $this->diafan->_route->link($site_ids[0]);
      $result["category"] = false;
      }
      if(! empty($result["rows"]) && $tag)
      {
      $result["name"] .= ': '.$t["name"];
      }
      //сохранение кеша
      if ($sort != "rand")
      {
      $this->diafan->_cache->save($result, $cache_meta, "clauses");
      }
      }
      foreach ($result["rows"] as &$row)
      {
      $this->prepare_data_element($row);
      }
      foreach ($result["rows"] as &$row)
      {
      $this->format_data_element($row);
      }
      return $result;
      }

  • 25 октября 2015 г.
  • Если не трудно решение пожалуйста выложите, а то не форум получится а список вопросов сплошной.
    • 25 октября 2015 г.
    • А решение которое я привел выше (дополненная функция, которая Генерирует данные для шаблонной функции: блок статей) не подходит. В ней вроде предусмотрены три массива слов:
      1. слова (чувствительные к регистру), которые при полном совпадении должны исключаться
      2. слова (не чувствительные к регистру), которые при полном совпадении должны исключаться
      3. слова (не чувствительные к регистру), которые при частичном совпадении должны исключаться
      Если нужно еще подробней, то эта функция должна быть в файле modules/clauses/clauses.model.php. Или вопрос как ей пользоваться?
      • 25 октября 2015 г.
      • ниче не понятно ж
        вот гораздо проще все
        файл в папке инклудс
        сеарчвордс 50-я строка
        • 25 октября 2015 г. , редакция: 25 октября 2015 г.
        • Решений может быть множество и они зависят от поставленных задач. То, что предлагаете Вы, то это правка функции public function prepare($text), которая находится в файле (/includes/searchwords.php). Только правкой 50 строчки дело не обойдется (если Вы не вшиваете туда постоянный список исключений, который не будет меняться). Если же список исключений будет изменяться, то этот массив будет необходимо туда передавать. А эту самую передачу Вы будете делать (если придерживаться моего понимания логики Diafan) через modules/clauses/clauses.model.php. Так вот я и предложил незначительно скорректировать функцию public function show_block( ... ), находящуюся в файле modules/clauses/clauses.model.php, что позволит при определении шаблонного тега вывода блок статей одновременно определить и сам список слов-исключений. На мой взгляд это переспективно, минимально по правкам и удобно использовать (например, в site.php). Если Вам лень сравнить приведенную мной функцию с оригиналом, чтобы понять что оригинальная функция дополнена примерно 10 строчками, то привожу код дополнения.
          Это в шабке писания:
          Код
          * @param array $word_exception массив строк, которые необходимо исключить из поиска
          * @param array $word_exception_insensitive массив строк (регистронезависимых), которые необходимо исключить из поиска
          * @param array $word_exception_overlap массив строк (частично совпадающие и регистронезависимые), которые необходимо исключить из поиска

          Это в заголовке:
          Код
          public function show_block($count, $site_ids, $cat_ids, $sort, $images, $images_variation, $tag, $word_exception = array(), $word_exception_insensitive = array(), $word_exception_overlap = array())

          Это примерно в середине:
          Код
          if ((!empty($word_exception_overlap))&&(!empty($names))
          {
          foreach ($word_exception_overlap as $word)
          {
          foreach ($names as $i => $name)
          {
          if (mb_stripos($name,$word) === false) continue;
          $names[$i] = '';
          }
          }
          }
          if ((!empty($word_exception_insensitive))&&(!empty($names))
          {
          foreach ($word_exception_insensitive as $word)
          {
          foreach ($names as $i => $name)
          {
          if (empty($name)) continue;
          if (mb_strtolower($word) === mb_strtolower($name)) $names[$i] = '';
          }
          }
          }
          foreach ($names as $i => $name)
          {
          if (empty($name))||((!empty($word_exception))&&(array_search($name,$names) !== false)) continue;
          $where .= ($i ? " OR ": " AND (")."LOWER(e.[name]) LIKE '%%".$name."%%'";
          }
          • 25 октября 2015 г.
          • тут половина людей и я в том числе в пшп не разбираются
            надо быть проще)) как понять куда в вашем примере вписывать слова исключений и какой у них разделитель
            • 26 октября 2015 г.
            • Если Вы хотите эту возможность использовать как шаблонный тег, тогда в файле (/modules/clauses/clauses.php):
              1. находим строчку "public function show_block($attributes)" и после нее строчку
              Код
              $attributes = $this->get_attributes($attributes, 'count', 'site_id', 'cat_id', 'sort', 'images', 'images_variation', 'only_module', 'tag', 'template');

              меняем на такую
              Код
              $attributes = $this->get_attributes($attributes, 'count', 'site_id', 'cat_id', 'sort', 'images', 'images_variation', 'only_module', 'tag', 'template', 'word_exception', 'word_exception_insensitive', 'word_exception_overlap');

              2. Далее следует текст
              Код
              $count = $attributes["count"] ? intval($attributes["count"]) : 3;
              $site_ids = explode(",", $attributes["site_id"]);
              $cat_ids = explode(",", $attributes["cat_id"]);
              $sort = $attributes["sort"] == "date" || $attributes["sort"] == "rand" || $attributes["sort"] == "keywords" ? $attributes["sort"] : "";
              $images = intval($attributes["images"]);
              $images_variation = $attributes["images_variation"] ? strval($attributes["images_variation"]) : 'medium';
              $tag = $attributes["tag"] && $this->diafan->configmodules('tags', 'clauses') ? strval($attributes["tag"]) : '';

              после него добавляем
              Код
              $word_exception = explode(",", $attributes["word_exception"]);
              $word_exception_insensitive = explode(",", $attributes["word_exception_insensitive"]);
              $word_exception_overlap = explode(",", $attributes["word_exception_overlap"]);

              3. В конце этой функции находим строчку
              Код
              $result = $this->model->show_block($count, $site_ids, $cat_ids, $sort, $images, $images_variation, $tag);

              и меняем ее на
              Код
              $result = $this->model->show_block($count, $site_ids, $cat_ids, $sort, $images, $images_variation, $tag, $word_exception, $word_exception_insensitive, $word_exception_overlap);

              4. В файле /modules/clauses/clauses.model.php находим функцию
              Код
              /**
              * Генерирует данные для шаблонной функции: блок статей
              *
              * @param integer $count количество статей
              * @param array $site_ids страницы сайта
              * @param array $cat_ids категории
              * @param string $sort сортировка date - по дате, rand - случайно, keywords - статьи, похожие по названию для текущей страницы
              * @param integer $images количество изображений
              * @param string $images_variation размер изображений
              * @param string $tag тег
              * @return array
              */
              public function show_block($count, $site_ids, $cat_ids, $sort, $images, $images_variation, $tag)
              {
              $time = mktime(23, 59, 0, date("m"), date("d"), date("Y"));

              if($sort == 'keywords')
              {
              if($this->diafan->_site->titlemodule)
              {
              $title = $this->diafan->_site->titlemodule;
              }
              else
              {
              $title = $this->diafan->_site->name;
              }
              }
              $where = '';

              //кеширование
              $cache_meta = array(
              "name" => "block",
              "cat_ids" => $cat_ids,
              "site_ids" => $site_ids,
              "count" => $count,
              "lang_id" => _LANG,
              "time" => $time,
              "sort" => $sort.($sort == 'keywords' ? $title : ''),
              "current" => ($this->diafan->_site->module == 'clauses' && $this->diafan->_route->show ? $this->diafan->_route->show : ''),
              "images" => $images,
              "images_variation" => $images_variation,
              "access" => ($this->diafan->configmodules('where_access_element', 'clauses') || $this->diafan->configmodules('where_access_cat', 'clauses') ? $this->diafan->_users->role_id : 0),
              "tag" => $tag,
              );

              if ($sort == "rand" || ! $result = $this->diafan->_cache->get($cache_meta, "clauses"))
              {
              $minus = array();
              $one_cat_id = count($cat_ids) == 1 && substr($cat_ids[0], 0, 1) !== '-' ? $cat_ids[0] : false;
              if(! $this->validate_attribute_site_cat('clauses', $site_ids, $cat_ids, $minus))
              {
              return false;
              }
              $inner = "";
              if($cat_ids)
              {
              $inner = " INNER JOIN {clauses_category_rel} as r ON r.element_id=e.id"
              ." AND r.cat_id IN (".implode(',', $cat_ids).")";
              }
              elseif(! empty($minus["cat_ids"]))
              {
              $inner = " INNER JOIN {clauses_category_rel} as r ON r.element_id=e.id"
              ." AND r.cat_id NOT IN (".implode(',', $minus["cat_ids"]).")";
              }
              $where = '';
              if($site_ids)
              {
              $where .= " AND e.site_id IN (".implode(",", $site_ids).")";
              }
              elseif(! empty($minus["site_ids"]))
              {
              $where .= " AND e.site_id NOT IN (".implode(",", $minus["site_ids"]).")";
              }
              if($sort == 'keywords')
              {
              Custom::inc('includes/searchwords.php');
              $searchwords = new Searchwords();
              $names = $searchwords->prepare($title);
              if(empty($names))
              {
              return false;
              }
              foreach ($names as $i => $name)
              {
              $where .= ($i ? " OR ": " AND (")."LOWER(e.[name]) LIKE '%%".$name."%%'";
              }
              $where .= ")";
              }
              if($this->diafan->_site->module == 'clauses' && $this->diafan->_route->show)
              {
              $where .= $where.' AND e.id<>'.$this->diafan->_route->show;
              }
              if($tag)
              {
              $t = DB::query_fetch_array("SELECT id, [name] FROM {tags_name} WHERE [name]='%s' AND trash='0'", $tag);
              if(! $tag)
              {
              return false;
              }
              $inner .= " INNER JOIN {tags} AS t ON t.element_id=e.id AND t.element_type='element' AND t.module_name='clauses' AND t.tags_name_id=".$t["id"];
              }

              if ($sort == "rand")
              {
              $max_count = DB::query_result(
              "SELECT COUNT(DISTINCT e.id) FROM {clauses} as e"
              .$inner
              .($this->diafan->configmodules('where_access_element', 'clauses') ? " LEFT JOIN {access} AS a ON a.element_id=e.id AND a.module_name='clauses' AND a.element_type='element'" : "")
              ." WHERE e.[act]='1' AND e.trash='0' AND e.created<%d"
              .($this->diafan->_site->module == 'clauses' && $this->diafan->_route->show ? " AND e.id<>".$this->diafan->_route->show : '')
              ." AND e.date_start<=%d AND (e.date_finish=0 OR e.date_finish>=%d)"
              .$where
              .($this->diafan->configmodules('where_access_element', 'clauses') ? " AND (e.access='0' OR e.access='1' AND a.role_id=".$this->diafan->_users->role_id.")" : ''),
              $time, $time, $time
              );
              $rands = array();
              for ($i = 1; $i <= min($max_count, $count); $i++)
              {
              do
              {
              $rand = mt_rand(0, $max_count - 1);
              }
              while (in_array($rand, $rands));
              $rands[] = $rand;
              }
              }
              else
              {
              $rands[0] = 1;
              }
              $result["rows"] = array();

              foreach ($rands as $rand)
              {
              switch($sort)
              {
              case "date":
              $order = ' ORDER BY e.created DESC, e.id DESC';
              break;

              case "rand":
              $order = '';
              break;

              default:
              $order = ' ORDER BY e.sort DESC, e.id DESC';
              break;
              }
              $rows = DB::query_range_fetch_all(
              "SELECT e.id, e.[name],e.[anons], e.timeedit, e.site_id, e.created FROM {clauses} AS e"
              .$inner
              .($this->diafan->configmodules('where_access_element', 'clauses') ? " LEFT JOIN {access} AS a ON a.element_id=e.id AND a.module_name='clauses' AND a.element_type='element'" : "")
              ." WHERE e.[act]='1' AND e.trash='0' AND e.created<%d"
              .($this->diafan->_site->module == 'clauses' && $this->diafan->_route->show ? " AND e.id<>".$this->diafan->_route->show : '')
              ." AND e.date_start<=%d AND (e.date_finish=0 OR e.date_finish>=%d)"
              .$where
              .($this->diafan->configmodules('where_access_element', 'clauses') ? " AND (e.access='0' OR e.access='1' AND a.role_id=".$this->diafan->_users->role_id.")" : '')
              ." GROUP BY e.id"
              .$order,
              $time, $time, $time,
              $sort == "rand" ? $rand : 0,
              $sort == "rand" ? 1 : $count
              );

              $result["rows"] = array_merge($result["rows"], $rows);
              }
              $this->elements($result["rows"], array("count" => $images, "variation" => $images_variation));

              // если категория только одна, задаем ссылку на нее
              if (!empty($result["rows"]) && $one_cat_id)
              {
              $cat = DB::query_fetch_array("SELECT [name], site_id, id FROM {clauses_category} WHERE id=%d LIMIT 1", $one_cat_id);

              $result["name"] = $cat["name"];
              $result["link_all"] = $this->diafan->_route->link($cat["site_id"], $cat["id"], 'clauses', 'cat');
              $result["category"] = true;
              }
              // если раздел сайта только один, то задаем ссылку на него
              elseif (!empty($result["rows"]) && count($site_ids) == 1)
              {
              $result["name"] = DB::query_result("SELECT [name] FROM {site} WHERE id=%d LIMIT 1", $site_ids[0]);
              $result["link_all"] = $this->diafan->_route->link($site_ids[0]);
              $result["category"] = false;
              }
              if(! empty($result["rows"]) && $tag)
              {
              $result["name"] .= ': '.$t["name"];
              }
              //сохранение кеша
              if ($sort != "rand")
              {
              $this->diafan->_cache->save($result, $cache_meta, "clauses");
              }
              }
              foreach ($result["rows"] as &$row)
              {
              $this->prepare_data_element($row);
              }
              foreach ($result["rows"] as &$row)
              {
              $this->format_data_element($row);
              }
              return $result;
              }

              и меняем ее на эту
              Код
              /**
              * Генерирует данные для шаблонной функции: блок статей
              *
              * @param integer $count количество статей
              * @param array $site_ids страницы сайта
              * @param array $cat_ids категории
              * @param string $sort сортировка date - по дате, rand - случайно, keywords - статьи, похожие по названию для текущей страницы
              * @param integer $images количество изображений
              * @param string $images_variation размер изображений
              * @param string $tag тег
              * @param array $word_exception массив строк, которые необходимо исключить из поиска
              * @param array $word_exception_insensitive массив строк (регистронезависимых), которые необходимо исключить из поиска
              * @param array $word_exception_overlap массив строк (частично совпадающие и регистронезависимые), которые необходимо исключить из поиска
              * @return array
              */

              public function show_block($count, $site_ids, $cat_ids, $sort, $images, $images_variation, $tag, $word_exception = array(), $word_exception_insensitive = array(), $word_exception_overlap = array())
              {
              $time = mktime(23, 59, 0, date("m"), date("d"), date("Y"));

              if($sort == 'keywords')
              {
              if($this->diafan->_site->titlemodule)
              {
              $title = $this->diafan->_site->titlemodule;
              }
              else
              {
              $title = $this->diafan->_site->name;
              }
              }
              $where = '';

              //кеширование
              $cache_meta = array(
              "name" => "block",
              "cat_ids" => $cat_ids,
              "site_ids" => $site_ids,
              "count" => $count,
              "lang_id" => _LANG,
              "time" => $time,
              "sort" => $sort.($sort == 'keywords' ? $title : ''),
              "current" => ($this->diafan->_site->module == 'clauses' && $this->diafan->_route->show ? $this->diafan->_route->show : ''),
              "images" => $images,
              "images_variation" => $images_variation,
              "access" => ($this->diafan->configmodules('where_access_element', 'clauses') || $this->diafan->configmodules('where_access_cat', 'clauses') ? $this->diafan->_users->role_id : 0),
              "tag" => $tag,
              );

              if ($sort == "rand" || ! $result = $this->diafan->_cache->get($cache_meta, "clauses"))
              {
              $minus = array();
              $one_cat_id = count($cat_ids) == 1 && substr($cat_ids[0], 0, 1) !== '-' ? $cat_ids[0] : false;
              if(! $this->validate_attribute_site_cat('clauses', $site_ids, $cat_ids, $minus))
              {
              return false;
              }
              $inner = "";
              if($cat_ids)
              {
              $inner = " INNER JOIN {clauses_category_rel} as r ON r.element_id=e.id"
              ." AND r.cat_id IN (".implode(',', $cat_ids).")";
              }
              elseif(! empty($minus["cat_ids"]))
              {
              $inner = " INNER JOIN {clauses_category_rel} as r ON r.element_id=e.id"
              ." AND r.cat_id NOT IN (".implode(',', $minus["cat_ids"]).")";
              }
              $where = '';
              if($site_ids)
              {
              $where .= " AND e.site_id IN (".implode(",", $site_ids).")";
              }
              elseif(! empty($minus["site_ids"]))
              {
              $where .= " AND e.site_id NOT IN (".implode(",", $minus["site_ids"]).")";
              }
              if($sort == 'keywords')
              {
              Custom::inc('includes/searchwords.php');
              $searchwords = new Searchwords();
              $names = $searchwords->prepare($title);
              if(empty($names))
              {
              return false;
              }
              if ((!empty($word_exception_overlap))&&(!empty($names))
              {
              foreach ($word_exception_overlap as $word)
              {
              foreach ($names as $i => $name)
              {
              if (mb_stripos($name,$word) === false) continue;
              $names[$i] = '';
              }
              }
              }
              if ((!empty($word_exception_insensitive))&&(!empty($names))
              {
              foreach ($word_exception_insensitive as $word)
              {
              foreach ($names as $i => $name)
              {
              if (empty($name)) continue;
              if (mb_strtolower($word) === mb_strtolower($name)) $names[$i] = '';
              }
              }
              }
              foreach ($names as $i => $name)
              {
              if (empty($name))||((!empty($word_exception))&&(array_search($name,$names) !== false)) continue;
              $where .= ($i ? " OR ": " AND (")."LOWER(e.[name]) LIKE '%%".$name."%%'";
              }
              $where .= ")";
              }
              if($this->diafan->_site->module == 'clauses' && $this->diafan->_route->show)
              {
              $where .= $where.' AND e.id<>'.$this->diafan->_route->show;
              }
              if($tag)
              {
              $t = DB::query_fetch_array("SELECT id, [name] FROM {tags_name} WHERE [name]='%s' AND trash='0'", $tag);
              if(! $tag)
              {
              return false;
              }
              $inner .= " INNER JOIN {tags} AS t ON t.element_id=e.id AND t.element_type='element' AND t.module_name='clauses' AND t.tags_name_id=".$t["id"];
              }

              if ($sort == "rand")
              {
              $max_count = DB::query_result(
              "SELECT COUNT(DISTINCT e.id) FROM {clauses} as e"
              .$inner
              .($this->diafan->configmodules('where_access_element', 'clauses') ? " LEFT JOIN {access} AS a ON a.element_id=e.id AND a.module_name='clauses' AND a.element_type='element'" : "")
              ." WHERE e.[act]='1' AND e.trash='0' AND e.created<%d"
              .($this->diafan->_site->module == 'clauses' && $this->diafan->_route->show ? " AND e.id<>".$this->diafan->_route->show : '')
              ." AND e.date_start<=%d AND (e.date_finish=0 OR e.date_finish>=%d)"
              .$where
              .($this->diafan->configmodules('where_access_element', 'clauses') ? " AND (e.access='0' OR e.access='1' AND a.role_id=".$this->diafan->_users->role_id.")" : ''),
              $time, $time, $time
              );
              $rands = array();
              for ($i = 1; $i <= min($max_count, $count); $i++)
              {
              do
              {
              $rand = mt_rand(0, $max_count - 1);
              }
              while (in_array($rand, $rands));
              $rands[] = $rand;
              }
              }
              else
              {
              $rands[0] = 1;
              }
              $result["rows"] = array();

              foreach ($rands as $rand)
              {
              switch($sort)
              {
              case "date":
              $order = ' ORDER BY e.created DESC, e.id DESC';
              break;

              case "rand":
              $order = '';
              break;

              default:
              $order = ' ORDER BY e.sort DESC, e.id DESC';
              break;
              }
              $rows = DB::query_range_fetch_all(
              "SELECT e.id, e.[name],e.[anons], e.timeedit, e.site_id, e.created FROM {clauses} AS e"
              .$inner
              .($this->diafan->configmodules('where_access_element', 'clauses') ? " LEFT JOIN {access} AS a ON a.element_id=e.id AND a.module_name='clauses' AND a.element_type='element'" : "")
              ." WHERE e.[act]='1' AND e.trash='0' AND e.created<%d"
              .($this->diafan->_site->module == 'clauses' && $this->diafan->_route->show ? " AND e.id<>".$this->diafan->_route->show : '')
              ." AND e.date_start<=%d AND (e.date_finish=0 OR e.date_finish>=%d)"
              .$where
              .($this->diafan->configmodules('where_access_element', 'clauses') ? " AND (e.access='0' OR e.access='1' AND a.role_id=".$this->diafan->_users->role_id.")" : '')
              ." GROUP BY e.id"
              .$order,
              $time, $time, $time,
              $sort == "rand" ? $rand : 0,
              $sort == "rand" ? 1 : $count
              );

              $result["rows"] = array_merge($result["rows"], $rows);
              }
              $this->elements($result["rows"], array("count" => $images, "variation" => $images_variation));

              // если категория только одна, задаем ссылку на нее
              if (!empty($result["rows"]) && $one_cat_id)
              {
              $cat = DB::query_fetch_array("SELECT [name], site_id, id FROM {clauses_category} WHERE id=%d LIMIT 1", $one_cat_id);

              $result["name"] = $cat["name"];
              $result["link_all"] = $this->diafan->_route->link($cat["site_id"], $cat["id"], 'clauses', 'cat');
              $result["category"] = true;
              }
              // если раздел сайта только один, то задаем ссылку на него
              elseif (!empty($result["rows"]) && count($site_ids) == 1)
              {
              $result["name"] = DB::query_result("SELECT [name] FROM {site} WHERE id=%d LIMIT 1", $site_ids[0]);
              $result["link_all"] = $this->diafan->_route->link($site_ids[0]);
              $result["category"] = false;
              }
              if(! empty($result["rows"]) && $tag)
              {
              $result["name"] .= ': '.$t["name"];
              }
              //сохранение кеша
              if ($sort != "rand")
              {
              $this->diafan->_cache->save($result, $cache_meta, "clauses");
              }
              }
              foreach ($result["rows"] as &$row)
              {
              $this->prepare_data_element($row);
              }
              foreach ($result["rows"] as &$row)
              {
              $this->format_data_element($row);
              }
              return $result;
              }

              5. В заключении пример использования: открываем Ваш site.php и куда-нибудь между тегами <body> ... </body> пишем, например:
              Код
              <insert name="show_block" module="clauses" count="5" sort="date" word_exception="МЕТАЛЛ,вода" word_exception_insensitive="солнце,мыло,колобок" word_exception_overlap="программист,тоже,человек,наверно">

              word_exception - массив строк, которые необходимо исключить из поиска
              word_exception_insensitive - массив строк (регистронезависимых), которые необходимо исключить из поиска
              word_exception_overlap - массив строк (частично совпадающие и регистронезависимые), которые необходимо исключить из поиска

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум