Portal Random Poll

In diesem Forum können Mod-Autoren ihre Mods vorstellen, die sich noch im Entwicklungsstatus befinden. Der Einbau in Foren im produktiven Betrieb wird nicht empfohlen.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.0, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Demolition_FABI
Mitglied
Beiträge: 19
Registriert: 17.05.2005 16:26

Portal Random Poll

Beitrag von Demolition_FABI »

Ich habe sowas nirgends gefunden und hab jetzt einfach mal versucht, selber einen Mod draus zu machen, schaut's euch mal an und sagt mir, ob ma des so machen kann (also des kann ma auf jeden Fall, weil es funktioniert :D ) aber halt, ob es so von der Form etc. in Ordnung ist und ob man es evtl. noch optimieren könnte (bin nich so der Profi in PHP, kann nur das was ich schon hab, ein bisschen abändern, bis es funktioniert^^)

Ich habe leider auch keine Ahnung, wie man Mods hochladen kann, oder ähnliches, aber ich glaube, es wäre am besten, wenn ma das bei den Snippets hinzufügen würde, oder?
##############################################################
## MOD Title: Replace recent poll on Intro + Portal Mod with a random poll
## MOD Author: Demolition_FABI < http://www.htfs.de/kontakt.php > http://www.htfs.de/
## MOD Description: The recent poll on the portal.php is replaced with a random poll from the forum-IDs,
## you have selected in the ACP.
##
## MOD Version: 1.0.1
##
## Installation Level: Easy
## Installation Time: 1 Minute
## Files To Edit: 1
## portal_poll.php
##
## Included Files: n/a
##############################################################
## For Security Purposes, Please Check: http://www.phpbb.com/mods/ for the
## latest version of this MOD. Downloading this MOD from other sites could cause malicious code
## to enter into your phpBB Forum. As such, phpBB will not offer support for MOD's not offered
## in our MOD-Database, located at: http://www.phpbb.com/mods/
##############################################################
## MOD History:
##
## 2008-05-01 - Version 1.0.0
## - First release
## 2008-05-01 - Version 1.0.1
## - removed some useless things
##
##############################################################
## Before Adding This MOD To Your Forum, You Should Back Up All Files Related To This MOD
##############################################################

#
#-----[ OPEN ]------------------------------------------
#
portal_poll.php

#
#-----[ FIND ]------------------------------------------
#
$sql = 'SELECT
t.*,
vd.*
FROM
' . TOPICS_TABLE . ' AS t,
' . VOTE_DESC_TABLE . ' AS vd
WHERE
t.forum_id IN (' . $forum_sql . ') AND
t.topic_status <> 1 AND
t.topic_status <> 2 AND
t.topic_vote = 1 AND
t.topic_id = vd.topic_id
ORDER BY
t.topic_time DESC
LIMIT
0,1';

#
#-----[ REPLACE WITH ]------------------------------------------
#
$sql = 'SELECT
t.*,
vd.*
FROM
' . TOPICS_TABLE . ' AS t,
' . VOTE_DESC_TABLE . ' AS vd
WHERE
t.forum_id IN (' . $forum_sql . ') AND
t.topic_status <> 1 AND
t.topic_status <> 2 AND
t.topic_vote = 1 AND
t.topic_id = vd.topic_id
ORDER BY
RAND()
LIMIT
0,1';

#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#
# EoM
Zuletzt geändert von Demolition_FABI am 02.05.2008 19:03, insgesamt 1-mal geändert.
Boecki91
Ehemaliges Teammitglied
Beiträge: 4744
Registriert: 18.06.2006 15:21

Beitrag von Boecki91 »

Für Snipplets kannst du auch einfach ein Team-Mitglied aus dem Mod bereich per PM anschreiben.

Die schauen sich das dann an und achten hauptsächlich auf die "Idoten-Sicherheit" :wink:

So nun aber zum Code:
Es fehlen die Einrückungen, ohne die findet man die Codestellen nicht/nur schwer (Stichwort: Idotensicher :D )

Zur Schleife:

Die ist Blöde aufgebaut, erst eine If Abfrage und dann eine nachgestellte while-Schleife, und vor allem was soll die machen?

Code: Alles auswählen

$postrow = array();
if ($row = $db->sql_fetchrow($result))
{
do
{
$postrow[] = '';
}
while ($row = $db->sql_fetchrow($result));

$total_polls = count($postrow);
} 
Wie Wäre es so::

Code: Alles auswählen

$total_polls = 0;
while ($db->sql_fetchrow($result));
{
    $total_polls++
}
Ist jetzt nicht getestet, aber dürfte den Sinn und Zweck deines Schleifenmonsters nahe kommen.

Aber warum du den 1. After add Block brauchst verstehe ich nicht, zumal mySQL eine Zufallsfunktion eingebaut hat, wie es mit anderen DB-Systemen steht weiß ich nicht (Aber da kannst du dich als Mod-Entwickler schau machen :wink: )

Aber wie Nutzt man diese Zufallsfunktion:
Suche:

Code: Alles auswählen

$sql = 'SELECT
t.*,
vd.*
FROM
' . TOPICS_TABLE . ' AS t,
' . VOTE_DESC_TABLE . ' AS vd
WHERE
t.forum_id IN (' . $forum_sql . ') AND
t.topic_status <> 1 AND
t.topic_status <> 2 AND
t.topic_vote = 1 AND
t.topic_id = vd.topic_id
ORDER BY
t.topic_time DESC
LIMIT
0,1'; 
Und Ersetze

Code: Alles auswählen

t.topic_time DESC
mit

Code: Alles auswählen

RAND()
Somit sparrst du dir den gesamten 1. Block, und hast auch keine Probleme wenn Umfrage "5-10" gelöscht wurden.


Edit: Ich sollte vielleicht sagen das das dennoch eine super Arbeit war, sich selbst hinzusetzen und eine Lösung zu entwickeln, anstatt hier nach Hilfe zu schreien :grin: , mein Beitrag sollte Hinweise geben wie man das ganze möglichst einfacher und schneller gestallten kann, also möglichst sachliche Kritik, keinesfalls soll deine Arbeit als Nutzlos dargestellt werden.
Standart: Am besten mit beiden Beinen auf dem Boden
Standardmäßig antworte ich nicht auf PMs
Demolition_FABI
Mitglied
Beiträge: 19
Registriert: 17.05.2005 16:26

Beitrag von Demolition_FABI »

Hmm, ja guut, das ist ja fast langweilig, so einfach^^ :P
Na, aber wie gesagt, ich habe nicht so viel Ahnung von Php, ich hab die ganzen Schleifen aus irgendwelchen anderen Dateien genommen, aber so ist es wohl um einiges einfacher und funktioniert auch wunderbar (habs probiert :) )
Also ich habs oben aktualisiert, wobei des dann wohl für nen Mod fastn bissl wenig ist, aber so könnte ich es dann als Snippet "einschicken", oder?

Auf jeden Fall, vielen Dank für die super Ratschläge und die schnelle Antwort! ;)
Boecki91
Ehemaliges Teammitglied
Beiträge: 4744
Registriert: 18.06.2006 15:21

Beitrag von Boecki91 »

Jetzt müsstest du nur noch die originalen Zeilen-Einrückungen rein bringen (Vielleicht anstatt den Zitat-Klammern Code Klammern verwenden, die sind dafür gemacht worden):D

Du hast recht für einen Mod ist das zu wenig, eventuell wird das als Snipplet aufgenommen einfach mal jemanden aus dem Team anschreiben, Jan und Tobi sind regelmäßig da
Standart: Am besten mit beiden Beinen auf dem Boden
Standardmäßig antworte ich nicht auf PMs
Demolition_FABI
Mitglied
Beiträge: 19
Registriert: 17.05.2005 16:26

Beitrag von Demolition_FABI »

Hm, sorry, aber was ist die originale Zeilen-Einrückungen?

Jetzt hätte ich noch ne Idee und wollt doch erst mal hier fragen, weil wenn das wieder so einfach ist, dann brauch ich mir nich wieder so viel Arbeit umsonst machen^^:

Würde es irgendwie einfach gehen, dass nur Umfragen angezeigt werden, an denen man schon teilgenommen hat?
Boecki91
Ehemaliges Teammitglied
Beiträge: 4744
Registriert: 18.06.2006 15:21

Beitrag von Boecki91 »

Leider habe ich kein phhpBB2 mehr installiert, vor allem keinen Portal Mod.

Vom Prinzip her müsstest du in einer der Umfragen-Tabellen so etwas finden wie die voter_id oder user_id drin ist, diese Id ist nur da drin wenn man schon an der Umfrage Teilgenommen hat.

Eventuell kannst du die portal_poll.php als dowload bereitstellen und sagen welche Spalten alles in den Umfrage-Tabellen sind.


KB:datei
Standart: Am besten mit beiden Beinen auf dem Boden
Standardmäßig antworte ich nicht auf PMs
Demolition_FABI
Mitglied
Beiträge: 19
Registriert: 17.05.2005 16:26

Beitrag von Demolition_FABI »

Hm, ja also das Problem ist, die Umfrage wird ja aus der phpbb_vote_desc geladen mit

Code: Alles auswählen

$sql = 'SELECT 
t.*, 
vd.* 
FROM 
' . TOPICS_TABLE . ' AS t, 
' . VOTE_DESC_TABLE . ' AS vd 
WHERE 
t.forum_id IN (' . $forum_sql . ') AND 
t.topic_status <> 1 AND 
t.topic_status <> 2 AND 
t.topic_vote = 1 AND 
t.topic_id = vd.topic_id 
ORDER BY 
RAND() 
LIMIT 
0,1';
aber wer bei einer Umfrage schon teilgenommen hat, wird in der phpbb_vote_voters Tabelle mit den Spalten vote_id und vote_user_id gespeichert. (Die phpbb_vote_desc-Tabelle hat nur die Spalten vote_id, topic_id, vote_text, vote_start und vote_length)

Die Function in der portal_poll.php sieht so aus:

Code: Alles auswählen

function phpbb_fetch_poll($forum_sql) 
{ 
global $db; 

$sql = 'SELECT 
t.*, 
vd.* 
FROM 
' . TOPICS_TABLE . ' AS t, 
' . VOTE_DESC_TABLE . ' AS vd 
WHERE 
t.forum_id IN (' . $forum_sql . ') AND 
t.topic_status <> 1 AND 
t.topic_status <> 2 AND 
t.topic_vote = 1 AND 
t.topic_id = vd.topic_id 
ORDER BY 
RAND()
LIMIT
0,1';

if (!$query = $db->sql_query($sql)) 
{ 
message_die(GENERAL_ERROR, 'Could not query poll information', '', __LINE__, __FILE__, $sql); 
}

$result = $db->sql_fetchrow($query); 

if ($result) 
{ 
$sql = 'SELECT 
* 
FROM 
' . VOTE_RESULTS_TABLE . ' 
WHERE 
vote_id = ' . $result['vote_id'] . ' 
ORDER BY 
vote_option_id'; 

if (!$query = $db->sql_query($sql)) 
{ 
message_die(GENERAL_ERROR, 'Could not query vote result information', '', __LINE__, __FILE__, $sql); 
} 

while ($row = $db->sql_fetchrow($query)) 
{ 
$result['options'][] = $row; 
} 
} 

return $result; 
}
Nochmal vielen Dank für deine schnelle und super Hilfe ;)
Boecki91
Ehemaliges Teammitglied
Beiträge: 4744
Registriert: 18.06.2006 15:21

Beitrag von Boecki91 »

Ich habe mal wieder blind rum geschrieben:

Code: Alles auswählen

$sql = 'SELECT 
t.*, 
vd.* 
FROM 
' . TOPICS_TABLE . ' AS t, 
' . VOTE_DESC_TABLE . ' AS vd 
' . VOTE_VOTERS_TABLE . ' AS vv 
WHERE 
vv.vote_id = vd.vote_id AND
vv.vote_user_id = ' . $userdata['user_id'] . ' AND
t.forum_id IN (' . $forum_sql . ') AND 
t.topic_status <> 1 AND 
t.topic_status <> 2 AND 
t.topic_vote = 1 AND 
t.topic_id = vd.topic_id 
ORDER BY 
RAND() 
LIMIT 
0,1';
Schau mal was da jetzt bei rauskommt, nicht nur du bist gespannt :D
Standart: Am besten mit beiden Beinen auf dem Boden
Standardmäßig antworte ich nicht auf PMs
Demolition_FABI
Mitglied
Beiträge: 19
Registriert: 17.05.2005 16:26

Beitrag von Demolition_FABI »

Hmm, also in der constants.php steht:

Code: Alles auswählen

define('VOTE_USERS_TABLE', $table_prefix.'vote_voters');
- Also nicht VOTE_VOTERS_TABLE, sondern VOTE_USERS_TABLE
- nach "' . VOTE_DESC_TABLE . ' AS vd" muss ein Komma denk ich
- und oben fehlt das "vv.*" oder? (also was auch immer das macht^^)

Also es müsste wenn dann so heißen:

Code: Alles auswählen

$sql = 'SELECT 
t.*, 
vd.*, 
vv.*
FROM 
' . TOPICS_TABLE . ' AS t, 
' . VOTE_DESC_TABLE . ' AS vd, 
' . VOTE_USERS_TABLE . ' AS vv 
WHERE 
vv.vote_id = vd.vote_id AND 
vv.vote_user_id = ' . $userdata['user_id'] . ' AND 
t.forum_id IN (' . $forum_sql . ') AND 
t.topic_status <> 1 AND 
t.topic_status <> 2 AND 
t.topic_vote = 1 AND 
t.topic_id = vd.topic_id 
ORDER BY 
RAND() 
LIMIT 
0,1';

Kommt aber trotzdem die Fehlermeldung:
Could not query poll information

DEBUG MODE

SQL Error : 1064 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 'AND t.forum_id IN (29) AND t.topic_status <> 1 AND t.topic_st

SELECT t.*, vd.*, vv.* FROM phpbb_topics AS t, phpbb_vote_desc AS vd, phpbb_vote_voters AS vv WHERE vv.vote_id = vd.vote_id AND vv.vote_user_id = AND t.forum_id IN (29) AND t.topic_status <> 1 AND t.topic_status <> 2 AND t.topic_vote = 1 AND t.topic_id = vd.topic_id ORDER BY RAND() LIMIT 0,1
Wenn ich das "vv.vote_user_id = ' . $userdata['user_id'] . ' AND " weglösche, dann funktionierts wieder ohne Fehlermeldung, aber natürlich nicht mit dem gewünschten Effekt...
Hast du vielleicht noch ne Idee auf Lager ;) ?
Boecki91
Ehemaliges Teammitglied
Beiträge: 4744
Registriert: 18.06.2006 15:21

Beitrag von Boecki91 »

jo das habe ich :D


Der, die, das Array (interresante Frage oder?) "userdata" ist in der Funktion nicht bekannt, du müsst es erst bekannt machen, was der nachfolgende Cod ersetzt kannst du dir bestimmt denken

Code: Alles auswählen

global $db, $userdata;
das vv.* kannst du weglassen, damit das "schöner" wird solltest du anstatt vv dann auch vu verwenden, ich musste die Konstante "raten".
Standart: Am besten mit beiden Beinen auf dem Boden
Standardmäßig antworte ich nicht auf PMs
Antworten

Zurück zu „phpBB 2.0: Mods in Entwicklung“