Articles

Responsive ModX Commenting with Quip

Mike Harvey

Article Header

Details on the recent refactoring some key elements of ModX Quip Commenting AddOn for responsive design and simpler user experience

Background

I offered to document the changes I have made to ModX Quip which is a nice commenting addon for ModX CMS, but is lacking in some useability features compared to Wordpress and others. My goals were to make it responsive (using bootstrap 3.0) and quicker with more inline functions and fewer postbacks to the server. I am still working on integrating reCaptchav2, but to do it in an unobtrusive way without hacking the existing quip recaptcha functionality. I also tested some markdown functionality of the Comments textarea using TinyMCE, and Markdown-It, but decided against it for several reasons and scrapped the markdown idea.

Included here are all the custom chunks, scripts, and styles I used in the process with as much explanation I think necessary for a reasonably experienced ModX developer. Much thanks to the awesome ModX Community for their input and support not only for this work, but for the past several years.

Platform and Versions

As of the writing of this, all the relevant versions are the latest stable versions available:

  • Platform: ModxCLoud
  • Version: Revo 2.3.5pl
  • Jquery: 2.0.2
  • Bootstrap: v3.3.5 with all components
  • Articles: 1.7.11-pl
  • Quip: 2.3.3-pl
  • getResources: 1.6.1-pl

Without further ado, see the tabs below for each component of the solution.

Templates and Chunks

All of the formatting for the following chunks is using Bootstrap 3.0 css and components to enable a responsive layout. The addtional css required will be shown in the next section.
  1. CommentsContainerTPL chunk

    Chunk to include at the bottom of your article template to show the comments for that article:
    [[!Quip@CMHQuip? &thread=`article-[[*id]]`]]
    
    <hr />
    
    <a id="post-a-comment" class="post-comment replyTo main-comment-form" data-pid="0" data-toggle="collapse" href="#comment-form" aria-expanded="false" aria-controls="comment-form"><h2 style="margin-bottom:20px">Add a Comment</h2></a><br /><br />
       <div class="row">
               <div class="col-sm-12">
                       <div id="comment-form" class="post-comment-body collapse">
                              [[!QuipReply@CMHReply? &thread=`article-[[*id]]`]]
                       </div>
                </div>
        </div>
                    
  2. CommentsWrapper chunk

    Set this as your Comments Wrapper Chunk in the Articles>Comments>Display tab:
    <div class="quip">
        <h3> [[%quip.comments]] ( [[+total]])</h3>
        
        <div id="quip-topofcomments- [[+idprefix]]"></div>
    
        [[+comments:notempty=`
        [[+comments]]
        `]]
    
        [[+pagination]]
    </div>
                    
  3. MediaCommentTpl chunk

    Chunk for each comment. This is formatted as a Bootstrap media compenent which handles nesting very nicely for threaded comments. Set this as your Comment Chunk in the Articles>Comments>Display tab:
    <div class="media" id="[[+idprefix]][[+id]]">
        <div class="author-container pull-left">
        [[+gravatarUrl:notempty=`<img src="[[+gravatarUrl]]" class="media-object" />`]]
        <span class="desc">
            <span class="author_name">[[+authorName]]</span>
        </span>
        </div>
        <div class="media-body">
            <span class="small pull-right"><i>Posted On: [[+createdon]]</i></span><br />
            <p>[[+body]]</p>
            [[+replyUrl:notempty=`<a role="button" href="[[+replyUrl]]" data-pid="[[+id]]" class="replyTo btn btn-warning btn-sm"><span class="glyphicon glyphicon-share-alt"></span>Reply</a>`]][[+approved:if=`[[+approved]]`:is=`1`:then=``:else=`- <em>[[%quip.unapproved? &namespace=`quip` &topic=`default`]]</em>`]]<span class="quip-comment-options">[[+report]][[+options]]</span>
            [[+children:notempty=`[[+children]]`]]
        </div>
    </div>
                        
  4. addCommentTpl chunk

    Set this your Reply Form Chunk in the Articles>Comments>Display tab:
    <div id="preview-div" style="display:none;">
        <div class="media">
            <div class="pull-left">
                  <img id="gravpreview" src="" class="media-object" />
                  <span class="desc">
                      <span class="author_name"><span id="authorName"></span></span>
                  </span>
            </div>
            <div class="media-body">
                <p><span id="comment"></span></p>
                <br class="clear" />
            </div>
        </div>
    </div>
    <div class="alert alert-success" role="alert" style="display:none;">
        <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">x</span></button>
         [[+successMsg]]
    </div>
     
    <form id="quip-add-comment- [[+idprefix]]" action=" [[+url]]#quip-comment-preview-box- [[+idprefix]]" method="post" role="form" class="comment-form">
    <div class="row">
        <input id="idprefix" type="hidden" name="idprefix" value=" [[+idprefix]]" />
        <input type="hidden" name="nospam" value="" />
        <input type="hidden" name="thread" value=" [[+thread]]" />
        <input type="hidden" name="parent" value=" [[+parent]]" />
        <input type="hidden" name="auth_nonce" value=" [[+auth_nonce]]" />
        <input type="hidden" name="preview_mode" value=" [[+preview_mode]]" />
     
         <div class="form-group col-sm-12">
            <input class="form-control" type="text" name="name" placeholder="Name" id="quip-comment-name- [[+idprefix]]" value=" [[+name]]" />
            <span class="help-block" style="display: none;">Please enter a valid name.</span><span class="error"> [[+error.name]]</span>
        </div>
        <div class="form-group col-md-12">
            <input class="form-control" type="text" name="email" placeholder="Email" id="quip-comment-email- [[+idprefix]]" value=" [[+email]]" />
            <span class="help-block" style="display: none;">Please enter a valid e-mail address.</span><span class="error"> [[+error.email]]</span>
        </div>
        <div class="form-group col-md-12">
            <input class="form-control" type="text" name="website" placeholder="Website" id="quip-comment-website- [[+idprefix]]" value=" [[+website]]" />
            <span class="help-block" style="display: none;">Please enter a valid website address.</span><span class="error"> [[+error.website]]</span>
        </div>
     </div>
    <div class="row">
        <div class="col-md-12 form-group ">
            <div class="checkbox col-lg-4 col-md-4 col-sm-12">
                <label for="quip-comment-notify- [[+idprefix]]">
                     <input type="checkbox" value="1" name="notify" id="quip-comment-notify- [[+idprefix]]"  [[+notify:if=` [[+notify]]`:eq=`1`:then=`checked="checked"`]] />
                      [[%quip.notify_me]]                
                </label>
                <span class="error"> [[+error.notify]]</span>
            </div>
            
            <div class="col-lg-8 col-md-8 col-sm-12 recaptcha pull-right">
                 [[+quip.recaptcha_html]]
                <span class="error"> [[+error.recaptcha]]</span>
            </div>
        </div>
    </div>
    <div class="row">
        <div class="col-md-4 col-md-offset-8 help-block"><span class="float-right small"> [[%quip.allowed_tags? &tags=` [[++quip.allowed_tags:htmlent]]`]]</span></div>
    </div>
    <div class="row">
        <div class="form-group col-md-12">
            <textarea name="comment" class="form-control" id="quip-comment-box- [[+idprefix]]" rows="5" placeholder=" [[%quip.comment_add_new]]" > [[+comment]]</textarea>
            <span class="help-block" style="display: none;">Please see allowable tabs above.</span><span class="error"> [[+error.comment]]</span>
        </div>
    </div>
    <div class="row">
         <div class="form-group col-md-12">
            <button id="preview-btn" type="submit" name=" [[+preview_action]]" value="1" class="btn btn-warning btn-sm" style="display: inline-block; margin-top: 10px;"> [[%quip.preview]]</button>
            [[+can_post:is=`1`:then=`<button type="submit" name=" [[+post_action]]" value="1" class="btn btn-success btn-sm" style="display: inline-block; block; margin-top: 10px;"> [[%quip.post]]</button>`]]
            <button type="button" class="reply-cancel btn btn-danger btn-sm pull-right" style="display: inline-block; margin-top: 10px;">Cancel</button>
         </div>
    </div>
                        
  5. CommentOptionsTpl chunk

    Set this as your Comments Options Chunk in the Articles>Comments>Display tab:
    [[+allowRemove:notempty=` <a href="[[+removeUrl]]" id="remove-btn" class="btn btn-warning btn-xs pull-right" style="display: inline-block; margin-right: 5px; font-size:10px;"><span class="glyphicon glyphicon-remove-sign"></span>&nbsp;[[%quip.remove]]</a>`]]
                        
  6. ReportasSpamTpl chunk

    Set this as either an option &tplReport on your QuipQ snippet call, or (what I did) create a new Property set to hold all my settings:
    <span class="pull-right">
        [[+reported:empty=`<a href="[[+reportUrl]]" id="report-btn" class="btn btn-danger btn-xs pull-right" style="display: inline-block; padding-left:5px; font-size:10px;"><i class="fa fa-comment"></i>&nbsp;Report Spam</a>`]]
        [[+reported:notempty=`<span class="bg-danger small text-danger" style="padding:2px;">[[%quip.reported_as_spam]]</span>`]]
        </span>
                        
  7. SideBar chunk

    Used on article template pages:
    <div class="well">
        <h4>Latest Posts</h4>
        <div class="row">
            <div class="col-lg-12">
                <ul class="list-unstyled icon-list article">
                  [[getResources?
                    &parents=`110`
                    &depth=`2`
                    &limit=`5`
                    &sortby=`{"createdon":"DESC"}`
                    &tpl=`latestArticlesTpl`
                  ]]
                </ul>
            </div>
        </div>
    </div>
    <div class="well">
        <h4>Latest Comments</h4>
        <ul class="list-unstyled icon-list comment">
            [[!QuipLatestComments? &tpl=`latestCommentsTpl` &limit=`5`]]
        </ul>
    </div>
                        
  8. latestArticles chunk

    Set this as the &tpl option on the getResources snippet call. See (Sidebar chunk above):
    <!-- blog entry [[+idx]] -->
        [[!getAuthorInfo? &userId=`[[+createdby]]` &prefix=`user.`]]
        <li class="blog-list br-gray"><a href="[[~[[+id]]]]">[[+pagetitle]]</a>
            <span class="small">-<a class="sm-blog-author" href="mailto:[[+user.email]]">[[+user.fullname]]</a><br />
            <span class="small glyphicon glyphicon-time"></span> Posted on [[+publishedon:strtotime:date=`%a %b %e, %Y`]]</span>
    
        </li>
    <!-- end blog item -->
                        
  9. latestComments chunk

    Set this as the &tpl option on the QuipLatestComments snippet call. See (Sidebar chunk above):
    <!-- comment entry [[+idx]] -->
        <li class="comment-list br-gray"><span class="glyphicons glyphicons-comments"></span>&nbsp;<a href="[[+url]]">[[+body:ellipsis=`20`]]</a><br />
        <span class="small glyphicon glyphicon-time"></span> Posted on [[+ago:strtotime:date=`%a %b %e, %Y`]]</span>
        </li>
        <!-- end comment -->
                        

Snippets and Code Changes

Custom Snippets and code changes are detailed below:
  1. getAuthor snippet

    Custom snippet used to get author details for sidebar (see call in Sidebar chunk above):
    
        $userId = $modx->getOption('userId',$scriptProperties,false);
        if (empty($userId)) return '';
         
        /* get user and profile by user id */
        $user = $modx->getObject('modUser',$userId);
        if (!$user) return '';
        $profile = $user->getOne('Profile');
        if (!$profile) return '';
         
        $userArray = array_merge($user->toArray(),$profile->toArray());
         
        $modx->toPlaceholders($userArray,'user');
        return '';
                        
  2. recaptcha.class.php

    Customization to make recaptcha widget responsive. I did this in lieu of the recaptchv2 integration though I may get to that sooner or later. Changes to the getHtml function are described below. The file is located at core/components/quip/model/recaptcha/recaptcha.class.php. Before changes:
    
        public function getHtml($theme = 'clean',$error = null) {
            if (empty($this->config[reCaptcha::OPT_PUBLIC_KEY])) {
                return $this->error($this->modx->lexicon('recaptcha.no_api_key'));
            }
    
            /* use ssl or not */
            $server = !empty($this->config[reCaptcha::OPT_USE_SSL]) ? $this->config[reCaptcha::OPT_API_SECURE_SERVER] : $this->config[reCaptcha::OPT_API_SERVER];
    
            $errorpart = '';
            if ($error) {
               $errorpart = "&error=" . $error;
            }
            $opt = array(
            // changes will start here
                'theme' => $theme,
                'lang' => $this->modx->getOption('cultureKey',null,'en'),
            );
            return '
            //changes will end here
     <noscript>
            <iframe src="'. $server . 'noscript?k=' . $this->config[reCaptcha::OPT_PUBLIC_KEY] . $errorpart . '" height="300" width="500" frameborder="0"></iframe><br/>
            <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
            <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
    </noscript>';
    }
                        
    After changes:
    
        public function getHtml($theme = 'clean',$error = null) {
            if (empty($this->config[reCaptcha::OPT_PUBLIC_KEY])) {
                return $this->error($this->modx->lexicon('recaptcha.no_api_key'));
            }
    
            /* use ssl or not */
            $server = !empty($this->config[reCaptcha::OPT_USE_SSL]) ? $this->config[reCaptcha::OPT_API_SECURE_SERVER] : $this->config[reCaptcha::OPT_API_SERVER];
    
            $errorpart = '';
            if ($error) {
               $errorpart = "&error=" . $error;
            }
            $opt = array(
            // start of changes to theme
                'theme' => 'custom',
                'custom_theme_widget' => 'recaptcha_widget',
                'lang' => $this->modx->getOption('cultureKey',null,'en'),
            );
            return '<script type="text/javascript">var RecaptchaOptions = '.$this->modx->toJSON($opt).';</script>
             <div id="recaptcha_widget" style="display:none">
                <div class="control-group">
                    <div class="controls">
                        <a id="recaptcha_image" href="#" class="thumbnail"></a>
                        <div class="recaptcha_only_if_incorrect_sol" style="color:red">Incorrect please try again</div>
                    </div>
                </div>
             
                <div class="control-group">
                    <label class="recaptcha_only_if_image control-label">Enter the words above:</label>
                    <label class="recaptcha_only_if_audio control-label">Enter the numbers you hear:</label>
             
                    <div class="input-group">
                        <input type="text" id="recaptcha_response_field" class="input-recaptcha form-control" name="recaptcha_response_field" />
                        <span class="input-group-btn">
                            <a class="btn btn-warning" href="javascript:Recaptcha.reload()"><span title="Refresh Image" class="glyphicon glyphicon-refresh"></span></a>
                        </span>
                        <span class="input-group-btn">
                            <a class="btn btn-warning recaptcha_only_if_image" href="javascript:Recaptcha.switch_type(\'audio\')"><span title="Get an audio CAPTCHA"class="glyphicon glyphicon-headphones"></span></a>
                        </span>
                        <span class="input-group-btn">
                            <a class="btn btn-warning recaptcha_only_if_audio" href="javascript:Recaptcha.switch_type(\'image\')"><span title="Get an image CAPTCHA" class="glyphicon glyphicon-picture"></span></a>
                        </span>
                        <span class="input-group-btn">  
                        <a class="btn btn-warning" href="javascript:Recaptcha.showhelp()"><span class="glyphicon glyphicon-question-sign"></span></a>
                        </span>
                    </div>
                </div>
            </div>
            // end of changes to theme
            <script type="text/javascript" src="'. $server . 'challenge?k=' . $this->config[reCaptcha::OPT_PUBLIC_KEY] . $errorpart . '"></script>
            
            <noscript>
                    <iframe src="'. $server . 'noscript?k=' . $this->config[reCaptcha::OPT_PUBLIC_KEY] . $errorpart . '" height="300" width="500" frameborder="0"></iframe><br/>
                    <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
                    <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
            </noscript>';
        }
    
                        

Javascript Functions

As one of the primary goals was to make fewer posts to the server, I decided to inline both the reply to comment and preview functions. The Reply function leverages a single form which is moved within the page as requested by the user. The original inline reply inspiration came from DesignCouch's site design, and was further improved by the LEague OF Extraordinary Catholics.

All of the functions below should be placed in the document ready function to be invoked after the page is fully rendered.

Requirements: Bootstrap Collapse and Popovers are implemented jQuery MD5 Plugin 1.2.1 used for gravatar preview fetching.
  1. Toggle Main Comment Form Click Event

    This function toggles the main comment form which is originally positioned at the bottom of the page under the Add a Comment heading:
    
        $("#post-a-comment").click(function(event){
            event.preventDefault();
            $("#comment-form").collapse('toggle');
        });
                
  2. Reply to Comment Form Click Event

    This is the magic function that moves the single comment form and preview section inline within the threaded comments.
    
        $('.replyTo').on('click', function(event){
            event.preventDefault();
            var idPrefix = $('#idprefix').val();
            var commentParent = $(this).attr('data-pid');
            $('#preview-div').hide();
            $('.replyTo').removeClass('hide');
            replyurl = $(this).attr('href');
            $("#quip-add-comment-qcom").parent().insertAfter(this).collapse("show");
            $("#quip-add-comment-qcom input[name=parent]").val(commentParent);
            $('#quip-comment-box-' + idPrefix ).val('');
            $("#remove-btn, #report-btn").hide();
            $("#preview-div").popover('hide');
            if (!$(this).hasClass('main-comment-form')) {$(this).addClass('hide');}
            return false;
        });
                
  3. Reply Cancel Form Click Event

    This function remove the reply form on cancel and return it to the default position at the bottom of the page. It also hides any currently visible preview and clears the comment textarea.
    $('.reply-cancel').on('click', function(event){
             event.preventDefault();
             var idPrefix = $('#idprefix').val();
             $('#preview-div').hide();
             $('#quip-add-comment-qcom').parent().insertBefore('.main-comment-form').collapse('hide');
             $('.replyTo').removeClass('hide');
             $('#remove-btn, #report-btn').show();
             $("#preview-div").popover('hide');
             $('#quip-comment-box-' + idPrefix ).val('');
             return false;
        });
                
  4. Preview Form Click Event

    This function takes current form values and populates them in a preview div that emulates the comment tpl without having to postback to the server.
    $('#preview-btn').on('click', function(event){
         event.preventDefault();
         var idPrefix = $('#idprefix').val();
         var emailID = #quip-comment-email-' + idPrefix;
         var emailAddy = $(emailID).val();
         $('#gravpreview').attr('src', 'http://www.gravatar.com/avatar/' + $.md5(emailAddy));
         var author = $('#quip-comment-name-' + idPrefix ).val();
         $('#authorName').html(author);
         var comment = $('#quip-comment-box-' + idPrefix ).val();
         $('#comment').html(comment);
         $('#preview-div').fadeIn(2200);
         $("#preview-div").popover('show');
    });
                
  5. Popover Functions for Preview

    The below function are optional but clearly show the user where their preview is in the tree. It is impemented with javascript only (no data hooks on html elements) in case you want to omit it entirely. These also go in document ready function.
    
        $('#preview-div').popover({
            placement: 'right',
            animation: true,
            html: true,
            title : ' Here\'s your preview!',
            content: 'To change something just modify the form and click the preview button again.',
            viewport: { selector: '.container', padding: 0 },
            delay: '3000'
        });
    
        $('#preview-btn').on('click', function(event){
             event.preventDefault();
             console.log("Firing preview");
        
             var idPrefix = $('#idprefix').val();
             var emailID = "#quip-comment-email-" + idPrefix;
             var emailAddy = $(emailID).val();
             $('#gravpreview').attr('src', 'http://www.gravatar.com/avatar/' + $.md5(emailAddy));
             var author = $('#quip-comment-name-' + idPrefix ).val();
             $('#authorName').html(author);
             var comment = $('#quip-comment-box-' + idPrefix ).val();
             $('#comment').html(comment);
             $('#preview-div').fadeIn(2200);
             $("#preview-div").popover('show');
             return false;
        });
                

Styling

All of the formatting is using Bootstrap 3.0 css and components to enable a responsive layout. The additional css for the layout also bears responsiveness in mind.
  1. Required Additional CSS

    Load these styles after your Bootstrap CSS and any plugin CSS required. They really should be the last stylesheet loaded:
    
        .media-body p{
          min-height: 60px;
          background-color: #f0f0f0;
          padding: 5px 10px;
        }
        
        span.desc{
          background-color: #cecece;
          bottom: -5px;
          color: #fff;
          left: 0;
          position: relative;
          width: 80px;
          overflow: visible;
          text-align: center;
          height: 44px;
          display: table-cell;
          vertical-align: middle;
          -webkit-border-bottom-left-radius: 10px;
          -moz-border-radius-bottomleft: 10px;
          border-bottom-left-radius: 10px;
        }
        
        span.author_name{
          color: #fff;
          font-size: .8em;
        }
        
        #post-a-comment {
          margin-bottom:20px;
        }
                    
  2. Optional Additional CSS

    These styles are optional and for the buttons in the comment section as well as the list styles for the Preview Popver, Latest Articles and Latest Comments listed in the Sidebar. I included them only for completeness.
    
        /* -------------- POPOVER STYLES ----------------- */
        .popover {
          width:100%;
        }
        .popover-title {
          font-weight: 700;
          color: #fff;
          background-color: #000;
        }
        
        .popover-content {
          font-size: .9em
        }
    
        /* -------------- OPTIONAL BUTTONS ----------------- */
        .btn {
            -webkit-transition: all 0.4s;
            transition: all 0.4s;
            border-radius: 0;
            font-family: 'open_sanslight', sans-serif;
        }
        
        .btn-outline-inverse {
          color: #000;
          background-color: transparent;
          border-color: #000 !important;
          text-decoration:none !important;
        }
        .btn-outline-inverse:hover,
        .btn-outline-inverse:focus,
        .btn-outline-inverse:active {
          color: #fff;
          text-shadow: none;
          background-color: #000;
          border-color: #000;
          text-decoration:none;
        }
        .btn-outline-inverse:hover a,
        .btn-outline-inverse:focus a,
        .btn-outline-inverse:active a {
           text-decoration:none !important;
        }
        
        .btn-outline {
          color: #000;
          background-color: transparent;
          border-color: #000 !important;
          text-decoration:none !important;
        }
        .btn-outline:hover,
        .btn-outline:focus,
        .btn-outline:active {
          color: #fff;
          text-shadow: none;
          background-color: #000;
          border-color: #000;
          text-decoration:none;
        }
        .btn-outline:hover a,
        .btn-outline:focus a,
        .btn-outline:active a {
           text-decoration:none !important;
        }
        
        /* -------------- OPTIONAL LAYOUT FOR SIDEBAR ----------------- */
        .icon-list li {
          padding: 0 0 15px 30px;
          display: block;
          position: relative;
        }
        .icon-list li:before {
          font-family: 'Glyphicons Halflings';
          position: absolute;
          left: 0px;
          top: -2px;
          font-size: 120%;
        }
        .comment li:before {
         content: '\e111';
        }
        
        .article li:before {
         content: '\e055';
        }
                    

Comments (11)

Posted On: Apr 07, 2019 at 03:20 PM

New MLM Project Celluvation http://tkfl777.com/ Youth. Brain. Energy Our Cellular Rejuvenation Beauty Crystals. Celluvation - Молодость кожи Youth

Reply
Posted On: May 11, 2019 at 06:49 PM

Alecnib (Алектиниб) - Алекниб (Alectinib) - аналог Алесенса средство нового поколения. Относиться данный препарат к клинико-фармакологическому подклассу веществ, которые борются с опухолью, предотвращают и останавливают ее распространение в организме. Препарат имеет возможность блокировать фермент протеинкиназы, что способствует остановке распространению опухолевых тканей в организме.

Показание к применению
Препарат принимается для борьбы с ALK-позитивным немелкоклеточным раком легкого. На Alecnib (Алектиниб) - Алекниб (Alectinib) - аналог Алесенса цена указана на сайте, вы прямо сейчас можете заказать его с доставкой.

Способ применения
Очень важно знать и способ правильного, предусмотренного инструкцией и медицинским назначением применения препарата для более эффективного воздействия на организм пациента. Прежде всего, надо сказать, что лекарственное средство производиться и выпускается в капсулах, для внутреннего применения. Их ни в коем случае нельзя раскрывать и высыпать. Способ приема пероральный. Капсулу необходимо заглатывать целиком и запить большим количеством воды, противопоказано запивать препарат грейпфрутовым соком, так как может произойти нежелательная химическая реакция для организма. Дозировка зависит от типа терапии. Согласно инструкции производителя рекомендуется принимать по 600 мг препарата (это ровно 4 целых капсулы) дважды в сутки во время еды. Длительность курса длится до наступления положительного эффекта, или если возникают сильные и тяжелые побочные действия, то тогда курс прекращается.
Так же при необходимости врач может снижать дневную дозу препарата Если вас интересует на Alecnib (Алектиниб) - Алекниб (Alectinib) - аналог Алесенса стоимость и доставка – звоните, мы всегда рады помочь с оформлением заказа.

Противопоказания
Как и любой препарат, есть группы лиц, которым он противопоказан следующим, к таким группам лиц относятся: • Лица, имеющие непереносимость к любым компонентам из состава лекарственного средства; • Лица до восемнадцати лет, вынашивающие ребенка и кормящие грудью; • Лица, у которых имеется тяжелая почечная недостаточность; • Лица, которым необходим гемодиализ.

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

Reply
Posted On: May 25, 2019 at 01:29 AM

Write My Paper - EssayErudite.com

Looking for an expert to write my paper for you? You are at the right place.
Providing superior writing service appears to be our main specialization and passion.
Our website is the best destination for every English-speaking student who calls for assistance when handling his or her daily academic tasks.

write my paper

Write My Paper - https://essayerudite.com/write-my-paper/

thesis helper
college essay writing service
cheap essay
best custom essay writing service
buy essays online
buy an essay online cheap
college writing services
help with thesis
master thesis writing service
write paper
help writing an essay
cheap paper
college essay writing
college paper writing

Reply
Posted On: Jun 15, 2019 at 01:39 PM

New super hot photo galleries, daily updated collections
http://girlstattoos.relayblog.com/?ayla

virus fee porn free porn fil real amature porn kea kulani porn star arse lickers porn

Reply
Posted On: Jun 24, 2019 at 06:03 AM

cialis side effects in men
cialis generic
cialis dosage 20mg or 10mg
cialis generic
cialis price walmart vs walgreens
generico do cialis 5 mg preço
cialis dose vs viagra dose
generic cialis usa pharmacy

Reply
Posted On: Jul 08, 2019 at 03:40 PM

Отдых в Украине tbetu.com.ua
Лучший отдых - это Кирилловка www.tbetu.com.ua

Новости авиации aviahot.news
Новости частной и малой авиации aviahot.news
Детали на сайте - https://www.aviahot.news

Кирилловка 2019 karelhadek.com.ua
Азовское море с www.karelhadek.com.ua
Отдыхаем в Украине дешево! - https://www.karelhadek.com.ua

Стрелковое 2019 sta.kr.ua
Азовское море с www.sta.kr.ua в Стрелковом
Отдыхаем в Стрелковом дешево! - https://www.sta.kr.ua


Нововсти Азова www.azov-sea.top
Азовское море с azov-sea.top
Отдыхаем на Азовском море выгодно! - https://www.azov-sea.top


Базы отдыха в Кирилловке bazi-kirillovka.top
Азовское море с bazi-kirillovka.top в Кирилловке
Отдыхаем в Кирилловке! - https://www.bazi-kirillovka.top


Генгорка 2019 gengorka.top
Отдых на море - gengorka.top - отдых на косе
Отдыхаем на Генгорке - https://www.gengorka.top

Отели в Бердянске hotel-berdyansk.top
Отдых в Бердянске - hotel-berdyansk.top - отдых на косе
Отдыхаем на косе - https://www.hotel-berdyansk.top


Отели в Кирилловке hotel-kirillovka.top
Отдых на Азове - hotel-kirillovka.top - отдых на косе
Поиск отелей с - https://www.hotel-kirillovka.top

Отели в Лазурном lazurnoe.top
Отдыхаем на Азовском море - lazurnoe.top
Поиск отелей в Лазурном - https://www.lazurnoe.top


Отдых в Кирилловке otdyh-kirillovka.top
Где отдохнуть? - otdyh-kirillovka.top
Достопримичательности Кирилловки - https://www.otdyh-kirillovka.top


Новости Приморска и Запорожской области primorsk.top
Где отдохнуть в Приморском? - primorsk.top
Достопримичательности Приморска - https://www.primorsk.top


Новости Счастливцево и Херсонской области schastlivcevo.top
Где отдохнуть в Счастливцевоево? - schastlivcevo.top
Достопримичательности - https://www.schastlivcevo.top



Степановка в Запорожской области primorsk.top
Где отдохнуть в Степановке Первой? - stepanovka.top
Достопримичательности - https://www.stepanovka.top



Стрелковое - strelkovoe.top
Где отдохнуть в Стрелковом? - strelkovoe.top
Достопримичательности Стрелкового - https://www.strelkovoe.top



Ютуб видео:
https://www.youtube.com/watch?v=_6-74wSusUM
https://www.youtube.com/watch?v=l0vKI3IMF4I
https://www.youtube.com/watch?v=EJVE5t60sRw
https://www.youtube.com/watch?v=qWzoW4DYI0o
https://www.youtube.com/watch?v=UWtQSclKkVc
https://www.youtube.com/watch?v=iVgWImldgg0
https://www.youtube.com/watch?v=bTKIolRVsro
https://www.youtube.com/watch?v=a_RxJD-Ilck
https://www.youtube.com/watch?v=yw7qnvLLVzY
https://www.youtube.com/watch?v=LB0ZPKuf5es
https://www.youtube.com/watch?v=-43qiynTZWc

Reply
Posted On: Jul 21, 2019 at 01:08 PM

Our company provides a wide variety of non prescription products. Take a look at our health site in case you want to to feel healthier with a help of general health products. http://2q.medonlinepro.com/pt/dor-lombar-jovens-63018.html Our company offers a wide variety of non prescription products. Look at our health site in case you want to feel better with a help of generic supplements. http://g7x.medonlinepro.com/de/septische-arthritis-behandlung-36610.html Our company provides a wide variety of non prescription drugs. Visit our health portal in case you want to to feel healthier with a help of health products. http://7h0i.medonlinepro.com/en/lower-back-pain-spine-x-ray-94753.html Our company provides a wide variety of non prescription drugs. Visit our health portal in case you want to look better with a help of general health products. http://5h.medonlinepro.com/de/rueckenschmerzen-einlagen-14965.html Our site offers a wide variety of non prescription drugs. Take a look at our health site in case you want to strengthen your health with a help of health products. http://1ak2.medonlinepro.com/pt/o-que-provoca-dor-na-coluna-56365.html Our company provides a wide variety of non prescription products. Visit our health site in case you want to feel better with a help generic supplements. http://2pa.medonlinepro.com/pl/miniak-a-bl-krgosupa-77317.html
Our company offers a wide variety of non prescription drugs. Visit our health website in case you want to feel better with a help generic supplements. http://j0j8.medonlinepro.com/de/gittertape-bei-rueckenschmerzen-70772.html Our company offers a wide variety of non prescription drugs. Look at our health site in case you want to feel better with a help of generic supplements. http://k6o.medonlinepro.com/es/dolor-articulaciones-dando-pecho-26322.html Our company provides a wide variety of health products. Look at our health contributing website in case you want to feel better. http://r04t.medonlinepro.com/es/tratamiento-de-artritis-fisioterapia-48762.html Our company provides a wide variety of non prescription products. Take a look at our health portal in case you want to look better. http://5iy.medonlinepro.com/de/zt-26-rueckenschmerzen-62721.html Our company offers generic pharmacy. Take a look at our health contributing site in case you want to look better.

Reply
Posted On: Jul 23, 2019 at 08:21 PM

hOur company offers a wide variety of non prescription products. Look at our health site in case you want to strengthen your health with a help general health products. http://s5.orderspillsonline.com/nl/prednisolone-3/kopen-prednisolone-kullananlar-52315.html Our site offers a wide variety of non prescription drugs. Look at our health website in case you want to look better with a help of generic supplements. http://n8c.orderspillsonline.com/de/diflucan-6/preis-diflucan-doc-morris-42401.html Our company provides supreme quality weight loss products. Visit our health contributing website in case you want to look healthier. http://d1.orderspillsonline.com/nl/flagyl-4/flagyl-kosten-gastouderopvang-57314.html Our company offers supreme quality non prescription products. Visit our health contributing site in case you want to feel better. http://6n.orderspillsonline.com/fi/viagra-9/viagra-verkosta-cme-93720.html Our company offers a wide variety of non prescription products. Look at our health site in case you want to strengthen your health with a help of generic supplements. http://3en7.orderspillsonline.com/da/dapoxetine-3/ordre-dapoxetine-rivals-52057.html Our site offers a wide variety of non prescription drugs. Look at our health site in case you want to look healthier with a help generic supplements. http://9av8.orderspillsonline.com/no/antabuse-5/antabuse-rezeptfrei-rv-blue-40195.html
Our site offers a wide variety of non prescription drugs. Take a look at our health portal in case you want to feel better with a help general health products. http://l2v.orderspillsonline.com/da/accutane-1/billig-accutane-klipi-89992.html Our company provides herbal non prescription products. Take a look at our health contributing portal in case you want to strengthen your health. http://s5.orderspillsonline.com/da/prednisolone-3/ordre-prednisolone-by-chinese-84424.html Our company offers a wide variety of non prescription products. Take a look at our health portal in case you want to strengthen your health with a help of general health products. http://qt5.orderspillsonline.com/en/neurontin-2/neurontin-for-dogs-cost-44559.html Our site offers a wide variety of non prescription drugs. Look at our health portal in case you want to look better with a help generic supplements. http://n8.orderspillsonline.com/it/dapoxetine-6/vendita-dapoxetine-online-recensioni-20293.html Our company offers a wide variety of non prescription drugs. Take a look at our health website in case you want to strengthen your health with a help health products.

Reply
Posted On: Jul 29, 2019 at 01:24 AM

hOur company provides generic pharmacy. Look at our health contributing site in case you want to feel healthier. http://bh9.buynowcytotec.com/sv/bestaella-cytotec-sweden-64876.html Our company offers herb-based weight loss products. Visit our health contributing portal in case you want to look better. http://p8n.buynowcytotec.com/no/misoprostol-nettle-73061.html Our company offers a wide variety of non prescription drugs. Visit our health website in case you want to to improve your health. http://m0.buynowcytotec.com/de/cytotec-kaufen-im-geschaeft-40732.html Our company offers weight loss products. Take a look at our health contributing website in case you want to look better. http://h6.buynowcytotec.com/es/donde-comprar-cytotec-online-espaa-35183.html Our company provides herbal weight loss products. Take a look at our health contributing site in case you want to look healthier. http://ft7.buynowcytotec.com/sv/bestaella-cytotec-jelly-topical-78515.html Our company provides generic supplements. Take a look at our health contributing portal in case you want to feel better. http://7rx.buynowcytotec.com/fr/cytotec-en-pharmacie-sans-ordonnance-12599.html
Our site offers a wide variety of non prescription drugs. Visit our health site in case you want to to feel healthier with a help general health products. http://3ap.buynowcytotec.com/no/salg-cytotec-once-a-day-96935.html Our company provides a wide variety of non prescription products. Look at our health contributing portal in case you want to look better. http://ae62.buynowcytotec.com/it/misoprostol-si-pu-comprare-senza-ricetta-medica-14024.html Our company offers health and related products. Look at our health contributing site in case you want to look better. http://53cj.buynowcytotec.com/nl/waar-cytotec-kopen-zonder-recept-48643.html Our company offers a wide variety of pharmacy. Visit our health contributing site in case you want to look better. http://53cj.buynowcytotec.com/da/billig-misoprostol-djelovanje-49346.html Our company offers safe non prescription products. Visit our health contributing portal in case you want to improve your health.

Reply
Posted On: Jul 30, 2019 at 04:47 AM

hOur company offers generic supplements. Look at our health contributing website in case you want to look healthier. https://kq3.pillsrxbest.com/nl/koop-prednisone-bbc-6634.html Our company offers safe weight loss products. Look at our health contributing portal in case you want to look healthier. https://h0.pillsrxbest.com/da/kob-diflucan-tunisie-62772.html Our company offers herb-based pharmacy. Visit our health contributing website in case you want to look better. https://h2j.pillsrxbest.com/de/doxycycline-100-mg-kaufen-58860.html Our company provides a wide variety of non prescription drugs. Visit our health website in case you want to look better with a help health products. https://9f.pillsrxbest.com/en/can-i-buy-strattera-in-chemists-31616.html Our company offers herbal general health products. Visit our health contributing website in case you want to improve your health. https://8tv.pillsrxbest.com/sv/silagra-inget-recept-sulance-73749.html Our company offers a wide variety of non prescription drugs. Visit our health portal in case you want to look better with a help health products. https://tj7.pillsrxbest.com/no/viagra-rezeptfrei-zwift-85814.html
Our company provides supreme quality health products. Take a look at our health contributing portal in case you want to feel healthier. https://m1r.pillsrxbest.com/no/salg-retin-a-kada-46462.html Our company offers safe health products. Look at our health contributing website in case you want to strengthen your health. https://4h.pillsrxbest.com/en/where-to-buy-cytotec-in-petaling-jaya-1182.html Our company provides a wide variety of non prescription products. Visit our health site in case you want to look better with a help of health products. https://9z.pillsrxbest.com/de/preis-ventolin-apotheke-41958.html Our company offers weight loss products. Visit our health contributing website in case you want to look better. https://rb8.pillsrxbest.com/es/donde-puedo-comprar-synthroid-sin-receta-en-sevilla-49257.html Our company provides a wide variety of non prescription products. Take a look at our health site in case you want to feel better with a help generic supplements.

Reply



Allowed tags: <b><i><br>