Seite 1 von 1

Spezielle Sortierung in speziellen Foren

Verfasst: Fr 17.Feb, 2012 08:41
von Holger
Hallo,

ich möchte in einigen Foren eine alphabetische Sortierung als Standard haben.
Leider habe ich keinen Mod gefunden, aber dieses Snippet:

Code: Alles auswählen

// Sort topics alphabetically
if ($forum_id == 25)
{
    $sort_by_text = array('t' => $user->lang['TOPIC_TITLE']);
    $sort_by_sql = array('t' => 't.topic_title');
    $sort_dir = 'a';
}
Das soll in viewforum.php eingefügt werden vor:

Code: Alles auswählen

// Limit topics to certain time frame, obtain correct topic count
Also so:

Code: Alles auswählen

// Topic ordering options
$limit_days = array(0 => $user->lang['ALL_TOPICS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);

$sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 'r' => $user->lang['REPLIES'], 's' => $user->lang['SUBJECT'], 'v' => $user->lang['VIEWS']);
$sort_by_sql = array('a' => 't.topic_first_poster_name', 't' => 't.topic_last_post_time', 'r' => 't.topic_replies', 's' => 't.topic_title', 'v' => 't.topic_views');

$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param, $default_sort_days, $default_sort_key, $default_sort_dir);

// Sort topics alphabetically
if ($forum_id == 25)
{
    $sort_by_text = array('t' => $user->lang['TOPIC_TITLE']);
    $sort_by_sql = array('t' => 't.topic_title');
    $sort_dir = 'a';
}

// Limit topics to certain time frame, obtain correct topic count
Es klappt gut, aber leider generiert es einen SQL-Fehler sobald ich die Sortierung im Seitenfuss ändere.

Wie könnte ich anders den Standard für die Sortierung in einzelnen Foren ändern?

Gruss
Holger

Re: Spezielle Sortierung in speziellen Foren

Verfasst: Fr 17.Feb, 2012 09:08
von oxpus
Wie lautet denn der Fehler?
Vielleicht kann man darüber den Fehler finden...

Re: Spezielle Sortierung in speziellen Foren

Verfasst: Fr 17.Feb, 2012 09:23
von Holger
General Error
SQL ERROR [ mysqli ]

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ASC LIMIT 127' at line 7 [1064]

SQL

SELECT t.topic_id FROM phpbb3_topics t WHERE t.forum_id = 25 AND t.topic_type IN (0, 1) AND t.topic_approved = 1 ORDER BY t.topic_type DESC, ASC LIMIT 127

BACKTRACE

FILE: [ROOT]/includes/db/mysqli.php
LINE: 182
CALL: dbal->sql_error()

FILE: [ROOT]/includes/db/mysqli.php
LINE: 224
CALL: dbal_mysqli->sql_query()

FILE: [ROOT]/includes/db/dbal.php
LINE: 170
CALL: dbal_mysqli->_sql_query_limit()

FILE: [ROOT]/viewforum.php
LINE: 462
CALL: dbal->sql_query_limit()

Re: Spezielle Sortierung in speziellen Foren

Verfasst: Fr 17.Feb, 2012 18:48
von oxpus
Kannst du dann mal bitte die SQL-Anweisung posten, die in der viewtopic.php vor Zeile 462 steht?
Dort ist eine Variable eingetragen, die zum besagten Zeitpunkt nicht gesetzt ist, so dass der Fehler angezeigt wird...

Re: Spezielle Sortierung in speziellen Foren

Verfasst: Mo 20.Feb, 2012 08:50
von Holger
:anbet

Code: Alles auswählen

// Grab just the sorted topic ids
$sql = 'SELECT t.topic_id
	FROM ' . TOPICS_TABLE . " t
	WHERE $sql_where
		AND t.topic_type IN (" . POST_NORMAL . ', ' . POST_STICKY . ")
		$sql_approved
		$sql_limit_time
	ORDER BY t.topic_type " . ((!$store_reverse) ? 'DESC' : 'ASC') . ', ' . $sql_sort_order;
$result = $db->sql_query_limit($sql, $sql_limit, $sql_start);

while ($row = $db->sql_fetchrow($result))
{
	$topic_list[] = (int) $row['topic_id'];
}
$db->sql_freeresult($result);

Re: Spezielle Sortierung in speziellen Foren

Verfasst: Mo 20.Feb, 2012 12:24
von oxpus
Dort ist $sql_sort_order eingetragen, die du nicht in deinem Code definiert. Die ist dann klar nicht gesetzt und führt dann zum besten Fehler.

Re: Spezielle Sortierung in speziellen Foren

Verfasst: Mo 20.Feb, 2012 13:29
von Holger
Sollte das dann so in diesem Stil sein?

Code: Alles auswählen

// Sort topics alphabetically
if ($forum_id == 25)
{
    $sort_by_text = array('t' => $user->lang['TOPIC_TITLE']);
    $sort_by_sql = array('t' => 't.topic_title');
    $sort_dir = 'a';
    $sql_sort_order = 'ASC';
}

Re: Spezielle Sortierung in speziellen Foren

Verfasst: Mo 20.Feb, 2012 13:51
von oxpus
Schau doch mal in der viewtopic.php nach, was die Variable eigentlich beinhalten soll. Dort wäre doch eigentlich ein weiteres Feld genannt, nach dem sortiert werden soll.
Und genau das willst du ja mit deinem Code ändern.

Re: Spezielle Sortierung in speziellen Foren

Verfasst: Mo 20.Feb, 2012 15:18
von Holger
Hm, sorry, das habe ich nicht verstanden :hh:

Re: Spezielle Sortierung in speziellen Foren

Verfasst: Mo 20.Feb, 2012 17:07
von oxpus
Die Abfrage verwendet $sql_sort_order für die Sortierung nach irgend einem weiteren Feld neben dem Topic-Typ.
Und genau diese Variable hast du nicht in deinem Code verwendet, bzw. gefüllt.
Daher bleibt mit deiner Sortierung das Feld "leer" und die SQL-Anweisung führt zu Fehlern.

Also:

Code: Alles auswählen

if (is_array($sort_by_sql[$sort_key]))
{
	$sql_sort_order = implode(' ' . $direction . ', ', $sort_by_sql[$sort_key]) . ' ' . $direction;
}
else
{
	$sql_sort_order = $sort_by_sql[$sort_key] . ' ' . $direction;
}
So wird die Variable im Original gefüllt.
Mit deinem Code ist dann also etwas nicht in Ordnung, dass weder $direction oder $sort_by_sql korrekt gefüllt sind.
Somit bleibt $sql_sort_order leer und damit ein Fehler im SQL-Statement.

Code: Alles auswählen

$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param, $default_sort_days, $default_sort_key, $default_sort_dir);

// Sort topics alphabetically
if ($forum_id == 25)
{
    $sort_by_text = array('t' => $user->lang['TOPIC_TITLE']);
    $sort_by_sql = array('t' => 't.topic_title');
    $sort_dir = 'a';
}
Das hast du so eingetragen.
Dabei ist die Reihenfolge falsch.
Wenn dann so:

Code: Alles auswählen

// Sort topics alphabetically
if ($forum_id == 25)
{
    $sort_by_text = array('t' => $user->lang['TOPIC_TITLE']);
    $sort_by_sql = array('t' => 't.topic_title');
    $sort_dir = 'a';
}

$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param, $default_sort_days, $default_sort_key, $default_sort_dir);
Denn so werden auch deine Elemente berücksichtigt und nicht mit allen anderen Parametern verwürfelt.

Re: Spezielle Sortierung in speziellen Foren

Verfasst: Di 21.Feb, 2012 08:48
von Holger
Oha, das muss ich mir jetzt mal genau anschauen! Danke!