Писать на форуме DIAFAN.CMS могут только зарегистрированные пользователи. Войдите или зарегистрируйтесь.
Всего найдено: 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 г. , редакция: 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 октября 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 уже доступна к установке.
Блоги
-
24.04.2024
-
Выпустили новую сборку DIAFAN.CMS 7.1.4.
Блоги
-
12.01.2024
-
В данном руководстве познакомим вас с панелью управления DIAFAN.CMS