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

Всего найдено: 1412

  • 08 ноября 2015 г. , редакция: 1446935522
  • Лично меня смущает как Вы подсчитываете количество.
    Цитата

    $jkk=$prices[0]["count_goods"]+$prices[1]["count_goods"]+$prices[2]["count_goods"]+$prices[3]["count_goods"]+$prices[4]["count_goods"]+$prices[5]["count_goods"]+$prices[6]["count_goods"];

    Этот код не годится, т.к. в нем нет универсальности, которая бы не зависела от количества разновидностей товара (здесь под разновидностями я подразумеваю характеристики товара, которые влияют на цену и могут иметь свое значение, означающее количество товара с такай характеристикой), т.е. во всех товарах должно быть 7 разновидностей. Если включите режим разработчика, то увидите ошибки php, когда у товара будет меньше или больше 7 разновидностей.
    Цитата

    $total=0;
    for($n=0; $jn<20; $jj++)
    {$total=$total+$prices[$n]["count_goods"];
    }

    Этот код вообще уйдет в "петлю" (зацикливание) и вернется от туда только благодаря предусмотрительности разработчиков php и веб-серверов (уточню, под веб-сервером подразумеваю apache, и т.п., но не железо), при этом вернет результат равный количеству товара именно первой разновидности, а не общему количеству всех разновидностей. И почему Вы взяли что будет 20 разновидностей?
    И так, привожу Ваш код без ошибок (сравните самостоятельно)
    Код

    $total = 0; $len = count($prices);
    for($n = 0; $n < $len; $n++)
    {
    $total += $prices[$n]["count_goods"];
    }

    Аналогично можно так (даже лучше это делать с массивом именно так)
    Код

    $total=0;
    foreach ($prices as $val)
    {
    $total += $val["count_goods"];
    }

    Это я сообщил свое мнение о Вашем коде, теперь о стратегии: на мой взгляд нет надобности в получении общего количества, но если Вам это необходимо, то делайте (это частный случай). Если так делать без надобности, то с такой политикой будите попросту тратить процессорное время, что приведет к увеличению времени загрузки пользователем вашего ресурса.
    Кстати
    Цитата

    вот я и добавляю, что на складе остаток этого товара 2 шт (например)

    Вы выводите количество не именно этого товара, а количество всех разновидностей товара. Если именно этого товара, то подсчет не нужен.
    Цитата
    Если ответите то в общих чертах, - не хочу больше отнимать у Вас время.

    Конечно отвечу. И сделаю это потому, что Вам интересно не заниматься бездумным копированием, а интересоваться и размышлять. И если хотите развиваться, то задумайтесь самостоятельно, в чем разница между этим кодом
    Код

    $total = 0; $len = count($prices);
    for($n = 0; $n < $len; $n++)
    {
    $total += $prices[$n]["count_goods"];
    }

    и этим
    Код

    $total = 0;
    for($n = 0; $n < count($prices); $n++)
    {
    $total += $prices[$n]["count_goods"];
    }

    Второй код постоянно встречается во всех мануалах и теоретически правильный, но первый лучше. Почему?
  • 31 октября 2015 г. , редакция: 1446290879
  • Как вариант, внедрить на страницу производителя форму поиска по товарам и с помощью css выключить отображение выбора производителей, т.к. там уже будет определен этот производитель (определение производителя конечно будет автоматическим). Т.е. в форме поиска по товаром все тоже, но без выбора производителя, т.к. он уже определен.
  • 30 октября 2015 г. , редакция: 1446174987
  • Цитата
    Что из выше перечисленного реализуемо из коробки

    Все что реализуемо из коробки, Вы видели в демо-версии http://demo.cms.diafan.ru/
    Остальное необходимо делать, т.е. из поставленных Вами четырех вопросов нужно так или иначе потрудится над каждым.
    Цитата
    что нужно допилить

    Корректировать необходимо модули - shop, cart
    Цитата
    насколько много пилить, дорабатывать, переделывать

    зависит от того, будут ли от Вас еще хотелки, и кто их будет исполнять.
    Из того, что Вы перечислили, особо сложного нет. Но бесплатно выкладывать код корректировок и километр комментариев, что и куда надо вставить, здесь едва ли кто-то станет.
  • 29 октября 2015 г. , редакция: 1446116325
  • Если принять во внимание, что раньше все было Ок и настройки системы не меняли, то это не фаервол. Думаю надо проверить на хосте папку, которая используется для временных файлов (в том числе для закачки), также папку tmp, которую использует сама cms. Также необходимо проверить таблицу, которая используется cms под хранение адресов картинки. Также проверить хост на предмет переполнения и ограничений на объем закачек. А вообще, если делать как правильно, надо начать с логов хоста. Чаще всего логи говорят сами за себя, а так это гадание на кофейной гуще
  • 29 октября 2015 г.
  • Хотел уточнить, Виталий (DIAFAN.CMS),
    cms и так ведет лог, записывая данные в таблицу {sessions}, но если я правильно понял, Вы сказали:
    Цитата
    Если включить "Вести лог", то еще и ip.

    А где именно в админке эта галочка? (я просто такой функции раньше не замечал от cms)
  • 29 октября 2015 г. , редакция: 1446132019
  • Андрей (xformer), к сожалению все препоны (coockes, ip, и др. доп. информация о госте) по защите от накруток можно легко обойти, советую не заморачиваться и не тратить время. Хотя если вы организуете голосование с привязкой к номеру телефона (с помощью обратного смс подтверждения) с последующей фиксацией паспортных данных, то приблизитесь к решению своей задачи. А так достаточно и стандартных средств cms.diafan
  • 29 октября 2015 г.
  • Есть у меня вопрос (не по теме). Таблица {sessions}. Сюда заносится инфа, но если ddos, то эта таблица станет занимать уйму места. Соответственно MySQL, если он не на выделенном сервере, начнет тормозить. Соответственно cms начнет тормозить. На этот счет я сделал автоматическую очистку этой таблицы (добавил эту возможность в админку).
    Т.е. не нашел такой вещички в cms, поэтому и сделал. Так вот вопрос, может я опять где поленился и не заметил, что эта процедура также предусмотрена в cms.diafan?
  • 29 октября 2015 г. , редакция: 1446138020
  • Владимир (voha2006), спасибо. Возможно, слово "нет" Вы не так поняли, я в ответе написал название пункта меню (выпадающей список "Защита от накруток"), которое мне указал Виталий (DIAFAN.CMS)
    Цитата
    В настройках модуля опросы.
    А затем я лишь перечислил варианты этого меню
    Цитата
    нет, вести лог и запрещать голосовать повторно

    По умолчанию в cms стоит: запрещать голосовать повторно. Поэтому и не обращал свое внимание на то, какие варианты там еще имеются.
    Т.е. я написал название пункта меню и варианты его значений лишь для того, чтобы если этот пост будет читать такой же лентяй как я то, чтобы он сразу понял где искать в настройке модуля. Но а Вы еще и картинку прикрепили. Так что теперь уж наверняка всем понятно.
  • 29 октября 2015 г. , редакция: 1446142266
  • Секрета нет, простое определение количества записей. Затем при превышении определенного значения происходит обращение к таблице с запросом удаления старых записей до достяжения определенного их количества (т.е. не всех)
  • 13 ноября 2015 г. , редакция: 1447416614
  • Цитата
    Ща, цены поднимем, подумаем

    А почему именно в таком порядке, а не
    Цитата
    Ща, подумаем, цены поднимем

    Хотя все равно будет результат
    Цитата
    цены поднимем

    Поэтому первую итерацию можно исключать, бережем время
  • 28 октября 2015 г. , редакция: 1446043325
  • Полагаю, что нужно просто проверить как заносятся записи в таблицу {shop_price}. Скорее всего (не проверял, но предполагаю исходя из выше сказанного) при пересчете старые значения не удаляются в таблице. А при редактировании товара (т.е. при сохранении), запускается процедура удаление всех записей цены этого товара и далее запись новых цен. Вот и ответ, почему после пересохранения все ОК
  • 28 октября 2015 г.
  • http://www.diafan.ru/dokument/full-manual/modules/shop/#Import/eksport-YA.Market
    1. зайти в административную часть сайта
    2. меню каталог
    3. закладка импорт/экспорт
    4. добавить описание файла импорта/экспорта - тип товары
    5. зайти в созданный импорт/экспорт
    6. Добавить поле - тип Имена изображений, в этом поле добавить дополнительный разделитель (любой символ)
    7. сохранить все, перейти на закладку товары
    8. создать товар и добавить картинку к товару с указанием title и alt (картинки конечно)
    9. зайти на закладку импорта/экспорта и выбрать ранее сохраненное описание импорта/экспорта товаров.
    10. внизу страницы кликнуть по ссылки скачать файл экспорта
    11. открыть скачанный файл, чтобы увидеть пример будущего импорта.
    Совет, перед импортом всегда сохраняйте резервную копию сайта (в том числе базу данных)
  • 27 октября 2015 г.
  • Конечно за компанию все готовы посмеяться. Но Вы же профи, объяснили бы Николаю в чем он ошибается. Это конечно трудно, т.к. разговор пока на разных языках. Но главное в другом - интерес отбить лего, а заполучить его сложно.
  • 26 октября 2015 г. , редакция: 1445811762
  • Одной переменной не обойтись, как минимум итерации сравнения будут нужны. Способов в общем-то много, но если выбирать то Вам необходимо править shop.model.php (т.е. отбрасывать такие параметры еще на стадии формирования). Если как Вы, то shop.view.buy_form.php (практически тоже при необходимости в shop.view.buy_form_list.php) + javascript (в общем путь будет дольше).
  • 26 октября 2015 г. , редакция: 1445884990
  • Лично я понял следующую ситуацию:
    1. переходим на demo.cms.diafan.ru
    2. входим в админку, далее каталог, далее закладка товары, берем первый товар с зависимыми характеристиками (например, Рюкзак «Контур 50»)
    3. в указанном товаре две цены которые зависят от цвета, поэтому одну из цен определяем равной = 0 (аналогично при количестве равном 0)
    4. открываем страницу этого товара как посетитель, выбираем характеристику при которой ранее определили цену равной 0 и видим, что купить товар нельзя.
    Так вот, я понимаю, что Эдуард (admin@gravity) хотел бы, что бы при таком варианте не было бы у посетителя выбора, т.е. посетитель видел бы только один вариант, для которого определена цена. Но если сделать именно так, то пользователь не сможет заявить о том, чтобы ему Сообщили, когда появится такой товар на e-mail
  • 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 - массив строк (частично совпадающие и регистронезависимые), которые необходимо исключить из поиска
  • 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 г.
  • А решение которое я привел выше (дополненная функция, которая Генерирует данные для шаблонной функции: блок статей) не подходит. В ней вроде предусмотрены три массива слов:
    1. слова (чувствительные к регистру), которые при полном совпадении должны исключаться
    2. слова (не чувствительные к регистру), которые при полном совпадении должны исключаться
    3. слова (не чувствительные к регистру), которые при частичном совпадении должны исключаться
    Если нужно еще подробней, то эта функция должна быть в файле modules/clauses/clauses.model.php. Или вопрос как ей пользоваться?
  • 25 октября 2015 г. , редакция: 1445789258
  • Решений может быть множество и они зависят от поставленных задач. То, что предлагаете Вы, то это правка функции 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 г.
  • Хорошо, если так, то партнер для меня понятен, а разработчик для Diafan тогда кто? Под этим термином (в данном случае) я понимаю разработчика программного обеспечения, т.е. программиста или я не прав? Этот вопрос для мене важен, так как на данном форуме, когда задают вопрос программисты, то я понимаю, что их интересует не программный код, а оптимальный алгоритм или сторонний опыт (т.к. код они и так сами напишут). Так вот главный вопрос: мне необходимо было не растекаться по древу, а без лишних слов написать примерно 20-30 строк программного кода и сообщить, где их надо разместить? Привожу пример (https://user.diafan.ru/forum/show2782/#24144), здесь "николай (111111)" спрашивает: в модуле статьи есть тип сортировки кейвордс, мне надо сделать чтоб я мог добавлять слова исключения в него ... Одновременно он добавляет, что "в пшп не понимаю ничего". Без слов я привел полный пример дополненной функции, которая генерирует данные для шаблонной функции: блок статей. После этого "николай (111111)" дословно ответил, что он и так сам разобрался.
    Так вот это меня и смущает когда задают вопрос то, чего хотят услышать?
Показывать по:

Новости

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

Форум