web-dev-qa-db-ja.com

ページャーなしでノードのすべてのコメントを表示(300以上のコメント)

スレッディングコメント付きのコンテンツタイプがあります。ページあたりのコメントの最大数は300に設定されています(つまり、絶対最大数です)。 300以上のコメントがある場合-それらはページングされます。

ページャーなしでノードのすべてのコメントを表示するにはどうすればよいですか(300以上のコメント)。

これは、UXへの悪影響を知っている望ましい機能です。

コメントページャーの新しい最大値の設定に使用できるテーマ関数/フックが見つかりませんでした。ビューを介してコメントをレンダリングすることを提案しないでください。

3
oksana-c

コンテンツタイプごとに変数に格納されているため、次のようにオーバーライドできます。

variable_set('comment_default_per_page_CONTENT_TYPE', 500);

ここで、CONTENT_TYPEはコンテンツタイプのマシン名です。

UIのオプションを変更する場合は、フォームのalterを使用して行うことができます。

function MYMODULE_form_node_type_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node_type'] == 'foo') {
    $new_options = drupal_map_assoc(array(10, 30, 50, 70, 90, 150, 200, 250, 300, 500, 1000));
    $form['comment']['comment_default_per_page']['#options'] = $new_options;
  }
}
4
Clive

コメントのページングは​​、貢献モジュールなしのDrupal Coreで提供されます。

コンテンツタイプの設定画面に移動した場合:

D7 Path: admin/structure/types/manage/[node-type-name]

コメントフィールドセット/タブ(d7)といくつかのオプションが表示されます。チェックアウトするオプションは、ページごとのコメント設定です。改ページするときの数値を選択して、設定を保存します。コメントがそのしきい値を超えると、コメントのポケットベルが表示されます。付属の画面でも見る

ここで、コメントカウントについて、ノードテンプレートのDrupal 7で使用できる変数があります。その変数の名前は$ comment_countです。

enter image description here

1
visabhishek

ページャーなしでノードのすべてのコメントを表示するにはどうすればよいですか(300以上のコメント)。

これは、UXへの悪影響を知っている望ましい機能です。

300のコメントを同時に表示/ロードしないことを強くお勧めします。これにより、ページが遅くなるだけでなく、サーバーのコストが増加します。すべてのユーザーが300件のコメントをすべて読みますか?私はそれを疑います、たぶんいくつかはかもしれません。

エンドレススクロールを使用してページャーを取り除きます。

残念ながら、私はエンドレススクロールウィジェットの実装に慣れていません。 – Eyal

これが正しいアプローチです。必要なのは AJAX load()メソッド を使用した小さなjQueryマジックだけです

まず、ページごとのコメントを10に設定します。

次に、comments-wrapper.tpl.phpファイルを変更する必要があります。これはbartikのものです。

<div id="comments" class="<?php print $classes; ?>"<?php print $attributes; ?>>


  <?php if ($content['comments'] && $node->type != 'forum'): ?>
    <?php print render($title_prefix); ?>
    <h2 class="title"><?php print t('Comments'); ?></h2>
    <?php print render($title_suffix); ?>
  <?php endif; ?>



<div class="ajax-wrap"> // added this wrapper

  <?php print render($content['comments']); ?>

  <div class="loadmore"></div> // added this div to load the next page stuff here   

</div> // closes ajax-wrap

  <?php if ($content['comment_form']): ?>
    <h2 class="title comment-form"><?php print t('Add new comment'); ?></h2>
    <?php print render($content['comment_form']); ?>
  <?php endif; ?>
</div>

「コメントボックス/フォームの追加」が必要ないため、コメントとページャーのみをラップするラッパーがなかったため、ajax-wrap divを追加しました。次のページのコメントをloadmore div内に読み込みます。

3番目に、 jQuery Visible を使用して、loadmore divがブラウザーウィンドウに表示されるかどうかを確認します。表示されている場合は、次のページのコメントを AJAX load()メソッド を使用してロードします。

(function ($) {
!function(t){var i=t(window);t.fn.visible=function(t,e,o){if(!(this.length<1)){var r=this.length>1?this.eq(0):this,n=r.get(0),f=i.width(),h=i.height(),o=o?o:"both",l=e===!0?n.offsetWidth*n.offsetHeight:!0;if("function"==typeof n.getBoundingClientRect){var g=n.getBoundingClientRect(),u=g.top>=0&&g.top<h,s=g.bottom>0&&g.bottom<=h,c=g.left>=0&&g.left<f,a=g.right>0&&g.right<=f,v=t?u||s:u&&s,b=t?c||a:c&&a;if("both"===o)return l&&v&&b;if("vertical"===o)return l&&v;if("horizontal"===o)return l&&b}else{var d=i.scrollTop(),p=d+h,w=i.scrollLeft(),m=w+f,y=r.offset(),z=y.top,B=z+r.height(),C=y.left,R=C+r.width(),j=t===!0?B:z,q=t===!0?z:B,H=t===!0?R:C,L=t===!0?C:R;if("both"===o)return!!l&&p>=q&&j>=d&&m>=L&&H>=w;if("vertical"===o)return!!l&&p>=q&&j>=d;if("horizontal"===o)return!!l&&m>=L&&H>=w}}}}(jQuery);

// The above lines of code is the minified version of jQuery Visible.js see  https://www.customd.com/articles/13/checking-if-an-element-is-visible-on-screen-using-jquery

   (function Forever(){ // we create a function called Forever

      var graburl = $('.pager-next a').attr('href');   // we create a variable called graburl which gets the url inside the href of the pager-next div class

      $('#comments .pager').css("display", "none"); // hides the comments pager div

      if ($('.loadmore').visible(true) && graburl != null) { // we check if the load here div is visible and also if the grab url is not empty (will be empty when we reach the last page, since there is no "next" button.

          $('.pager').remove(); // we remove/delete the pager from our website as we already grab the href with graburl variable and also we don't need this pager anymore.    
          $('.loadmore').html('<center><img src="http://i.stack.imgur.com/RCEAe.gif"></center>').load('' + graburl + ' .ajax-wrap').attr("class", "loaded"); // We place a loading gif. Then load the content inside the ajax-wrap div of "next page". Then we rename the div loadmore to loaded.

          }      

       setTimeout(Forever, 1); // if it was 1000 we would run this code every 1 second, but since it is 1, we run this code every millisecond. Basically we are looping this code.

   })();

})(jQuery);

なんとかして、ユーザーブラウザーが何らかの理由でjQueryをブロックすると、ページャーを使用してコメントを閲覧できるようになります。

PS:comments-wrapper.tpl.phpでは、コメントフォームをコメントの上に移動する必要があります。そうすれば、人々がスクロールしなくても済むようになります。最後にコメントボックスを取得します。 (私がしなかった何か)

1
No Sssweat