Перейти к публикации

Правильный телепорт / перенос пользователя на нужную страницу комментариев.


Рекомендованные сообщения

Проблема: Пользователь переходит на коммент №32 с блока / страницы последних комментов, и когда попадает в страницу новости не может найти нужный коммент, потому что нужный коммент находится в 3 странице (https://site.com/page,1,3,89602-news.html#comment).

Задача: Надо чтобы плагин правильно до конца / до нужной страницы доставлял пользователя. Также надо учесть динамическую загрузку комментов.

 

DLE 13.3 & 14.

Цена · Срок реализаций.

Ссылка на сообщение
Поделиться на других сайтах

Берусь за задачу

Ссылка на сообщение
Поделиться на других сайтах

Сделал телепорт к нужному коменту. Только к каждому коменту дополнительный запрос в БД используеться.

 

Нужно сделать следующее:

1) создать файл engine/modules/teleport/functions.php код файла:

<?php
//Формируем дерево коментов
function buildTree(array &$elements, $parent = 0)
{
    $branch = array();

    foreach ($elements as $element) {
        if ($element['parent'] == $parent) {
            $children = buildTree($elements, $element['id']);

            if (!empty($children)) {
                $element['children'] = $children;
            }

            $branch[$element['id']] = $element;
            unset($elements[$element['id']]);
        }
    }

    return $branch;
}

//Вытягиваем ID комментов которые относятся к комменту
function getIdComments($str, $array)
{
    if (!empty($array['children'])) {
        foreach ($array['children'] as $value) {
            $str .= getIdComments(','.$value['id'], $value);
        }
    }

    return $str;
}

function getFullLink($post)
{
    global $db, $config;

    //Вытягиваем все комменты новости
    $sql_comments = $db->query("SELECT * FROM " . PREFIX . "_comments WHERE post_id='{$post['post_id']}' ");

    $list_comments = [];

    while ($row = $db->get_row($sql_comments)) {
        $list_comments[$row['id']] = $row;
    }

    $list_comments = buildTree($list_comments);

    //вытаскиваем все ID
    $comments_ids = [];

    foreach ($list_comments as $value) {
        $comments_ids[] = getIdComments($value['id'], $value);
    }

    //Формируем id комментов по страницам
    $count_com = 2;
    $count_coms = count($list_comments);
    $pages = @ceil($count_coms / $count_com);

    $pages_ = [];

    for ($i = 1; $i <= $pages; $i++) {
        $count = 1;

        foreach ($comments_ids as $key => $value) {
            $pages_[$i][] = $value;
            unset($comments_ids[$key]);

            if ($count == $count_com) break;
            $count++;
        }

        $pages_[$i] = explode(',', implode(',', $pages_[$i]));
    }

    //Определяем на какой странице находиться комментарий
    $page_num = null;

    foreach ($pages_ as $key => $value) {
        if (in_array($post['id'], $value)) {
            $page_num = $key;
            break;
        }
    }

    //Генерируем ссылку на телепорт к коменту
    $teleport = !empty($page_num) ? "page,1,{$page_num}," : "";
    $teleport_c = !empty($page_num) ? "cstart={$page_num}&" : "";
    $teleport_ = !empty($page_num) ? "#comment-id-{$post['id']}" : "";

    if ($config['allow_alt_url']) {

        if ($config['seo_type'] == 1 or $config['seo_type'] == 2) {

            if ($row['category'] and $config['seo_type'] == 2) {

                $full_link = $config['http_home_url'] . get_url($post['category']) . "/{$teleport}" . $post['post_id'] . "-" . $post['alt_name'] . ".html{$teleport_}";

            } else {

                $full_link = $config['http_home_url'] . $teleport . $post['post_id'] . "-" . $post['alt_name'] . ".html{$teleport_}";

            }

        } else {
            $full_link = $config['http_home_url'] . date('Y/m/d/', $post['newsdate']) . $teleport . $post['alt_name'] . ".html{$teleport_}";
        }

    } else {
        $full_link = $config['http_home_url'] . "index.php?{$teleport_c}newsid=" . $post['post_id'] . $teleport_;
    }

    return $full_link;
}

2) В файле engine/modules/functions.php найти:

if (!function_exists('password_hash')) {

добавить выше

include (ENGINE_DIR . '/modules/teleport/functions.php');

3) В файле engine/classes/comments.class.php найти:

$tpl->set( '{news-link}', $full_link."#comment" );

заменить на

$tpl->set( '{news-link}', getFullLink($row) );

Вот в принцепе и все. Проверил, работает на всех типах ЧПУ.

Тестировал на CMS DLE 14.0

Ссылка на сообщение
Поделиться на других сайтах
В 13.05.2020 в 23:46, dimitron сказал:

Сделал телепорт к нужному коменту. Только к каждому коменту дополнительный запрос в БД используеться.

 

......

 

Вот в принцепе и все. Проверил, работает на всех типах ЧПУ.

Тестировал на CMS DLE 14.0

Оставьте тут кошелек, или ссылку на оплату Яндекса

Ссылка на сообщение
Поделиться на других сайтах

Не работает с количеством комментов, допустим у меня 7 комментов в настройках и ответы к ним (древо=3), если я напишу ответ на коммент в 9 странице, то в ссылка будет: /page,1,14,151-news.html#comment-id-1582

 

В то время у меня только 10 страниц.

 

DLE 13.3.

Ссылка на сообщение
Поделиться на других сайтах

Немного поправил код файла (engine/modules/teleport/functions.php).

ВНИМАНИЕ!!! тестировал на версии dle 14.0. И этот хак работает только для кастомного тега {customcomments}

<?php
//Формируем дерево коментов
function buildTree(array &$elements, $parent = 0)
{
    $branch = array();

    foreach ($elements as $element) {
        if ($element['parent'] == $parent) {
            $children = buildTree($elements, $element['id']);

            if (!empty($children)) {
                $element['children'] = $children;
            }

            $branch[$element['id']] = $element;
            unset($elements[$element['id']]);
        }
    }

    return $branch;
}

//Вытягиваем ID комментов которые относятся к комменту
function getIdComments($str, $array)
{
    if (!empty($array['children'])) {
        foreach ($array['children'] as $value) {
            $str .= getIdComments(','.$value['id'], $value);
        }
    }

    return $str;
}

function getFullLink($post)
{
    global $db, $config;
    
    //Вытягиваем все комменты новости
    $sql_comments = $db->query("SELECT * FROM " . PREFIX . "_comments WHERE post_id='{$post['post_id']}' ");

    $list_comments = [];

    while ($row = $db->get_row($sql_comments)) {
        $list_comments[$row['id']] = $row;
    }

    $list_comments = buildTree($list_comments);

    //вытаскиваем все ID
    $comments_ids = [];

    foreach ($list_comments as $value) {
        $comments_ids[] = getIdComments($value['id'], $value);
    }

    //Формируем id комментов по страницам
    $count_com = $config['comm_nummers'];
    $count_coms = count($list_comments);
    $pages = @ceil($count_coms / $count_com);

    $pages_ = [];

    for ($i = 1; $i <= $pages; $i++) {
        $count = 1;

        foreach ($comments_ids as $key => $value) {
            $pages_[$i][] = $value;
            unset($comments_ids[$key]);

            if ($count == $count_com) break;
            $count++;
        }

        $pages_[$i] = explode(',', implode(',', $pages_[$i]));
    }

    //Определяем на какой странице находиться комментарий
    $page_num = null;

    if(count($pages_) > 1) {
        foreach ($pages_ as $key => $value) {
            if (in_array($post['id'], $value)) {
                $page_num = $key;
                break;
            }
        }
    }

    //Генерируем ссылку на телепорт к коменту
    $teleport = !empty($page_num) ? "page,1,{$page_num}," : "";
    $teleport_c = !empty($page_num) ? "cstart={$page_num}&" : "";
    $teleport_ = "#comment-id-{$post['id']}";
    
    if ($config['allow_alt_url']) {

        if ($config['seo_type'] == 1 or $config['seo_type'] == 2) {

            if ($row['category'] and $config['seo_type'] == 2) {

                $full_link = $config['http_home_url'] . get_url($post['category']) . "/{$teleport}" . $post['post_id'] . "-" . $post['alt_name'] . ".html{$teleport_}";

            } else {

                $full_link = $config['http_home_url'] . $teleport . $post['post_id'] . "-" . $post['alt_name'] . ".html{$teleport_}";

            }

        } else {
            $full_link = $config['http_home_url'] . date('Y/m/d/', $post['newsdate']) . $teleport . $post['alt_name'] . ".html{$teleport_}";
        }

    } else {
        $full_link = $config['http_home_url'] . "index.php?{$teleport_c}newsid=" . $post['post_id'] . $teleport_;
    }

    return $full_link;
}

 

Ссылка на сообщение
Поделиться на других сайтах

Если реально мой код комуто подошол я не буду прям настаивать на какойто цене 😉

Рекизиты: WebMoney Z180611042436

Изменено пользователем dimitron
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...