Рабочая ссылка на комментарий в хабе Есть решение

https://demo2-ru.webasyst.com/hub/author/3/replies...

Это якобы список всех комментариев автора. Список генерируется с помощью того же comments.html. Для страниц он подходит, там ссылки локальные.

Для replies ссылка получается невменяемая: https://demo2-ru.webasyst.com/hub/author/3/replies... никуда не ведёт.

Вопрос: как получить живую рабочую ссылку на этот комментарий в коде?

1 ответ

  • 2
    Михаил Ушенин Webasyst 18 июня 2015 10:25 # Решение

    На примере темы default:


    1. В файле author.html после фрагмента

    {if empty($comments)}

    <p class="empty-list">{sprintf('[`%s did not post any comments yet.`]', $author.name|default:"[`Author`]"|escape)}</p>

    {else}

    добавьте

    {$topic_ids = []}

    {foreach $comments as $comment}

    {$topic_ids[] = $comment.topic_id}

    {/foreach}

    {$comment_topics = $wa->hub->topics($topic_ids)}


    2. В файле comment.html замените строку

    <a href="#comment{$comment.id}" class="anchor">#</a>

    на

    <a href="{$comment_topics[$comment.topic_id].url}#answer-{$comment.id}" class="anchor">#</a>

    • +1
      Dima Stefantsov Dima Stefantsov 18 июня 2015 19:40 #

      Огромное спасибо, Михаил!
      Всё работает.

      Удивило то, что ->topics() возвращает массив не таких же объектов, как ->topic(), как минимум url у них заполнено по-разному.

    • +1

      Вот наблюдаю ситуацию в теме Sidebar: если топик достаточно длинный, и требуемый комментарий не "попадает" в первичную загрузку топика, а появляется только после подгрузки ajax'ом, то такая ссылка ведет в самое начало топика.

      Ну и еще вопрос вдогонку: в настройках как-то можно включить полную загрузку топика вне зависимости от его величины?

      • +1
        Dima Stefantsov Dima Stefantsov 19 июня 2015 04:57 #

        Здравствуйте, Павел.

        У меня ссылки, подгружаемые и аяксом с прокрутки, и аяском по "Показать ещё" формируются правильно.

        Настолько длинной именно темы у меня нет, но ведь когда мы находимся в контексте темы, $comment_topics будет не существовать, и по сути будет выводиться только последняя часть, #answer-{$comment.id} (я использую #comment{$comment.id}). А значит в принципе не должно быть возможно то поведение, которое вы описываете.

        Говорю на примере темы default.

        ---

        По поводу настройки аякса мне тоже хотелось бы изменить поведение: или уж всё по прокрутке аяксово, или всегда "Показать ещё". А то какая-то демо-версия "удобной прокрутки".

        Аяксовая прокрутка это хорошо. Но не всегда это вменяемое решение. Например я пытался читать с мобильного блог вебасиста, там как раз так сделано. Через километр ленты у меня всё стало тормозить и умер браузер.

        • +1

          Дмитрий, день добрый!

          Ну я несколько в ином разрезе смотрел на это дело... Более того, в код я еще даже не залезал :) Просто руками сформировал ссылку по образу и подобию и попробовал перейти - получил такой эффект. А изначально задумывался о том, как бы переходить в самый конец топика из списка топиков. Попробовал стандартный якорь - переходит на последний комментарий из первичной загрузки топика, попробовал описанный выше метод - в самое его начало.

          • +1
            Dima Stefantsov Dima Stefantsov 19 июня 2015 06:07 #

            if (!empty($base_types[$topic_type]['solution'])) {
            $comments = $comment_model->getFullTree($topic['id'], '*,author,vote,my_vote', 'solution DESC, votes_sum DESC', true);
            } elseif ($topic_type == 'forum') {
            $limit = $this->getConfig()->getOption('comments_per_page');
            if (!$limit) {
            $limit = 20;

            Судя по коду, для всего кроме форума сразу подгружаются все "комментарии". Для форума только 20. И это настраивается в конфиге. В интерфейсе я этой настройки не видел (тут есть похожая настройка "Кол-во тем на странице" posts_per_page, я не смог увидеть, чтобы она имела хоть какой-то эффект; опять же есть у меня тема с 21 ответом, но я там тоже не смог увидеть ajax, всё подгружается сразу).

            • +2

              Любопытство победило :) Пробежался наискосок по исходникам и конфигам. Да, в конфиге действительно регулируется количество комментариев. Т.о. заработала и схема с якорем и описанный Михаилом метод. Но вопрос остается актуальным: а можно ли как-то сформировать прямую ссылку на комментарий который в топике по счету превышает указанное в конфиге значение?

              • +1
                Dima Stefantsov Dima Stefantsov 19 июня 2015 06:40 #

                Да, можно.
                $page = waRequest::get('page', 1, 'int');
                $offset = ($page - 1) * $limit;

                Соответственно можно в ссылке указать ?page=Х, и сразу будут подгружаться комментарии с нужной страницы.

                При этом в дефолтной теме снизу будет отображаться пагинация, сломается постинг комментов х_х, но всё будет именно так как вы хотите.

            • +1

              posts_per_page это количество топиков в списке на странице. А количество комментариев действительно только в конфиге.

              • +1
                Dima Stefantsov Dima Stefantsov 19 июня 2015 06:42 #

                Звучит логично. Только я попробовал поставить цифру поменьше, 1, 3, 5, 10, и не увидел у себя никакого аякса или пагинации. Как-будто просто не работает настройка. Об этом и написал.
                Включать режим отладки / очищать кеш не пробовал.

                • +2

                  Дмитрий, я думаю это проявится когда топиков на странице побольше будет... Штук 20-30 хотя б... Мне не посмотреть, на стенде нет такого количества топиков. А с маленькими значениями имею такой же как у вас эффект - никакой пагинации, никакого ajax'a.

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите