Szálakba rendezett új hozzászólások követhetővé tétele

Őry Máté képe

Alapvető és állandó probléma nagyobb forgalmú oldalakon, hogy a sok hozzászólás között igen nehéz a különböző szálakba érkezett új hozzászólások követése. A Drupal alapértelmezés szerint az általunk még nem olvasott hozzászólásokat (és tartalmakat) ?új? jelzéssel látja el. Ezt javítottam föl azzal, hogy arra kattintva a következő új hozzászólásra ugorjon.

A megoldás két egyszerű lépésből áll PHPTemplate sminkmotor használata esetén. Az első a template.php kiegészítése. Ez a fájl az adott smink gyökerében helyezhető el, például /sites/all/themes/azensminkem/template.php. Feladata a gyárilag használható .tpl.php fájloknál kevésbé általános finomhangolások végrehajtása, esetünkben a comment.tpl.php-nak küldött változók felülírása. Ez a _phptemplate_variables($hook, $vars) függvénnyel történhet a következő módon:

function _phptemplate_variables($hook, $vars) {
  switch ($hook) {
    case 'comment':
        static $numnew;
        $numnew=$numnew?$numnew:0;
        if ($vars['new']) {
          $vars['numnew'] = ++$numnew;
        }
 
    break;
  }
  return $vars;
}

Mivel ez a függvény meghívódik minden sablon kiértékelésekor, a hozzászólások megjelenítése előtt meg tudjuk vizsgálni, hogy éppen egy új hozzászólást dolgozunk-e fel. Ha új hozzászólásról van szó, akkor a függvényhívások között megjegyzett értékű (static) $numnew változóban számoljuk, hogy hányadik új hozzászólást találtuk. Az aktuális hozzászólásra vonatkozó $numnew változót megkapja a sablonunk.

A második lépés a hozzászólásoknál a megjelenés testreszabása, a link elhelyezése. Ez a comment.tpl.php, hozzászólások megjelenését szabályozó fájllal oldható meg. Ha nem létezik, létre kell hozni. Drupal 5 használata esetén az alapértelmezése a következő.

<div class="comment<?php print ($comment->new) ? ' comment-new' : ''; print ($comment->status == COMMENT_NOT_PUBLISHED) ? ' comment-unpublished' : ''; ?> clear-block">
  <?php print $picture ?>
 
<!-- módosítandó rész eleje -->
<?php if ($comment->new) : ?>
  <a id="new"></a>
  <span class="new"><?php print $new ?></span>
<?php endif; ?>
<!-- vége -->
 
  <h3><?php print $title ?></h3>
 
  <div class="submitted">
    <?php print $submitted ?>
  </div>
 
  <div class="content">
    <?php print $content ?>
  </div>
 
  <?php print $links ?>
</div>

A megjegyzésekkel jelölt részt kell módosítani a következőre.

if ($comment->new) {
  if ($numnew == 1) {
    print '<a id="new"></a>';
  }
  print '<span class="new"><a name="new' . $numnew . '" '.
   'title="következő olvasatlan hozzászólás" href="#new' . ($numnew+1) . '">' . $new . '</a></span>';
}

Ezzel ha új hozzászólást látunk, és az első új hozzászólásról van szó, akkor a new horgornyt rakjuk le. Különben egy new5 típusú horgonyt, ahol 5 az új hozzászólások közötti sorszám. A következő új hozzászólásra linkeljük a feliratot.