Писать на форуме DIAFAN.CMS могут только зарегистрированные пользователи. Войдите или зарегистрируйтесь.
Всего найдено: 1415
-
13 ноября 2016 г. , редакция: 1478992710
-
Вопрос цены. Все это мной давно уже сделано и соответствующие дополнения работают у клиентов. Сейчас компоную сборник дополнений к diafan.cms, в который войдут и другие "примочки". После модерации он возможно будет доступен для желающих.ЦитатаВИТАЛИЙ (NVGPRO) соскочил...
-
-
-
-
05 ноября 2015 г. , редакция: 1446675621
-
ЦитатаВиталий, на Вас)) надежда. Никто так и не подсказал, как вывести суммарное количество по характеристикам товара.Если это действительно сложно, то черт с ним - буду руками править available.
Но мне кажется, что нужно просто больше знать, чем я - у опытного пользователя есть подсказка ))) Заранее - Спасибо.
Эдуард (admin@gravity), я конечно не Виталий (DIAFAN.CMS), но все же:
откройте редактором файл shop.yandex.php и в функциюпосле строчкиКодprivate function get_offers() { ... }
просто вставьте этуКод$cbid = ! empty($yandex["cbid"]) ? $yandex["cbid"] : $this->diafan->configmodules('cbid', 'shop', $site_id);
Кодif ($price <= 0) continue;
Фуууф, устал. Больше кодить не надо, все задачи решились сами собой.
Теперь поясняю:
1. Товаров с ценой === 0 не будет.
2. По правилам yandex.market в yml-файле больше одного товара с одинаковым названием не должно быть. Поэтому shop.yandex.php, когда генерит товары, то не выдает кресло (цвет - розовый) 10 руб., кресло (цвет - малиновый) 11 руб., а выдает только один раз - кресло 10 руб. При этом выбирается наилучшая цена. За то ответит функцияКод$prices = $this->diafan->_shop->price_get_all($row["id"], 0);
Вывод: Вам не требуется, т.к. если он есть, то он обязательно будет ЕСТЬ.Цитатаподсчитать в ней суммарное количество по каждому выводимому товару (что бы запретить присваивать цену 0 , если товар есть в одной из характеристик)
Александр Биг Эпл (ba5), Ваш вариант хорош, но не для shop.yandex.php,
т.к. shop.yandex.php не включает в себя ни shop.php, ни shop.model.php, ни shop.view.buy_form.php (и вообще он не подвержен кастомизации, хотя это уточнение я привел только для информации). Поэтому Эдуард (admin@gravity) Вас и не понял, т.к. Вы (я полагаю) предлагали ему действовать по аналогии. -
-
-
-
07 ноября 2015 г. , редакция: 1446901054
-
ЦитатаМожет Вы предложите более изящный код))))))))))))
Учитывая, что здесь очень редко, но все же встречаются люди которые любят копи-пастить и не задумываться, то приведу полный вариант изменений.
Отмечу, Эдуард (admin@gravity) это я не о Вас.
И так, берем и открываем редактором файл /modules/shop/inc/shop.inc.price.php и с функциейКодpublic function get_all($good_id, $current_user = true) { ... }
тварим следующее: в место строчкиКод$this->cache["all"][$g_id] = array_merge($r_not_null, $r_null);
пишем следующее:Код
$c_not_null = array();
$c_null = array();
foreach ($r_not_null as $val)
{
if ($val["count_goods"])
{
$c_not_null[] = $val;
}
else{
$c_null[] = $val;
}
}
$this->cache["all"][$g_id] = array_merge($c_not_null, $c_null, $r_null);
Далее как я ранее говорил, открываем редактором файл /modules/shop/shop.yandex.php и в функциюКодprivate function get_offers() { ... }
после строчкиКод$cbid = ! empty($yandex["cbid"]) ? $yandex["cbid"] : $this->diafan->configmodules('cbid', 'shop', $site_id);
вставляем этуКодif ($price <= 0) continue;
Вот и все, теперь самое главное: СБРОСТИ КЕШ
А теперь лирика. Этими изменениями мы добились следующего:
теперь в yandex.market не будут попадать товары равные нулю, а будут попадать товары с минимальной ценой. При этом будет учитываться количество товара. Т.е. раньше мог попасть товар с меньшей ценой, но с количеством равном нулю, то теперь этого не будет. Важно, если у товара вообще нет количества ни при одной из зависимых характеристик, то выбран будет товар с наименьшей ценой.ЦитатаРешил свою проблемму - сложил все количества характеристик
$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"];Цитата$total=0;
for($n=0; $jn<20; $jj++)
{$total=$total+$prices[$n]["count_goods"];
}
Для меня это слишком круто. Эдуард (admin@gravity), я не в коем случае не говорю Вам делать так, как я написал (у всех свой подход). Но Ваш подход на мой взгляд ошибочен (если Вам будет интересно, то могу доказать) -
-
-
-
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 г. , редакция: 1446132019
-
Андрей (xformer), к сожалению все препоны (coockes, ip, и др. доп. информация о госте) по защите от накруток можно легко обойти, советую не заморачиваться и не тратить время. Хотя если вы организуете голосование с привязкой к номеру телефона (с помощью обратного смс подтверждения) с последующей фиксацией паспортных данных, то приблизитесь к решению своей задачи. А так достаточно и стандартных средств cms.diafan
-
-
-
-
29 октября 2015 г.
-
Есть у меня вопрос (не по теме). Таблица {sessions}. Сюда заносится инфа, но если ddos, то эта таблица станет занимать уйму места. Соответственно MySQL, если он не на выделенном сервере, начнет тормозить. Соответственно cms начнет тормозить. На этот счет я сделал автоматическую очистку этой таблицы (добавил эту возможность в админку).
Т.е. не нашел такой вещички в cms, поэтому и сделал. Так вот вопрос, может я опять где поленился и не заметил, что эта процедура также предусмотрена в cms.diafan? -
-
-
-
29 октября 2015 г. , редакция: 1446138020
-
Владимир (voha2006), спасибо. Возможно, слово "нет" Вы не так поняли, я в ответе написал название пункта меню (выпадающей список "Защита от накруток"), которое мне указал Виталий (DIAFAN.CMS)А затем я лишь перечислил варианты этого менюЦитатаВ настройках модуля опросы.Цитатанет, вести лог и запрещать голосовать повторно
По умолчанию в cms стоит: запрещать голосовать повторно. Поэтому и не обращал свое внимание на то, какие варианты там еще имеются.
Т.е. я написал название пункта меню и варианты его значений лишь для того, чтобы если этот пост будет читать такой же лентяй как я то, чтобы он сразу понял где искать в настройке модуля. Но а Вы еще и картинку прикрепили. Так что теперь уж наверняка всем понятно. -
-
-
-
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. открыть скачанный файл, чтобы увидеть пример будущего импорта.
Совет, перед импортом всегда сохраняйте резервную копию сайта (в том числе базу данных) -
-
-
-
28 октября 2015 г. , редакция: 1445983814
-
Вам скорее всего сюда http://pro.user.diafan.ru/, но можете и сами разобраться. Если сами, то Вам сюда http://www.diafan.ru/dokument/. А если нет желания читать, то Вам сюда http://www.diafan.ru/dokument/videouroki/. Успехов в начинании!
-
-
-
-
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 марта, вторник
-
Мы обновили систему тарифов, учитывая опыт работы с клиентами и современные рыночные условия. Новая тарифная сетка разработана специально для того, чтобы лучше отвечать вашим потребностям. Резкого повышения цен не произошло. Более того, некоторые тарифы даже стали выгоднее и доступнее.
-
17 января
-
В преддверии 2025 года была выпущена сборка 7.2.5, которая не приносит радикальных изменений в функциональности, но способствует повышению стабильности работы системы и расширению возможностей облачного сервиса для создания сайтов.
-
18 июня 2024 г.
-
В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
Блоги
-
24.04.2024
-
Выпустили новую сборку DIAFAN.CMS 7.1.4.
Блоги
-
12.01.2024
-
В данном руководстве познакомим вас с панелью управления DIAFAN.CMS