Skip to content

Commit a12e181

Browse files
authored
Merge pull request #153 from dle-modules/5.1.2
Исправления и улучшения
2 parents de4406c + 79e7ea7 commit a12e181

File tree

6 files changed

+126
-66
lines changed

6 files changed

+126
-66
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# DLE-BlockPro — тот самый модуль для вывода новостей!
2-
![version](https://img.shields.io/badge/version-5.1.0-red.svg?style=flat-square "Version")
2+
![version](https://img.shields.io/badge/version-5.1.2-red.svg?style=flat-square "Version")
33
![DLE](https://img.shields.io/badge/DLE-10.x-green.svg?style=flat-square "DLE Version")
44
[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/dle-modules/DLE-BlockPro/blob/master/LICENSE)
55

6-
- **ВНИМАНИЕ!** **Работа модуля в кодировке windows-1251 не гарантируется**, не проверялась и проверяться когда-либо автором модуля не будет. Техническая поддержка кодировки windows-1251 оказывается с наименьшим приоритетом и только при наличии желания и времени. Это принципиальная позиция и меняться не будет. Рекомендуется [переходить на нормальную кодировку сайта](https://github.com/pafnuty/DLE-Charset-Converter)
6+
- **ВНИМАНИЕ!** **Работа модуля в кодировке windows-1251 не гарантируется**
77
- Краткая информация о шаблонных тега прописана в шаблоне **{THEME}/blockpro/blockpro.tpl**, расширенный пример **{THEME}/blockpro/fullexample.tpl**
88
- Более детальная информация по используемому шаблонизатору модуля находится в [документации по шаблонизатору](https://github.com/bzick/fenom/blob/master/docs/ru/readme.md)
99
- Официальный сайт: [bp.pafnuty.name](http://bp.pafnuty.name/)

blockpro.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@
155155

156156

157157
// Выводим результаты работы модуля в виде js-строки
158+
/** @var string $printOutput */
158159
echo $printOutput;
159160

160161
} else {

blockpro_install.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
// Описание модуля, для установщика и админки.
1616
'moduleDescr' => 'Модуль вывода новостей для DLE',
1717
// Версия модуля, для установщика
18-
'moduleVersion' => '5.1.0',
18+
'moduleVersion' => '5.1.2',
1919
// Дата выпуска модуля, для установщика
20-
'moduleDate' => '25.10.2018',
20+
'moduleDate' => '16.05.2019',
2121
// Версии DLE, поддержваемые модулем, для установщика
2222
'dleVersion' => '10.x',
2323
// ID групп, для которых доступно управление модулем в админке.

engine/inc/blockpro.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
define('MODULE_DIR', ENGINE_DIR . '/modules/base/admin/blockpro/');
3030

3131
$moduleName = 'blockpro';
32-
$moduleVersion = '5.1.0';
32+
$moduleVersion = '5.1.2';
3333

3434
$moderate = $_REQUEST['moderate'];
3535
$moderate_checked = ($moderate) ? 'checked' : '';

engine/modules/base/blockpro.php

Lines changed: 19 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@ classic: << Первая < 1 [2] 3 > Последняя >>
159159
// Символьные коды для исключающей фильтрации по символьному каталогу. Перечисляем через запятую или пишем this для текущего символьного кода
160160
'fields' => !empty($fields) ? $fields : false,
161161
// Дополнение к выборке полей из БД (p.field,e.field)
162+
// setFilter=p.full_story|SEARCH|dle_media_begin|OR|p.full_story|SEARCH|dle_video_begin
163+
// setFilter=e.news_read|+|100||p.comm_num|-|20
162164
'setFilter' => !empty($setFilter) ? $setFilter : '',
163165
// Собственная фильтрация полей БД
164166
'experiment' => !empty($experiment) ? $experiment : false,
@@ -186,7 +188,12 @@ classic: << Первая < 1 [2] 3 > Последняя >>
186188
}
187189
}
188190

191+
// Сохраняем текущее значение переменной, если она задана (fix #142)
192+
$startCacheNameAddon = $cfg['cacheNameAddon'];
193+
189194
$cfg['cacheNameAddon'] = [];
195+
$cfg['cacheNameAddon'][] = $startCacheNameAddon;
196+
190197
// Если имеются переменные со значениями this, изменяем значение переменной cacheNameAddon
191198
if ($cfg['catId'] == 'this') {
192199
$cfg['cacheNameAddon'][] = $category_id . 'cId_';
@@ -383,69 +390,13 @@ classic: << Первая < 1 [2] 3 > Последняя >>
383390
$arFilter[] = $base->cfg['setFilter'];
384391
}
385392

393+
386394
if (!empty($arFilter)) {
387395
foreach ($arFilter as $strItem) {
388-
$arFItem = explode('|', $strItem, 3);
389-
390-
$field = $arFItem[0];
391-
$operator = '';
392-
393-
// Т.к. DLE не позволяет передавать напрямую символы '>' и '<', приходится изобретать собственный велосипед.
394-
switch ($arFItem[1]) {
395-
case '-':
396-
case 'lt':
397-
$operator = ' < ';
398-
break;
399-
400-
case '+':
401-
case 'gt':
402-
$operator = ' > ';
403-
break;
404-
405-
case '=':
406-
case 'eq':
407-
$operator = ' = ';
408-
break;
409-
410-
case '+=':
411-
case 'gte':
412-
$operator = ' >= ';
413-
break;
414-
415-
case '-=':
416-
case 'lte':
417-
$operator = ' <= ';
418-
break;
419-
420-
case '+-':
421-
case '-+':
422-
case 'not':
423-
$operator = ' != ';
424-
break;
425-
426-
case 'SEARCH':
427-
$operator = ' LIKE ';
428-
break;
429-
430-
case 'NOT_SEARCH':
431-
$operator = ' NOT LIKE ';
432-
break;
433-
}
396+
$queryItem = $base->prepareFilterQuery($strItem);
434397

435-
if ($arFItem[2] == 'NOW()') {
436-
// Если нужно отобрать "сейчас"
437-
$itemVal = 'NOW()';
438-
} elseif ($arFItem[1] == 'SEARCH' || $arFItem[1] == 'NOT_SEARCH') {
439-
// Реализация поиска
440-
$itemVal = $base->db->parse('?s', '%' . $arFItem[2] . '%');
441-
} else {
442-
// В противном случае фильтруем.
443-
$_op = (is_numeric($arFItem[2])) ? '?i' : '?s';
444-
$itemVal = $base->db->parse($_op, $arFItem[2]);
445-
}
446-
447-
if ($operator !== '') {
448-
$wheres[] = $field . $operator . $itemVal;
398+
if($queryItem) {
399+
$wheres[] = $queryItem;
449400
}
450401

451402
}
@@ -840,6 +791,11 @@ classic: << Первая < 1 [2] 3 > Последняя >>
840791

841792
$bodyToRelated = $base->db->parse('?s', strip_tags($relatedBody['title'] . ' ' . $bodyToRelated));
842793

794+
// Добавляем улучшенный алгоритм поиска похожих новостей из DLE 13
795+
$ext_query_fields .= ', MATCH (p.title, p.short_story, p.full_story, p.xfields) AGAINST (' . $bodyToRelated . ') as score';
796+
$orderArr = ['score'];
797+
798+
// Формируем условие выборки
843799
$wheres[] = 'MATCH (' . $relatedRows . ') AGAINST (' . $bodyToRelated . ') AND id !=' . $relatedBody['id'];
844800
}
845801
} else {
@@ -1193,6 +1149,7 @@ classic: << Первая < 1 [2] 3 > Последняя >>
11931149
}
11941150

11951151
// Обрабатываем вложения
1152+
/** @var $base */
11961153
if ($base->dle_config['files_allow']) {
11971154
if (strpos($output, '[attachment=') !== false) {
11981155
$output = show_attach($output, $attachments);
@@ -1208,6 +1165,7 @@ classic: << Первая < 1 [2] 3 > Последняя >>
12081165
}
12091166

12101167
// Результат работы модуля
1168+
/** @var boolean $external */
12111169
if (!$external) {
12121170
// Если блок не является внешним - выводим на печать
12131171
if (count($outputLog['errors']) > 0) {
@@ -1236,5 +1194,6 @@ classic: << Первая < 1 [2] 3 > Последняя >>
12361194
$mem_usg = (function_exists('memory_get_peak_usage')) ? '<br>Расход памяти: <b>' . round(memory_get_peak_usage() / (1024 * 1024), 2) . 'Мб </b>' : '';
12371195
// Вывод статистики
12381196
/** @var integer $start */
1197+
/** @var string $dbStat */
12391198
echo '<div class="bp-statistics" style="border: solid 1px red; padding: 5px; margin: 5px 0;">' . $dbStat . 'Время выполнения скрипта: <b>' . round((microtime(true) - $start), 6) . '</b> c.' . $mem_usg . '</div>';
12401199
}

engine/modules/base/core/base.php

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,106 @@ public function getRand($from = 1, $to = 2000, $count = 15) {
336336
return $arNumbers;
337337
}
338338

339+
/**
340+
* Получаем готовую строку для вставки в запрос из условий фильтрации
341+
*
342+
* Пример использования в строке подключения
343+
* setFilter=p.full_story|SEARCH|text1|OR|p.full_story|SEARCH|text2
344+
*
345+
* @param string $setFilterStr строка с условиями фильтрации
346+
*
347+
* @return string Строка для использования в качестве части заброса в БД
348+
*/
349+
public function prepareFilterQuery($setFilterStr='') {
350+
if(!$setFilterStr || $setFilterStr === '') {
351+
return false;
352+
}
353+
354+
// Разбиваем строку на условия "OR", если есть.
355+
$filterItems = explode('|OR|', $setFilterStr);
356+
357+
358+
$hasOrCondition = count($filterItems) > 1;
359+
360+
$queryParts = [];
361+
362+
foreach ($filterItems as $strItem) {
363+
364+
// Разбиваем на части запроса
365+
$arFItem = explode('|', $strItem, 3);
366+
367+
$field = $arFItem[0];
368+
$operator = '';
369+
370+
// Т.к. DLE не позволяет передавать напрямую символы '>' и '<', приходится изобретать собственный велосипед.
371+
switch ($arFItem[1]) {
372+
case '-':
373+
case 'lt':
374+
$operator = ' < ';
375+
break;
376+
377+
case '+':
378+
case 'gt':
379+
$operator = ' > ';
380+
break;
381+
382+
case '=':
383+
case 'eq':
384+
$operator = ' = ';
385+
break;
386+
387+
case '+=':
388+
case 'gte':
389+
$operator = ' >= ';
390+
break;
391+
392+
case '-=':
393+
case 'lte':
394+
$operator = ' <= ';
395+
break;
396+
397+
case '+-':
398+
case '-+':
399+
case 'not':
400+
$operator = ' != ';
401+
break;
402+
403+
case 'SEARCH':
404+
$operator = ' LIKE ';
405+
break;
406+
407+
case 'NOT_SEARCH':
408+
$operator = ' NOT LIKE ';
409+
break;
410+
}
411+
412+
413+
if ($arFItem[2] == 'NOW()') {
414+
// Если нужно отобрать "сейчас"
415+
$itemVal = 'NOW()';
416+
} elseif ($arFItem[1] == 'SEARCH' || $arFItem[1] == 'NOT_SEARCH') {
417+
// Реализация поиска
418+
$itemVal = $this->db->parse('?s', '%' . $arFItem[2] . '%');
419+
} else {
420+
// В противном случае фильтруем.
421+
$_op = (is_numeric($arFItem[2])) ? '?i' : '?s';
422+
$itemVal = $this->db->parse($_op, $arFItem[2]);
423+
}
424+
425+
if ($operator !== '') {
426+
$queryParts[] = $field . $operator . $itemVal;
427+
}
428+
}
429+
430+
$strAueryPart = implode(' OR ', $queryParts);
431+
432+
if ($hasOrCondition) {
433+
$strAueryPart = '(' . $strAueryPart . ')';
434+
}
435+
436+
return $strAueryPart;
437+
}
438+
339439

340440
} // base Class
341441

@@ -352,7 +452,7 @@ function formateDate($date, $_f = false) {
352452
global $lang, $config, $langdate;
353453

354454
if (!$lang['charset']) {
355-
@include_once ROOT_DIR . '/language/' . $config['langs'] . '/website.lng';
455+
include_once(DLEPlugins::Check(ROOT_DIR . '/language/' . $config['langs'] . '/website.lng'));
356456
}
357457

358458
$date = strtotime($date);

0 commit comments

Comments
 (0)