Aktiv forumtemak block modositasa

zoliky képe

A drupal alapu oldalamon van egy block amely az aktiv forumtemakat jeleniti meg. Mukodik jol csak szeretnek egy kis modositast, pontosabban igy szeretnem kilistazni az adatokat:

+ Aktiv forumtemak +
Konyvtar torlese (1 new)
Problemamentes szerver-szolgaltatok (2 new)
Drupal 6 problema (1 new)

Persze az adatokat csak a regisztralt felhasznalo kene lasa, es ha lehet a $topic->num_comments valtozobol kene kiszedni oket.

Akartam regen is ilyesmit csinalni csak sajnos nem akartam belenyulni a CORE-ba. Most, hogy letezik a drupal 6 preprocess gondolom konyebben megoldhato!

Most fogalmam sincs melyik fajlot kene szerkezteni. A modules/forum/forum.module fajlba a kovetkezo lathato:

/**
 * Implementation of hook_block().
 *
 * Generates a block containing the currently active forum topics and the
 * most recently added forum topics.
 */
function forum_block($op = 'list', $delta = 0, $edit = array()) {
  switch ($op) {
    case 'list':
      $blocks[0]['info'] = t('Active forum topics');
      $blocks[1]['info'] = t('New forum topics');
      return $blocks;
 
    case 'configure':
      $form['forum_block_num_'. $delta] = array('#type' => 'select', '#title' => t('Number of topics'), '#default_value' => variable_get('forum_block_num_'. $delta, '5'), '#options' => drupal_map_assoc(array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)));
      return $form;
 
    case 'save':
      variable_set('forum_block_num_'. $delta, $edit['forum_block_num_'. $delta]);
      break;
 
    case 'view':
      if (user_access('access content')) {
        switch ($delta) {
          case 0:
            $title = t('Active forum topics');
            $sql = db_rewrite_sql("SELECT n.nid, n.title, l.comment_count, l.last_comment_timestamp FROM {node} n INNER JOIN {term_node} tn ON tn.vid = n.vid INNER JOIN {term_data} td ON td.tid = tn.tid INNER JOIN {node_comment_statistics} l ON n.nid = l.nid WHERE n.status = 1 AND td.vid = %d ORDER BY l.last_comment_timestamp DESC");
            $result = db_query_range($sql, variable_get('forum_nav_vocabulary', ''), 0, variable_get('forum_block_num_0', '5'));
            $content = node_title_list($result);
            break;
 
          case 1:
            $title = t('New forum topics');
            $sql = db_rewrite_sql("SELECT n.nid, n.title, l.comment_count FROM {node} n INNER JOIN {term_node} tn ON tn.vid = n.vid INNER JOIN {term_data} td ON td.tid = tn.tid INNER JOIN {node_comment_statistics} l ON n.nid = l.nid WHERE n.status = 1 AND td.vid = %d ORDER BY n.nid DESC");
            $result = db_query_range($sql, variable_get('forum_nav_vocabulary', ''), 0, variable_get('forum_block_num_1', '5'));
            $content = node_title_list($result);
            break;
        } 

Engemet valoszinuleg a CASE 1 erdekel, mert az kezeli az adatok kilistazasat. Ugy veszem eszre, hogy az adatok a $result es a $content valtozokba kerulnek.

Nos ezek utan mit kene csinalni ? Letezik egy specialis preprocess fuggveny ami felhasznalhato szamomra ? Elnezest a buta kerdesekert de tenyleg elakadtam!

Orulnek par otletnek. Koszonom!

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Drupal verzió: 
Fórum: 
zoliky képe

Kibogoztam, hogy a kovetkezo fuggveny listaza az adatokat:

function node_title_list($result, $title = NULL) {
  $items = array();
  $num_rows = FALSE;
  while ($node = db_fetch_object($result)) {
    $items[] = l($node->title, 'node/'. $node->nid, !empty($node->comment_count) ? array('attributes' => array('title' => format_plural($node->comment_count, '1 comment', '@count comments'))) : array());
    $num_rows = TRUE;
  }
 
  return $num_rows ? theme('node_list', $items, $title) : FALSE;
}

Ha kicserelem az $items[] valtozo tartalmat igy:

$items[] = l($node->title '('.$topic->num_comments.')', 'node/'. $node->nid, !empty($node->comment_count) ? array('attributes' => array('title' => format_plural($node->comment_count, '1 comment', '@count comments'))) : array());

Itt gondolom a $topic->num_comments nem egyezik, mert nem helyes az SQL lekeres, ugye ? Hat akkor elege bonyorult a dolog ? Letre kell hozak egy kulon SQL lekerest ?

0
0
zoliky képe

Esetleg meg tudnatok mondani, hogy kell modositani a "node_title_list" fuggvenyt anelkul, hogy a CORE-ba irjak valamit?

0
0
Pasqualle képe

$topic->num_comments?? ezt honnan vetted. semmi ilyesmi valtozot nem latok meg a kozelben sem.. attol, hogy valamit hasrautes szeruen beleirsz a kodba attol meg nem fog ugy mukodni ahogy elkepzeled..

igen, ezt sajat SQL lekerdezessel meg tudod oldani. az 'Active forum topics'-ban nincs semmi ami megmondana, hogy mennyi az uj hozzaszolas, es nincs ra egyszeru modszer, hogy ezt az informaciot hozzaadd..

0
0
zoliky képe

jo de legalabb akkor a commentek szamat kene kinyomni, amit a title tag mar tartalmaz! (a regi weblaboron mukodott igy).
csak azt nem tudom, hogy lehet megoldani CORE modositas nelkul. Valahogy a "node_title_list" fuggvenyhez kene ferni. preprocess, phptemplate?

0
0
Pasqualle képe

azt hiszem a devel modulban levo theme developer pontosan megmondana, hogy milyen sminkeleseket alkalmazhatsz az adott elemre (blokkra, listara)..

a template.php-ban keszits egy sminknev_node_list($items) fuggvenyt ahol az $items tombben a linkek vannak ilyen formaban:

<a title="4 hozzászólás" href="/forum/aktiv-forumtemak-block-modositasa">Aktiv forumtemak block modositasa</a>

sajnos a title es a href nincs kulon valtozoban ezert ezt mar csak php-s string muveletekkel tudod modositani az altalad kivant formara..
0
0
zoliky képe

Ezt szeretnem hasznalni:

$items[] = l($node->title.'('.$node->comment_count.')', 'node/'. $node->nid, !empty($node->comment_count) ? array('attributes' => array('title' => format_plural($node->comment_count, '1 comment', '@count comments'))) : array());

A lenyeg szerintem benne van, de nem szeretnek a CORE-ba belenyulni! Es ha igy irom be a phptemplate.php fajlba nem mukodik: sminknev_node_list($items)

Egyebkent itt node_title_list-rol van szo.

0
0
crt képe

Szia.

Kicsit összekevered a dolgokat... Először is a template.php fájlba kell beírnod, ahogy Pasqualle is írta és a sminknev_node_list($items) függvényt kell használnod. A paraméterként átadott $items egy tömb, tehát valamilyen ciklussal végig kell menned az elemein valahogy így:

function sminknev_node_list($items, $title = NULL) {
  ...
  ciklus, ahol módosítod a kívánt elemeket az $items tömbben
  ...
  return theme('item_list', $items, $title);
}

A $topic->num_comments változó én sem értem, hogy került a képbe, esetleg van olyan ezzel kapcsolatos kód, amit nem másoltál be?
A cache-t is célszerű lehet törölni a kód módosításakor.

Üdv: Zoli

0
0
zoliky képe

Ok, koszonom megprobalom!

0
0
dióhéj képe

én lehet, hogy inkább views-zal bohóckodnék...az eredetit kikapcsolnám, létrehoznék egy másikat, annak meg azt mondok amit csak akarok...

0
0
zoliky képe

Igen csak olyan sok modulom van bekapcsolva, hogy ha lehet nem terhelnem feleslegesen az oldalt. Peldaul ilyen apro modositasokert inkabb template fajlba raknam.

0
0
zoliky képe

Megprobaltam a sajat eszem szerint megirni:

function progra_node_list($items, $title = NULL) {
  foreach ($items as $key => $value) {
    $items[$key] = $value . ' ('.$node->comment_count.')';
  }
 
  return theme('item_list', $items, $title);
}

Az a gond, hogy a $node->comment_count nem erheto el es ez logikus, mert nem csinalok SQL lekerest, a tombot megkapom keszen.

Az a problema, hogy az adatot nem tudom kihalaszni, a print_r($items) csak a tombok nevet listaza abbol pedig nem latom a hozaszolasok szamat.

0
0
Pasqualle képe

function progra_node_list($items) {
  if (!empty($items)) {
    foreach ($items as $key => $anchor) {
      $titlepos = strpos($anchor, 'title');
      if ($titlepos) !== FALSE) {
        $quote_mark_left = strpos($anchor, '"', $titlepos + 1);
        $quote_mark_right = strpos($anchor, '"', $quote_mark_left + 1);
 
        $comment_count = substr($anchor, $quote_mark_left +1, $quote_mark_right - $quote_mark_left -1);
 
        $items[$key] = $anchor . ' ('. $comment_count .')';
      }
    }
  }
 
  return theme('item_list', $items);
}

a kodot nem probaltam ki. a sok strpos-t helyettesiteni lehet preg_replace() fuggvennyel..

0
0
zoliky képe

Koszonom szepen! Az adatokat a HTML title-bol szedi ki ?

0
0
Pasqualle képe

igen

0
0
zoliky képe

Az a baj, hogy egyes temaknal nincs TITLE tag, peldaul azoknal amelyeknel nincs valasz. Ilyen helyzetben (0)-at kell megjelenite csak nem tudom hogyan :)

0
0
Pasqualle képe

function progra_node_list($items) {
  if (!empty($items)) {
    foreach ($items as $key => $anchor) {
      $titlepos = strpos($anchor, 'title');
      if ($titlepos) !== FALSE) {
        $quote_mark_left = strpos($anchor, '"', $titlepos + 1);
        $quote_mark_right = strpos($anchor, '"', $quote_mark_left + 1);
 
        $comment_count = substr($anchor, $quote_mark_left +1, $quote_mark_right - $quote_mark_left -1);
 
        $items[$key] = $anchor .' ('. $comment_count .')';
      }
      else {
        $items[$key] = $anchor .' (0)';
      }
    }
  }
 
  return theme('item_list', $items);
}
0
0
zoliky képe

Koszonom mukodik! Egyebkent ha valaki szeretne hasznalni a kodot, meg kell emlitenem, hogy az IF hibas.

A hibas resz:

if ($titlepos) !== FALSE) {
 //kod
}

Ki kell cserelni igy:

if ($titlepos !== FALSE) {
 //kod
}

Most azon dolgozok, hogy az "(1 comment)" helyet csak ezt irja ki -> (1).
Esetleg tudnal adni egy otletet a sok PHP fuggveny kozul melyik a legalkalmasabb, hogy levagjam a "comment" szoveget a $comment_count valtozobol?

Ha jol emlekszem a regex elege lassu ilyesmire, talan jobb mast hasznalni.

0
0
pp képe

persze csak akkor működik, ha nincs zárójel, ha van akkor meg

preg_replace('!\\((\\d+).*?\\)!','(\\1)',$szoveg);
0
0
zoliky képe

function progra_node_list($items) {
  if (!empty($items)) {
    foreach ($items as $key => $anchor) {
      $titlepos = strpos($anchor, 'title');
      if ($titlepos !== FALSE) {
        $quote_mark_left = strpos($anchor, '"', $titlepos + 1);
        $quote_mark_right = strpos($anchor, '"', $quote_mark_left + 1);
 
        $comment_count = substr($anchor, $quote_mark_left +1, $quote_mark_right - $quote_mark_left -1);
 
        $items[$key] = $anchor .' ('. $comment_count[0] .')';
      }
      else {
        $items[$key] = $anchor .' (0)';
      }
    }
  }
 
  return theme('item_list', $items);
}

Igy mukodik de az a $comment_count[0] reszt talalomra nyomtam be, remelem nem okoz gondokat!

preg_replace furcsa modon nem akart mukodni

0
0
zoliky képe

Az (int) typecast valtozat is mukodne:

$items[$key] = $anchor .' ('. (integer)$comment_count .')';

De sajnos meg nem vagyok olyan szinten, hogy megmondjam ha jo ezt hasznalni, biztonsagi es minosegi szempontbol. A minosegi szempont az, hogy ne legyen problemam es hibas adatokat listazon kesobb! Elnezest, hogy ilyen "szor szal hasogato" vagyok, csak szeretnem ha mukodne rendesen :)

0
0
Pasqualle képe

function progra_node_list($items) {
  if (!empty($items)) {
    foreach ($items as $key => $anchor) {
      $titlepos = strpos($anchor, 'title');
      if ($titlepos !== FALSE) {
        $quote_mark_left = strpos($anchor, '"', $titlepos + 1);
        $first_space = strpos($anchor, ' ', $quote_mark_left + 1);
 
        $comment_count = substr($anchor, $quote_mark_left +1, $first_space - $quote_mark_left -1);
 
        $items[$key] = $anchor .' ('. $comment_count .')';
      }
      else {
        $items[$key] = $anchor .' (0)';
      }
    }
  }
 
  return theme('item_list', $items);
}
0
0
zoliky képe

Remelem nem koveztek meg, nem kerek kodot, csak egy "utolso" tanacsra van szuksegem :)
Azt szeretnem ha valaki raklikel a szarojeles szamra akkor nyisa meg a temat. Most a kovetkezot tudnam csinalni:

$linkpos = strpos($anchor, 'href');

Megkapom a linket es azt is kiiratom valahogy igy <a href="/node/4">(5)</a>
Vagy esetleg van jobb otlet a megoldashoz?

0
0
crt képe

Ha jól értettem, akkor így szeretnéd?

function progra_node_list($items) {
  if (!empty($items)) {
    foreach ($items as $key => $anchor) {
      preg_match('/title="(\d+).*"/i', $anchor, $m);
      $comment_count = ($m[1]) ? $m[1] : 0;
      $items[$key] = preg_replace('/(^.*>)(.+)(<\/a>.*$)/', '${1}${2} ('.$comment_count.') ${3}', $anchor);
    }
  }
 
  return theme('item_list', $items);
}

Üdv: Zoli

0
0
Pasqualle képe

na most vetted el a programozoi kedvét :)

a kod jonak tunik..

0
0
zoliky képe

kemeny ez a kod :) mukodik!
egyebkent koszi mindenkinek!

0
0