Přeskočit přímo na text


Blok se souvisejícími články

Kategorie: Jak na to?
Týká se verze: Drupal 6.x

Ahoj všichni… potřebuji vytvořit blok, kde na odpovídající stránce termínu taxonomy zobrazím uzly z příbuzných taxonomy termínů. Něco jako mohlo by vás také zajímat. Předem dík za vaše nápady..

 

Řešení

Kdyby to někdy někdo potřeboval, tak jsem to vyřešil přes views za pomoci argumentu Kategorie: Term ID a php

<?php
if (arg(1) && is_numeric(arg(1))) {
  $tid = (int)arg(1);
  $result = db_query(db_rewrite_sql('SELECT tid FROM {term_relation} INNER JOIN {term_data} ON (tid1 = tid OR tid2 = tid) WHERE (tid1 = %d OR tid2 = %d) AND tid != %d'), $tid, $tid, $tid);
  $output = '';
  while ($term = db_fetch_object($result))
  {
    $output .= $term->tid;
((!empty($output)) ? '+' : '') . ($term->tid);
  }
  return $output;
}
?>

Zvaz tez

Podelim sa s kuskom kodu

Podelim sa s kuskom kodu z jedneho projektu co som vymyslel. Ako related sa povazuju tie node ktore maju spolocne najviac termov z taxonomie. Samozrejme to vyzaduje aby boli dokladne otagovane. (Tuna islo o dve az tri taxonomie pre kazdy node.) Samozrejme by sa to dalo vylepsit – napriklad o prioritu na urcite vocabulary a podobne ale funguje to celkom pekne.

<?php

/**
 * Block for Related posts in node page.
 */
function mymodule_block_related_posts() {
  $node = menu_get_object();

  if (!$node) {
    return '';
  }
  else {
    $tax = taxonomy_node_get_terms($node);
    $tids = array_keys($tax);

    // to find all related nodes together
    $result = mymodule_get_related_posts($tids, $node->nid);
    // fetch all of the nodes
    $nodes = array();
    while ($obj = db_fetch_object($result)) {
      // get info from the node
      $nodes[] = node_load(array('nid' => $obj->nid));
    }

    return theme('mymodule_block_related_posts', $nodes);
  }
}

/**
 * Return array of nids related with current node.
 *
 * @see taxonomy_select_nodes() function in D6 API
 */
function mymodule_get_related_posts($tids, $nid , $order = 'COUNT(n.nid) DESC, created DESC') {
  $result = NULL;

  if (count($tids) > 0) {
    // For each term ID, generate an array of descendant term IDs to the right depth.
    $descendant_tids = array();
    foreach ($tids as $index => $tid) {
      $term = taxonomy_get_term($tid);
      $tree = taxonomy_get_tree($term->vid, $tid, -1, 0);
      $descendant_tids[] = array_merge(array($tid), array_map('_taxonomy_get_tid_from_term', $tree));
    }

    $args = call_user_func_array('array_merge', $descendant_tids);
    $placeholders = db_placeholders($args, 'int');
    $args[] = $nid;

    // get related nodes, prioritize if there is higher number of matching term
    $sql = "SELECT COUNT(n.nid), n.nid
            FROM {node} n
            INNER JOIN {term_node} tn ON n.vid = tn.vid
            WHERE tn.tid IN (". $placeholders .") AND n.status = 1 AND n.nid != %d
            GROUP BY n.nid
            ORDER BY ". $order ." LIMIT 0, 5";
    $sql = db_rewrite_sql($sql);
    $result = db_query($sql, $args);
  }

  return $result;
}
?>

Dolezita je ta druha funkcia. theme() funkciu som nerozpisoval, vystup si snad upravite sami.

malá oprava

<?php
if (arg(1) && is_numeric(arg(1))) {
  $tid = (int)arg(1);
  $result = db_query(db_rewrite_sql('SELECT tid FROM {term_relation} INNER JOIN {term_data} ON (tid1 = tid OR tid2 = tid) WHERE (tid1 = %d OR tid2 = %d) AND tid != %d'), $tid, $tid, $tid);
  $output = '';
  while ($term = db_fetch_object($result))
  {
    $terms[] = $term->tid;
  }
  return implode($terms,'+');
}
?>

původní verze špatně fungovalo při více příbuzných termínech

Poslat nový komentář

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.
  • You can use Texy! to format and alter entered content.
  • Povolené HTML značky: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <p> <br> <b> <i> <h2> <img> <pre> <sup> <sub> <pre class="php"> <span class="php-keyword1"> <span class="php-var"> <span class="php-num"> <img class="screenshot"> <p class="beginner"> <a class="greybox"> <h3> <h4>

Více informací o možnostech formátování

Type the characters you see in this picture. (verify using audio)
Type the characters you see in the picture above; if you can't read them, submit the form and a new image will be generated. Not case sensitive.

Hledat

Přihlášení

Bezpečnost Drupalu

Z hlediska bezpečnosti je Drupal na velmi vysoké úrovni, díky propracovanému systému hlášení, prověřování a řešení možných problémů.

Čtěte více a odebírejte bezpečnostní aktuality

Poslední komentáře

Kdo je online

Momentálně je online 0 uživatelů a 0 hostů.