dle-modules / DLE-BlockPro

Модуль вывода новостей для DLE
http://bp.pafnuty.name/
MIT License
13 stars 14 forks source link

Вывод новостей по тегам работает некорректно #160

Closed makey2 closed 4 years ago

makey2 commented 4 years ago

Ошибка заключается в том, что выводятся 10 новостей из указанной категории, а не сообщение об ошибке (если тегов совпадающих нет). Ощущение, что кешируется, т.к. в разных шаблонах и страницах одинаковые статьи выводятся. Кеш отключен на сайте. Версия DLE 12.1 Версия PHP: 7.3.11

Вывод строкой: {include file="engine/modules/base/blockpro.php?nocache=y&catId=663&tags={news-id}"} и {include file="engine/modules/base/blockpro.php?template=blockpro/faq&nocache=y&catId=49&tags={news-id}&sort=none"} Теги совпадают с ID новости.

Шаблоны: -----1-------

{foreach $list as $el}
<div class="faq">
  <div class="avtor"> {$el.autor}</div>
    <div class="title">{$el.title}</div>
    <div>{$el.short_story}</div> 
       <div class="splLink"> ответ</div>
  <div class="splCont otvet">{$el.full_story}</div> 
</div>
     {foreachelse}
        {*Если новостей нет - выведем информацию об этом*}
        <p>Вопросов еще нет.</p>
{/foreach}

------2------

{foreach $list as $el}
        <article class="port">
<div class="title"> {$el.title}</div>
            <div class="detali">
            {if $el.allow_edit}
                {* allow_edit - проверка на доступность редактирования *}
                <a href="#" {$el.editOnclick}>[редактировать]</a> <br>
            {/if}   

{set $el.short_story = str_replace("src=", "class=\"b-lazy\" data-src=", $el.short_story)}  
{$el.short_story = str_replace(" class=\"fr-dii\"", "", $el.short_story)}       
            {if $el.xfields.prichina}
                <span class="quote prichina">{$el.xfields.prichina}</span>                      
            {/if}
{$el.full_story}
<span class="data"> <a href="/{$el.date|dateformat:"Y/m/d"}/" rel="nofollow">{$el.date|dateformat:"d F Y"}</a></span>           
        </div></article> 
    {foreachelse}
        {*Если новостей нет - выведем информацию об этом*}
        <p>Работы еще не добавлены</p>
    {/foreach}
Запрос(ы):
[1] SELECT news_id FROM dh_tags WHERE tag regexp "[[:<:]](4795)[[:>:]]"
[1 время:] 5.9843063354492E-5
[2] SELECT p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.category, p.alt_name, p.allow_comm, p.comm_num, p.fixed, p.allow_main, p.symbol, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.related_ids, e.view_edit, e.editdate, e.editor, e.reason FROM dh_post p LEFT JOIN dh_post_extras e ON (p.id=e.news_id) WHERE approve AND category regexp "[[:<:]](49)[[:>:]]" LIMIT 0, 10
[2 время:] 7.8916549682617E-5
[3] SELECT news_id FROM dh_tags WHERE tag regexp "[[:<:]](4795)[[:>:]]"
[3 время:] 6.3896179199219E-5
[4] SELECT p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.category, p.alt_name, p.allow_comm, p.comm_num, p.fixed, p.allow_main, p.symbol, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.related_ids, e.view_edit, e.editdate, e.editor, e.reason FROM dh_post p LEFT JOIN dh_post_extras e ON (p.id=e.news_id) WHERE approve AND category regexp "[[:<:]](663)[[:>:]]" LIMIT 0, 10
[4 время:] 9.8943710327148E-5
Время выполнения запросов: 0.00030159950256348
Время выполнения скрипта: 0.001503 c.
Расход памяти: 5.03Мб 
pafnuty commented 4 years ago

@makey2 Выглядит так, как будто по первому запросу, отбирающему новости по тегам, не находятся никакие ID По крайней мере судя по логу запросов. Получается, что имя тега у вас должно совпадать с ID новости, но либо не совпадает, либо таких новостей нет.

Вот тут реализована логика отбора новостей по тегу. https://github.com/dle-modules/DLE-BlockPro/blob/5fcb7d5d3b362c5cf1e89fc1377fec14bbfccd62/engine/modules/base/blockpro.php#L746-L751

makey2 commented 4 years ago

@pafnuty Да, действительно. Сам запутался и Вас запутываю... Простите!!! Причина такого поведения была закомментированная, мной строчка "$wheres[] = ...." Но комментировал ее не ради развлечений. Ищу причину странности. Из одной категории выбор по тегам работает правильно. Если есть такая новость (тег совпал с ID) - показывает анонс, если нет тега - сообщение. Все так как и должно быть, но вот с другой категорией совсем не так. Если есть тег равный ID - показывает анонс новости правильно, в противном случае вместо сообщения выводит из указанной категории "первые попавшиеся" согласно сортировке. При этом блок статистика не появляется.

Единственное, что отличает: в первом случае по одному тегу к новости, а во втором может быть несколько (т.е. ID новостей, где должен показываться анонс).

pafnuty commented 4 years ago

@makey2 Т.е. получается, если несколько тегов у новости, то она не выводится? Попробуйте изменить порядок тегов или оставить один тег, что бы исключить/подтвердить это предположение.

makey2 commented 4 years ago

@pafnuty Поймал! Дело не в категории!!! Очистил в новостях одной категории все теги. На страницах, где одно подключение blockpro с поиском в этой категории, вместо сообщения об ошибке (не найдена новость) появился список из 10 анонсов новостей. На нескольких страницах два подключения blockpro. При условии, что хотя бы по одному найден тег, проблем со вторым подключением не возникает (есть сообщение, что новость не найдена)! Если ни по одному подключению нет тега, то оба выдают по 10 анонсов (сортировка по умолчанию) вместо сообщения.

Если одно подключение и нет тега (список вместо сообщения):

Запрос(ы):
[1] SELECT news_id FROM `dh_tags` WHERE tag regexp "[[:<:]](4945)[[:>:]]"
[1 время:] 9.0837478637695E-5
[2] SELECT p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.category, p.alt_name, p.allow_comm, p.comm_num, p.fixed, p.allow_main, p.symbol, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.related_ids, e.view_edit, e.editdate, e.editor, e.reason FROM `dh_post` p LEFT JOIN `dh_post_extras` e ON (p.id=e.news_id) WHERE approve AND category regexp "[[:<:]](49)[[:>:]]" ORDER BY fixed DESC, e.rating DESC, p.comm_num DESC, e.news_read DESC LIMIT 0, 10
[2 время:] 0.00011491775512695
Время выполнения запросов: 0.00020575523376465
Время выполнения скрипта: 0.010689 c.
Расход памяти: 5.96Мб 

Если 2 подключения и по обоим нет тега (списки вместо сообщений):

Запрос(ы):
[1] SELECT news_id FROM `dh_tags` WHERE tag regexp "[[:<:]](4795)[[:>:]]"
[1 время:] 6.6995620727539E-5
[2] SELECT p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.category, p.alt_name, p.allow_comm, p.comm_num, p.fixed, p.allow_main, p.symbol, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.related_ids, e.view_edit, e.editdate, e.editor, e.reason FROM `dh_post` p LEFT JOIN `dh_post_extras` e ON (p.id=e.news_id) WHERE approve AND category regexp "[[:<:]](49)[[:>:]]" ORDER BY fixed DESC, e.rating DESC, p.comm_num DESC, e.news_read DESC LIMIT 0, 10
[2 время:] 0.0049939155578613
Время выполнения запросов: 0.0050609111785889
Время выполнения скрипта: 0.014418 c.
Расход памяти: 5.96Мб 
Запрос(ы):
[1] SELECT news_id FROM `dh_tags` WHERE tag regexp "[[:<:]](4795)[[:>:]]"
[1 время:] 6.6995620727539E-5
[2] SELECT p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.category, p.alt_name, p.allow_comm, p.comm_num, p.fixed, p.allow_main, p.symbol, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.related_ids, e.view_edit, e.editdate, e.editor, e.reason FROM `dh_post` p LEFT JOIN `dh_post_extras` e ON (p.id=e.news_id) WHERE approve AND category regexp "[[:<:]](49)[[:>:]]" ORDER BY fixed DESC, e.rating DESC, p.comm_num DESC, e.news_read DESC LIMIT 0, 10
[2 время:] 0.0049939155578613
[3] SELECT news_id FROM `dh_tags` WHERE tag regexp "[[:<:]](4795)[[:>:]]"
[3 время:] 6.6995620727539E-5
[4] SELECT p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.category, p.alt_name, p.allow_comm, p.comm_num, p.fixed, p.allow_main, p.symbol, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.related_ids, e.view_edit, e.editdate, e.editor, e.reason FROM `dh_post` p LEFT JOIN `dh_post_extras` e ON (p.id=e.news_id) WHERE approve AND category regexp "[[:<:]](663)[[:>:]]" ORDER BY fixed DESC, e.rating DESC, p.comm_num DESC, e.news_read DESC LIMIT 0, 10
[4 время:] 0.0030679702758789
Время выполнения запросов: 0.0081958770751953
Время выполнения скрипта: 0.005504 c.
Расход памяти: 5.96Мб 

Если два подключение и хотя бы по одному есть тег (работает правильно):

Запрос(ы):
[1] SELECT news_id FROM `dh_tags` WHERE tag regexp "[[:<:]](4765)[[:>:]]"
[1 время:] 6.6995620727539E-5
[2] SELECT p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.category, p.alt_name, p.allow_comm, p.comm_num, p.fixed, p.allow_main, p.symbol, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.related_ids, e.view_edit, e.editdate, e.editor, e.reason FROM `dh_post` p LEFT JOIN `dh_post_extras` e ON (p.id=e.news_id) WHERE approve AND category regexp "[[:<:]](49)[[:>:]]" AND id IN (5409) ORDER BY fixed DESC, e.rating DESC, p.comm_num DESC, e.news_read DESC LIMIT 0, 10
[2 время:] 0.00050783157348633
Время выполнения запросов: 0.00057482719421387
Время выполнения скрипта: 0.004741 c.
Расход памяти: 4.84Мб 
Запрос(ы):
[1] SELECT news_id FROM `dh_tags` WHERE tag regexp "[[:<:]](4765)[[:>:]]"
[1 время:] 6.6995620727539E-5
[2] SELECT p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.category, p.alt_name, p.allow_comm, p.comm_num, p.fixed, p.allow_main, p.symbol, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.related_ids, e.view_edit, e.editdate, e.editor, e.reason FROM `dh_post` p LEFT JOIN `dh_post_extras` e ON (p.id=e.news_id) WHERE approve AND category regexp "[[:<:]](49)[[:>:]]" AND id IN (5409) ORDER BY fixed DESC, e.rating DESC, p.comm_num DESC, e.news_read DESC LIMIT 0, 10
[2 время:] 0.00050783157348633
[3] SELECT news_id FROM `dh_tags` WHERE tag regexp "[[:<:]](4765)[[:>:]]"
[3 время:] 6.3896179199219E-5
[4] SELECT p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.category, p.alt_name, p.allow_comm, p.comm_num, p.fixed, p.allow_main, p.symbol, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.related_ids, e.view_edit, e.editdate, e.editor, e.reason FROM `dh_post` p LEFT JOIN `dh_post_extras` e ON (p.id=e.news_id) WHERE approve AND category regexp "[[:<:]](663)[[:>:]]" AND id IN (5409) ORDER BY fixed DESC, e.rating DESC, p.comm_num DESC, e.news_read DESC LIMIT 0, 10
[4 время:] 0.00026392936706543
Время выполнения запросов: 0.00090265274047852
Время выполнения скрипта: 0.000865 c.
Расход памяти: 5.06Мб 

Еще уточнение: сами страницы, на которых подключен вывод BlockPro не имеют тегов. Показ блока производится в шаблоне короткой новости.

makey2 commented 4 years ago

Сделал чистую установку Версия DLE 12.1 Версия PHP: 7.3.11 Одну новость (id3) перенес в категорию с id 2. Добавил в шаблон короткой и шаблон полной строку вызова {include file="engine/modules/base/blockpro.php?catId=1&tags={news-id}"}. Новости с id2 добавил тег "1" Результат: Если нет указанного тега, то выводятся новости из категории те что есть. Если тег найден, то новость имеющая его. Почему нет сообщения об ошибке? Прошу помочь, очень нужно!!!! Иначе получается, что на всех страницах вместо уникального контента для определенной новости выводиться одно и тоже (((

pafnuty commented 4 years ago

@makey2 прошу прощения, пропустил все сообщения от вас. Похоже недоработка модуля. Попробуйте после этой строки https://github.com/dle-modules/DLE-BlockPro/blob/dad276ab2bf21ff56219807778af846218bee007/engine/modules/base/blockpro.php#L767

else {
    $wheres[] = 'id = 0';
}

Судя по всему из-за того, что тегов не найдено, логика отбора новостей по ним не срабатывает и условие не добавляется в запрос.

makey2 commented 4 years ago

@pafnuty , спасибо! Сейчас все работает корректно!

pafnuty commented 4 years ago

@makey2 ок, пока поживите так, в следующей версии будет исправлено.

pafnuty commented 4 years ago

@makey2 Исправлено