Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Не работает ссылка reply в комментариях #9

Closed
sergio-s opened this issue May 10, 2016 · 11 comments
Closed

Comments

@sergio-s
Copy link

sergio-s commented May 10, 2016

При нажатии на ссылку reply (ответить) на комментарии просто перебрасывает на верх страницы. Проще говоря, ссылка работает как обычная ссылка на эту-же страницу. Соответственно, не записывается родительский id . Что может быть. На сколько я понял, за поведение ссылки отвечает comment.js и data атрибуты <?php echo Html::a("<span class='glyphicon glyphicon-share-alt'></span> Ответить", '#', ['class' => 'comment-reply', 'data' => ['action' => 'reply', 'comment-id' => $comment->id]]); ?>
Все это подключается в assets. Возможно ,что-то я упустил?

Возможно jquery плагин где-то нужно включить?

@ihorchepurnyi
Copy link
Contributor

Здравствуйте, только что проверил работу reply кнопки на чистом шаблоне, не смог воспроизвести ошибку. Думаю дело в ассетах, попробуйте проверить наличие comments.js на странице и ошибок в консоли. Если вы меняли темплейт(_list.php), скиньте пожалуйста его код для воспроизведения ошибки.

@sergio-s
Copy link
Author

sergio-s commented May 10, 2016

Файл _list я переименовал в comments.php
Правильно ли я понимаю - data-action вызывает соответствующую функцию в jquery?
Т.е. при клике на <?php echo Html::a("<span class='glyphicon glyphicon-share-alt'></span> Ответить", '#', ['class' => 'comment-reply', 'data' => ['action' => 'reply', 'comment-id' => $comment->id]]); ?>

-должен вызватся


    /**
     * Reply to comment
     * @param event
     */
    function reply(event) {
        event.preventDefault();
        var $commentForm = event.data.commentForm;
        var settings = $commentForm.data('comment');
        var $this = $(this);
        var parentCommentSelector = $this.parents('[data-comment-content-id="' + $this.data('comment-id') + '"]');
        //Move form to comment container
        $commentForm.appendTo(parentCommentSelector);
        //Update parentId field
        $commentForm.find('[data-comment="parent-id"]').val($this.data('comment-id'));
        //Show cancel reply link
        $commentForm.find(settings.cancelReplyBtnSelector).show();
    }

из файла comments.js ?

<?php
use yii\helpers\Html;
use yii\helpers\Url;
use yii\helpers\HtmlPurifier;
use common\components\rbac\rbacRoles;

?>

<?php if (!empty($comments)) : ?>
    <?php foreach ($comments as $comment) : ?>
        <li class="comment" id="comment-<?php echo $comment->id ?>">
            <div class="comment-content" data-comment-content-id="<?php echo $comment->id ?>">
                <div class="comment-author-avatar">
                    <?php echo $comment->getAvatar(['title' => $comment->getAuthorName(),'alt' => $comment->getAuthorName()]); ?>
                </div>
                <div class="comment-details">
                    <?php if ($comment->isActive): ?>
                        <div class="comment-action-buttons">
                            <?php if (Yii::$app->getUser()->can(rbacRoles::ROLE_ADMIN)): ?>
                                <?php echo Html::a('<span class="glyphicon glyphicon-trash"></span> Отключить', '#', ['data' => ['action' => 'delete', 'url' => Url::to(['/comment/default/delete', 'id' => $comment->id]), 'comment-id' => $comment->id]]); ?>
                            <?php endif; ?>
                            <?php if (!Yii::$app->user->isGuest && ($comment->level < $maxLevel || is_null($maxLevel))): ?>
                                <?php echo Html::a("<span class='glyphicon glyphicon-share-alt'></span> Ответить", '#', ['class' => 'comment-reply', 'data' => ['action' => 'reply', 'comment-id' => $comment->id]]); ?>
                            <?php endif; ?>
                        </div>
                    <?php endif; ?>
                    <div class="comment-author-name">
                        <span><?php echo $comment->getAuthorName(); ?></span>
                        <span class="comment-date">
                            <?php echo $comment->getPostedDate(); ?>
                        </span>
                    </div>
                    <div class="comment-body">
                        <?php echo $comment->getMessage(); ?>
                    </div>
                </div>
            </div>
            <?php if ($comment->hasChildren()): ?>
                <ul class="children">
                    <?php echo $this->render('_comments', ['comments' => $comment->children, 'maxLevel' => $maxLevel]) ?>


       </ul>


        <?php endif; ?>

     </li>
    <?php endforeach; ?>

    <?php else:?>
        <li class="noComments"><i>Комментариев нет...</i><li>
<?php endif; ?>`

@sergio-s
Copy link
Author

sergio-s commented May 10, 2016

У меня скрипт в конце подключается в таком порядке .Возможно, должен подключаться после pjax? Или это не критично?

`<script src="/work/yii2-Blog/css/comments/comments.js"></script>
<script src="/work/yii2-Blog/assets/f3b3e99e/yii.validation.js"></script>
<script src="/work/yii2-Blog/assets/f3b3e99e/yii.activeForm.js"></script>
<script src="/work/yii2-Blog/assets/dffd9ef9/jquery.pjax.js"></script>
<script type="text/javascript">jQuery(document).ready(function () {
 $('#comment-pjax-container-w0').on('pjax:end', function() {
    $('#mes').css('display', 'none');
    $('#mes').fadeIn(1000);


        $('textarea').focus(function() {
            $('#mes').fadeOut(1000);
        });

    })
jQuery('#comment-form').yiiActiveForm([{"id":"message_textarea","name":"message","container":".field-message_textarea","input":"#message_textarea","error":".help-block.help-block-error","validateOnChange":false,"validateOnBlur":false,"validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Необходимо заполнить «Комментарий»."});}}], []);
jQuery(document).pjax("#comment-pjax-container-w0 a", "#comment-pjax-container-w0", {"push":false,"replace":false,"timeout":10000,"scrollTo":false});
jQuery(document).on('submit', "#comment-pjax-container-w0 form[data-pjax]", function (event) {jQuery.pjax.submit(event, '#comment-pjax-container-w0', {"push":false,"replace":false,"timeout":10000,"scrollTo":false});});
jQuery('#SubscriptionSidebar-form').yiiActiveForm([{"id":"subscriptionsidebar-email","name":"email","container":".field-subscriptionsidebar-email","input":"#subscriptionsidebar-email","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Необходимо заполнить «Email»."});yii.validation.email(value, messages, {"pattern":/^[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$/,"fullPattern":/^[^@]*<[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?>$/,"allowName":false,"message":"Значение «Email» не является правильным email адресом.","enableIDN":false,"skipOnEmpty":1});}}], []);
jQuery(document).pjax("#SubscriptionSidebar a", "#SubscriptionSidebar", {"push":true,"replace":false,"timeout":1000,"scrollTo":false});
jQuery(document).on('submit', "#SubscriptionSidebar form[data-pjax]", function (event) {jQuery.pjax.submit(event, '#SubscriptionSidebar', {"push":true,"replace":false,"timeout":1000,"scrollTo":false});});
jQuery('#SubscriptionFooter-form').yiiActiveForm([{"id":"subscriptionfooter-email","name":"email","container":".field-subscriptionfooter-email","input":"#subscriptionfooter-email","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Необходимо заполнить «Email»."});yii.validation.email(value, messages, {"pattern":/^[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$/,"fullPattern":/^[^@]*<[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?>$/,"allowName":false,"message":"Значение «Email» не является правильным email адресом.","enableIDN":false,"skipOnEmpty":1});}},{"id":"subscriptionfooter-checkbox","name":"checkbox","container":".field-subscriptionfooter-checkbox","input":"#subscriptionfooter-checkbox","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Нужно согласиться с правилами","requiredValue":1});}}], []);
jQuery(document).pjax("#SubscriptionFooter a", "#SubscriptionFooter", {"push":true,"replace":false,"timeout":1000,"scrollTo":false});
jQuery(document).on('submit', "#SubscriptionFooter form[data-pjax]", function (event) {jQuery.pjax.submit(event, '#SubscriptionFooter', {"push":true,"replace":false,"timeout":1000,"scrollTo":false});});
});</script>    </body>
</html>`



@sergio-s
Copy link
Author

Когда в файле comments.js для теста пишу alert(); то при обнавлении страници он отрабатывает. Значит файл подключается, но плагин не работает при нажатии на ссылку.

@ihorchepurnyi
Copy link
Contributor

Попробуйте следующий способ:

  1. Создать папку comments например в папке views вашего приложения рядом с папкой site.
  2. В ней создать два файла, index.php и _comments.php

Код для index.php

<?php

use yii\widgets\Pjax;

/* @var $this \yii\web\View */
/* @var $comments array */
/* @var $commentModel \yii2mod\comments\models\CommentModel */
/* @var $maxLevel null|integer comments max level */
/* @var $encryptedEntity string */
/* @var $pjaxContainerId string */
/* @var $formId string comment form id */
?>
<?php Pjax::begin([
    'enablePushState' => false,
    'timeout' => 10000,
    'id' => $pjaxContainerId
]); ?>
<div class="comments row">
    <div class="col-md-12 col-sm-12">
        <div class="title-block clearfix">
            <h3 class="h3-body-title"><?php echo Yii::t('yii2mod.comments', 'Comments'); ?></h3>
            <div class="title-separator"></div>
        </div>
        <ol class="comments-list">
            <?php echo $this->render('_comments', ['comments' => $comments, 'maxLevel' => $maxLevel]) ?>
        </ol>
        <?php if (!Yii::$app->user->isGuest): ?>
            <?php echo $this->render('@vendor/yii2mod/yii2-comments/widgets/views/_form', [
                'commentModel' => $commentModel,
                'encryptedEntity' => $encryptedEntity,
                'formId' => $formId
            ]); ?>
        <?php endif; ?>
    </div>
</div>
<?php Pjax::end(); ?>

для _comments.php я использовал ваш код

  1. В месте где вы добавляете виджет, указать путь к новому темплейту:
<?php echo Comment::widget([
            'model' => $model,
            'commentView' => '@app/views/comments/index' // Вот эта строка
        ]); ?>

И после этого почистить папку assets в папке web, и заново попробовать. Этот способ проверил, должен работать.

@sergio-s
Copy link
Author

Попробовал. Ни чего не изменилось. Вероятнее всего я где-то, что-то забыл .

@ihorchepurnyi
Copy link
Contributor

ihorchepurnyi commented May 10, 2016

Еще меня смущает в вашем коде вот эта строка:

<script src="/work/yii2-Blog/css/comments/comments.js"></script>

Путь к файлу comments.js должен быть примерно такой же как у activeForm.js в вашем примере, а он почему то ведет в папку css.

В моем случае:

<script src="/assets/df2db1f0/jquery.js"></script>
<script src="/assets/bc2e7155/yii.js"></script>
<script src="/assets/ef25f117/js/comment.js"></script>
<script src="/assets/bc2e7155/yii.validation.js"></script>
<script src="/assets/bc2e7155/yii.activeForm.js"></script>
<script src="/assets/75c0633a/jquery.pjax.js"></script>
<script src="/assets/918ca098/js/bootstrap.js"></script>

Честно говоря не смогу вам помочь, могу посоветовать установить просто чистый yii2/basic или наш yii2mod/base и в нем протестировать этот виджет может тогда найдете где допустили ошибку.

Eще раз проверил ваш код на чистом шаблоне, он работает прекрасно.

@sergio-s
Copy link
Author

Я установил скрипты и стили в папку web, чтобы не перезаписывалось туда же в assets, а подключалось оттуда.

@ihorchepurnyi
Copy link
Contributor

ihorchepurnyi commented May 10, 2016

Предлагаю так попробовать:

  1. Убедится что вы не правили файлов на прямую в папке vendor/yii2mod/comments.
  2. Убедится что по умолчанию(примеры в документации) виджет работает правильно.
  3. После того как вы убедились в том что виджет корректно работает, добавить свои шаблоны(пример) и проверить их.

@sergio-s
Copy link
Author

sergio-s commented May 10, 2016

Ок. Спасибо. Попробую.
А вообще код грамотно написан. Есть чему поучиться.

@ihorchepurnyi
Copy link
Contributor

ihorchepurnyi commented May 11, 2016

Спасибо, главное чтобы работал :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants