Jump to content
Sign in to follow this  
Хоббит

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

Recommended Posts

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

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

 

DLE 13.3 & 14.

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

Share this post


Link to post
Share on other sites

присоединяюсь. можно на двоих сумму разбить )

  • Upvote 1

Share this post


Link to post
Share on other sites

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

  • Like 1

Share this post


Link to post
Share on other sites

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

 

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

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

  • Thanks 1

Share this post


Link to post
Share on other sites

те кто так нуждались в случае работоспособности не забудьте рассчитаться с dimitron

Share this post


Link to post
Share on other sites
В 13.05.2020 в 23:46, dimitron сказал:

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

 

......

 

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

DLE 13.3.

Share this post


Link to post
Share on other sites

Немного поправил код файла (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;
}

 

  • Like 1

Share this post


Link to post
Share on other sites
Posted (edited)

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

Рекизиты: WebMoney Z180611042436

Edited by dimitron
  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...