Jump to content
InvisionCommunity.de - Der Deutsche Invision Community Support
Sign in to follow this  
AliCremerU333

[Request] Mod "Unbeantwortete Themen anzeigen"

Recommended Posts

Moin moin,

von meinem Mod-Team wurde an mich herangetragen, daß es im Board eine Funktion geben sollte, die alle unbeantworteten Themen auflistet analog zur normalen Funktion "Aktive Themen der letzten 24h". Und ich muß gestehen, daß ich eine solche Funktion auch für sehr nützlich empfinden würde.

Aufgelistet werden sollen alle Threads, die noch keine einzige Antwort enthalten, unabhängig vom Erstellungsdatum der Threads. Dabei sollten die Foren-Zugriffsrechte genauso wie bei den "Aktiven Themen der letzten 24h" berücksichtigt werden.

Wäre sehr nett, wenn Stefan oder Christian dies als Mod für IPB 1.3 realisieren könnten. Ist aber nicht so furchtbar dringend. Vielen Dank schonmal im Voraus ... :)

Gruß,

AC

Share this post


Link to post

Wäre sehr nett, wenn Stefan oder Christian dies als Mod für IPB 1.3 realisieren könnten.

Naja, kommt drauf an, was du dir genau vorstellst. ;)

Ansonsten öffne mal die Search.php und suche in der Funktion get_active folgende Stelle:

 	 $query = "SELECT DISTINCT(t.tid)
      FROM ibf_posts p
        LEFT JOIN ibf_topics t ON ( t.approved=1 and p.topic_id=t.tid)
      WHERE p.post_date BETWEEN ".$this->st_stamp." AND ".$this->end_stamp."
        AND p.forum_id IN($forums)
        AND p.queued <> 1
      ORDER BY t.last_post DESC
      LIMIT 0,200";
Ersetze durch:
 	 $eq = "";
 
 if ($ibforums->input['mode'] == 'noanswers')
 {
   $eq = "AND t.posts = '0'";
 }

 $query = "SELECT DISTINCT(t.tid)
      FROM ibf_posts p
        LEFT JOIN ibf_topics t ON ( t.approved=1 and p.topic_id=t.tid)
      WHERE p.post_date BETWEEN ".$this->st_stamp." AND ".$this->end_stamp."
        AND p.forum_id IN($forums)
        AND p.queued <> 1 $eq
      ORDER BY t.last_post DESC
      LIMIT 0,200";
Anschließend suchst du in der gleichen Funktion noch folgende Stelle
$this->output .= $this->html->active_start( array( 'SHOW_PAGES' => "" ) );
und ersetzt es mit
$this->output .= $this->html->active_start( array( 'SHOW_PAGES' => "", 'mode' => $ibforums->input['mode'] ) );
Anschließend noch diese Stelle
$this->output .= $this->html->active_start( array( 'SHOW_PAGES' => $links) );
mit dieser ersetzen
$this->output .= $this->html->active_start( array( 'SHOW_PAGES' => $links, 'mode' => $ibforums->input['mode'] ) );
Dann kurz in der skin_search.php
<form action='{$ibforums->base_url}act=Search&amp;CODE=getactive' method='post' name='dateline' onsubmit='return checkvalues();'>
ersetzen durch
<form action='{$ibforums->base_url}act=Search&amp;CODE=getactive&amp;mode={$data['mode']}' method='post' name='dateline' onsubmit='return checkvalues();'>

Nun kannst du mit index.php?act=Search&CODE=getactive&mode=noanswers die gewünschten Themen auflisten lassen. ;)

Sollte soweit klappen. :)

Share this post


Link to post

Oh, ging ja fix. :)

Ich will die Funktion "Aktive Themen der letzten 24h" nicht ersetzen. Die soll parallel dazu erhalten bleiben und die Funktion für unbeantwortete Beiträge soll nur zusätzlich zur Verfügung stehen und genauso funktionieren wie "Aktive Themen der letzten 24h", also auch mit Auswahlmöglichkeit des Zeitraums und Anzeige der unbeantworteten Threads als Themenansicht. ;)

Ich hoffe, ich habe mich jetzt verständlicher ausgedrückt. :unsure:

Gruß,

AC

PS:

$this->output .= $this->html->active_start( array( 'SHOW_PAGES' => $links) );
und
$this->output .= $this->html->active_start( array( 'SHOW_PAGES' => $links, 'mode' => $ibforums->input['mode'] ) );
müßten so lauten:
$this->output .= $this->html->end( array( 'SHOW_PAGES' => $links ) );
zu
$this->output .= $this->html->end( array( 'SHOW_PAGES' => $links, 'mode' => $ibforums->input['mode'] ) );

Edited by AliCremerU333

Share this post


Link to post

Ich will die Funktion "Aktive Themen der letzten 24h" nicht ersetzen.

Hab ich gesagt, das sie ersetzt wird?

Die Funktion wurde nur erweitert, so das man mit dem optionalen Parameter mode den von dir gewünschten Effekt erhält. Also im Klartext, steht dir die Funktion zusätzlich zur Verfügung. ;)

Und dein Nachtrag bezüglich der Änderung versteh ich nicht und macht in meinen Augen keinen Sinn. Es muß schon die Skinfunktion active_start geändert werden, so wie ich es beschrieben habe, damit man nach Auswahl des Zeitraumes immer noch in diesem Modus bleibt.

Hast du dir die Sache überhaupt mal genau angeschaut? ;):lol: :P

Share this post


Link to post

Natürlich habe ich mir die Sache angeschaut und deshalb habe ich ja den Nachtrag verfaßt! ;)

Ich habe vermutet, daß dir nur ein kleiner Fehler bei Copy & Paste unterlaufen ist.

$this->output .= $this->html->active_start( array( 'SHOW_PAGES' => $links) );
Diese Stelle existiert bei mir in der Search.php nämlich nicht. Stattdessen ist diese hier
$this->output .= $this->html->end( array( 'SHOW_PAGES' => $links ) );

vorhanden. Deshalb meine Anmerkung. ;)

Gruß,

AC

Share this post


Link to post

Also in der Search.php der Version 1.3 Final in der Funktion get_active gibt es die Stelle. ;)

function get_active() {

  global $ibforums, $DB, $std, $HTTP_POST_VARS;

  //------------------------------------

  // If we don't have a search ID (searchid)

  // then it's a fresh query.

  //

  //------------------------------------

  if (! isset($ibforums->input['searchid']) )

  {

  //------------------------------------

  // Do we have any start date input?

  //------------------------------------

  if ($ibforums->input['st_day'] == "")

  {

    // No? Lets work out the start date as 24hrs ago

    $ibforums->input['st_day'] = 1;

    $this->st_stamp = time() - (60*60*24);

  }

  else

  {

    $ibforums->input['st_day'] = preg_replace( "/s/", "", $ibforums->input['st_day']);

    $this->st_stamp = time() - (60*60*24*$ibforums->input['st_day']);

  }

  //------------------------------------

  // Do we have any END date input?

  //------------------------------------

  if ($ibforums->input['end_day'] == "")

  {

    // No? Lets work out the end date as now

    $this->end_stamp = time();

    $ibforums->input['end_day'] = 0;

  }

  else

  {

    $ibforums->input['end_day'] = preg_replace( "/e/", "", $ibforums->input['end_day']);

    $this->end_stamp = time() - (60*60*24*$ibforums->input['end_day']);

  }

  //------------------------------------

  // Synchronise our input data

  //------------------------------------

  $ibforums->input['forums'] = 'all';

  $forums = $this->get_searchable_forums();

  //------------------------------------

  // Do we have any forums to search in?

  //------------------------------------

  if ($forums == "")

  {

    $std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_search_forum') );

  }

  $query = "SELECT DISTINCT(t.tid)

      FROM ibf_posts p

        LEFT JOIN ibf_topics t ON ( t.approved=1 and p.topic_id=t.tid)

      WHERE p.post_date BETWEEN ".$this->st_stamp." AND ".$this->end_stamp."

        AND p.forum_id IN($forums)

        AND p.queued <> 1

      ORDER BY t.last_post DESC

      LIMIT 0,200";

  //------------------------------------------------

  // Get the topic ID's to serialize and store into

  // the database

  //------------------------------------------------

  $DB->query($query);

  $max_hits = $DB->get_num_rows();

  $topics = "";

  while ($row = $DB->fetch_row() )

  {

    $topics .= $row['tid'].",";

  }

  $DB->free_result();

  $topics = preg_replace( "/,$/", "", $topics );

  //------------------------------------------------

  // Do we have any results?

  //------------------------------------------------

  if ($topics == "")

  {

    $this->output .= $this->html->active_start( array( 'SHOW_PAGES' => "" ) );

    $this->output .= $this->html->active_none();

    $this->output .= $this->html->end("");

    $this->page_title = $ibforums->lang['search_results'];

    $this->nav        = array( "<a href='{$this->base_url}&act=Search'>{$ibforums->lang['search_form']}</a>", $ibforums->lang['search_title'] );

    return ""; // return empty handed

  }

  //------------------------------------------------

  // If we are still here, store the data into the database...

  //------------------------------------------------

  $unique_id = md5(uniqid(microtime(),1));

  $str = $DB->compile_db_insert_string( array (

              'id'        => $unique_id,

              'search_date'=> time(),

              'topic_id'  => $topics,

              'topic_max'  => $max_hits,

              'sort_key'  => $this->sort_key,

              'sort_order' => $this->sort_order,

              'member_id'  => $ibforums->member['id'],

              'ip_address' => $ibforums->input['IP_ADDRESS'],

              )        );

  $DB->query("INSERT INTO ibf_search_results ({$str['FIELD_NAMES']}) VALUES ({$str['FIELD_VALUES']})");

  }

  else

  {

  //------------------------------------------------

  // We have a search ID, so lets get the parsed results.

  // Delete old search queries (older than 24 hours)

  //------------------------------------------------

  $t_time = time() - (60*60*24);

  $this->first = intval($ibforums->input['st']) != "" ? intval($ibforums->input['st']) : 0;

  $DB->query("DELETE FROM ibf_search_results WHERE search_date < '$t_time'");

  $unique_id = $ibforums->input['searchid'];

  $DB->query("SELECT * FROM ibf_search_results WHERE id='$unique_id'");

  $sr = $DB->fetch_row();

  $topics  = $sr['topic_id'];

  $max_hits = $sr['topic_max'];

  $this->sort_order = $sr['sort_order'];

  $this->sort_key  = $sr['sort_key'];

  if ($topics == "")

  {

    $std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_search_results' ) );

  }

  }

  // Our variables are centralised, lets get the array slice depending on our $this->first

  // position.

  $topic_string = implode( "," , array_slice( explode(",",$topics), $this->first, 25 ) );

  $topic_string = str_replace(  " "  , "", $topic_string );

  $topic_string = preg_replace( "/,$/", "", $topic_string );

  $url_words = urlencode(trim($keywords));

  $links = $std->build_pagelinks( array( TOTAL_POSS  => $max_hits,

              PER_PAGE    => 25,

              CUR_ST_VAL  => $this->first,

              L_SINGLE    => "",

              L_MULTI    => $ibforums->lang['search_pages'],

              BASE_URL    => $this->base_url."act=Search&CODE=getactive&searchid=$unique_id",

            )

          );

  $this->output .= $this->html->active_start( array( 'SHOW_PAGES' => $links ) );

  // Regex in our selected values.

  $this->output = preg_replace( "/(<option value='s".$ibforums->input['st_day']."')/" , "\\1 selected", $this->output );

  $this->output = preg_replace( "/(<option value='e".$ibforums->input['end_day']."')/", "\\1 selected", $this->output );

  $DB->query("SELECT t.*, f.id as forum_id, f.name as forum_name

              FROM ibf_topics t, ibf_forums f

              WHERE t.tid IN($topic_string) and f.id=t.forum_id

              ORDER BY ".$this->sort_key." ".$this->sort_order." LIMIT 0,25");

  while ( $row = $DB->fetch_row() )

  {

  $row['keywords'] = $url_words;

  $this->output .= $this->html->RenderRow( $this->parse_entry($row) );

  }

  $this->page_title = $ibforums->lang['search_results'];

  $this->nav        = array( "<a href='{$this->base_url}act=Search'>{$ibforums->lang['search_form']}</a>", $ibforums->lang['search_title'] );

  $this->output .= $this->html->end( array( 'SHOW_PAGES' => $links ) );

}

Hab die beiden Stellen, die dementsprechend geändert werden müssen, rot markiert. ;)

Wobei die untere Stelle, die ist, die du angeblich nicht hast. :)

Share this post


Link to post

Hm, in meiner im Board eingesetzten Search.php gibt's die Stelle tatsächlich nicht. Aaaaaber nur, weil dort bereits eine andere Modifikation ist (natürlich mal wieder ohne Kommentare und damit nicht als geändert ersichtlich <_< ).

Habe mir eben die originale Search.php aus dem Download vorgenommen und was soll ich sagen ... :doh::wallbash::w00t:

Danke Stefan, das Problem sitzt wie immer vor dem Bildschirm! :lol:

Das ist das erste Mal, daß ich beim Einbau eines Mods einen Fehler (und noch dazu solch einen!!!) gemacht habe. Ich sollte sowas wohl zukünftig nicht mehr nach einem langen Arbeitstag machen ... :teehee:

Gruß,

AC

EDIT: Funktioniert wunderbar und so wie gewünscht. Prima und vielen Dank! :)

Edited by AliCremerU333

Share this post


Link to post

Also ich hab es gestern ausgiebig getestet und es hat ohne Probleme funktioniert. Du kannst mir deine Datei mal zuschicken, dann schau ich sie mir an, aber da ich noch nicht zu Hause bin und dies auch in den nächsten Stunden nicht der Falls ein wird, kann es bis morgen dauern.

Oder du postest deine geänderte Funktion get_active mal hier rein, vielleicht komme ich noch kurz dazu einen Blick drüber zu werfen. ;)

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×