Onderschriften citeren
Forumregels
LEES: Algemene Voorwaarden. Denk eventueel aan tags (DEV, BETA, RC)!
LEES: Algemene Voorwaarden. Denk eventueel aan tags (DEV, BETA, RC)!
Onderschriften citeren
Crea-Dome, mijn forum
Hallo allemaal,
Ik kreeg van een lid laatst een idee, om een onderschriften wedstrijd te houden. Sommige leden maken hun onderschriften groots en mooi op, en/of hebben mooie teksten, etc etc. Maar omdat het in de meeste gevallen om de lay-out gaat, moet je daar dus de codes (dus kleur, grootte, [...]) voor hebben om erop te kunnen stemmen. Nu vroeg ik me af... Bestaat/Is er een MOD te maken waarmee je een onderschrift kunt citeren? Of bijvoorbeeld een aangepastte BB-code, zoals je ze kunt aanmaken en aanpassen in het beheerderspaneel? Bijvoorbeeld dat je iets hebt als [onderschrift]Gebruikersnaam, gebruikersID, iets wat de gebruiker kan identificeren[/onderschrift] ?
Ik heb geen idee of dit überhaupt wel mogelijk is, maar als dit zo zou zijn hoor ik het graag ^^
Hallo allemaal,
Ik kreeg van een lid laatst een idee, om een onderschriften wedstrijd te houden. Sommige leden maken hun onderschriften groots en mooi op, en/of hebben mooie teksten, etc etc. Maar omdat het in de meeste gevallen om de lay-out gaat, moet je daar dus de codes (dus kleur, grootte, [...]) voor hebben om erop te kunnen stemmen. Nu vroeg ik me af... Bestaat/Is er een MOD te maken waarmee je een onderschrift kunt citeren? Of bijvoorbeeld een aangepastte BB-code, zoals je ze kunt aanmaken en aanpassen in het beheerderspaneel? Bijvoorbeeld dat je iets hebt als [onderschrift]Gebruikersnaam, gebruikersID, iets wat de gebruiker kan identificeren[/onderschrift] ?
Ik heb geen idee of dit überhaupt wel mogelijk is, maar als dit zo zou zijn hoor ik het graag ^^
Re: Onderschriften citeren
Ben een beetje aan het spelen geweest, volgens mij moet je zo een aardig eind komen.
LET OP:
Onderstaande is niet uitvoerig getest, en er is dus geen enkele garantie! Zorg dus dat je vóórdat je onderstaande uitvoert, een goede backup van zowel de bestanden als de database hebt!
OPEN
VIND
ZET ERACHTER
Hiermee kun je een signature in je bericht plaatsen met
LET OP:
Onderstaande is niet uitvoerig getest, en er is dus geen enkele garantie! Zorg dus dat je vóórdat je onderstaande uitvoert, een goede backup van zowel de bestanden als de database hebt!
OPEN
includes/message_parser.php
VIND
Code: Selecteer alles
if (!$this->bbcodes)
{
$this->bbcode_init();
}
global $user;
Code: Selecteer alles
//START siggie-bbcode
//We beginnen met het zoeken van de BBcode en die in een array stoppen
preg_match_all('#\[sig\](\d+)\[/sig\]#i',$this->message, $m );
//Vervolgens halen we voor alle signature-BBcode de gebruikersnaam en de signature op
foreach($m[1] as $gebruiker){
$q = 'SELECT u.user_id, u.username, u.user_sig
FROM ' . USERS_TABLE . ' u
WHERE u.user_id ='.$gebruiker;
$r = mysql_query($q);
$s = mysql_fetch_assoc($r);
$siggie = $s[user_sig];
$gebruikersnaam = $s[username];
//Met deze gegevens maken we een mooi geheel ervan
$siggie_neat = '[b]Signature van gebruiker '.$gebruikersnaam.':[/b]
'.$siggie;
//Nog even de BBcode fixen:
$siggie_neat = preg_replace("#\[(.+?):(.+?)](.*?)\[/\\1:\\2]#is", "[$1]$3[/$1]", $siggie_neat);
//En natuurlijk moet dat weer terug in het bericht gestopt worden
$this->message = preg_replace('#\[sig\]'.$gebruiker.'\[/sig\]#i', $siggie_neat, $this->message);
//Niet vergeten netjes de loop af te sluiten
}
//EINDE siggie-BBcode
[sig]{user_id}[/sig]
en dat verschijnt dan alsE.e.a. is natuurlijk nog aan te passen qua opmaak en dergelijke, maar dat laat ik aan jouzelf over.Signature van gebruiker Ger:
Stop met emails naar jezelf sturen.
Added Notes, al jouw notities op een rij!
Re: Onderschriften citeren
Waarom gebruik je mysql_query, en niet de DBAL zoals hoort?
Verder moet je $gebruiker intvallen, omdat je anders kans op SQL injection hebt.
Verder moet je $gebruiker intvallen, omdat je anders kans op SQL injection hebt.
Re: Onderschriften citeren
Wat is er mis met mysql_query? Da's gewoon een standaard (en volgens mij veelgebruikt) php commando... DBAL is blijkbaar een phpBB-specifiek commando? Die heb ik nog nooit gebruikt, maar dit is ook de eerste keer dat ik iets knutsel via de database van phpBB.paul schreef:Waarom gebruik je mysql_query, en niet de DBAL zoals hoort?
Hoezo? Hij matcht alleen nummers, (paul schreef:Verder moet je $gebruiker intvallen, omdat je anders kans op SQL injection hebt.
\d+
), als er iets anders staat wordt het niet gematcht en kom je dus ook de loop niet in.Re: Onderschriften citeren
Omdat als je nu een andere DBMS gebruikt het niet gaat werken. Als je in phpBB een query wilt draaien, altijd $db->sql_query gebruiken. Deze called de correct *_query function intern, en saved result data.Ger schreef:Wat is er mis met mysql_query? Da's gewoon een standaard (en volgens mij veelgebruikt) php commando... DBAL is blijkbaar een phpBB-specifiek commando? Die heb ik nog nooit gebruikt, maar dit is ook de eerste keer dat ik iets knutsel via de database van phpBB.paul schreef:Waarom gebruik je mysql_query, en niet de DBAL zoals hoort?
Nu toevallig wel, maar je hoeft maar net 1 foutje te maken en opeens is het er wel. Altijd data escapen of intvallen, beter 1 keer teveel als 1 keer te weinig.Hoezo? Hij matcht alleen nummers, (paul schreef:Verder moet je $gebruiker intvallen, omdat je anders kans op SQL injection hebt.\d+
), als er iets anders staat wordt het niet gematcht en kom je dus ook de loop niet in.
Re: Onderschriften citeren
Hmmm... als ik het zo toepas:paul schreef:Omdat als je nu een andere DBMS gebruikt het niet gaat werken. Als je in phpBB een query wilt draaien, altijd $db->sql_query gebruiken. Deze called de correct *_query function intern, en saved result data.
Code: Selecteer alles
$r = $db->sql_query($q);
Code: Selecteer alles
Call to a member function sql_query() on a non-object
Tsja. Ik snap je punt, in zijn algemeenheid heb je ook zeker gelijk, maar de beveiliging zit er nu reeds in. Op een andere plaats dan je zou verwachten, maar knappe gozer die hier misbruik van kan maken hoor.paul schreef:Nu toevallig wel, maar je hoeft maar net 1 foutje te maken en opeens is het er wel. Altijd data escapen of intvallen, beter 1 keer teveel als 1 keer te weinig.
Re: Onderschriften citeren
Je moet wel $db globalisen .
En zoals ik al zei, beter één maal teveel casten is dan eenmaal te weinig
Een betere versie die voldoet aan de coding guidelines grotendeels (Except comments):
En zoals ik al zei, beter één maal teveel casten is dan eenmaal te weinig
Een betere versie die voldoet aan de coding guidelines grotendeels (Except comments):
Code: Selecteer alles
//START siggie-bbcode
//We beginnen met het zoeken van de BBcode en die in een array stoppen
preg_match_all('#\[sig\](\d+)\[/sig\]#i',$this->message, $match );
global $db;
//Vervolgens halen we voor alle signature-BBcode de gebruikersnaam en de signature op
foreach($match[1] as $user_id)
{
$sql = 'SELECT u.user_id, u.username, u.user_sig
FROM ' . USERS_TABLE . ' u
WHERE u.user_id = ' . (int)$user_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
if(!$row)
{
continue;
}
//Met deze gegevens maken we een mooi geheel ervan
$sigb = '[b]Signature van gebruiker ' . $row['username'] . " :[/b]\n" . $row['user_sign'];
//Nog even de BBcode fixen:
$sign = preg_replace("#\[(.+?):(.+?)](.*?)\[/\\1:\\2]#is", "[$1]$3[/$1]", $siggie_neat);
//En natuurlijk moet dat weer terug in het bericht gestopt worden
$this->message = preg_replace('#\[sig\]' . $row['username'] . '\[/sig\]#i', $siggie_neat, $this->message);
//Niet vergeten netjes de loop af te sluiten
}
//EINDE siggie-BBcode
Re: Onderschriften citeren
Daarin globalize je $db toch ook niet? Of zie ik dat nu over het hoofd?
En wat is er mis met de comments (of moet dat in het engels)?
En wat is er mis met de comments (of moet dat in het engels)?
Re: Onderschriften citeren
Hmm, die regel was inderdaad weggevallen ja.
Volgens de coding guidelines moet er een spatie na de //, en moet het inderdaad in het engels.
Volgens de coding guidelines moet er een spatie na de //, en moet het inderdaad in het engels.
Re: Onderschriften citeren
Hm, die spatie vind ik een beetje over de top, maar goed. Hoe de braces en het inspringen gaat is een kwestie van smaak natuurlijk. En Engels is niet meer dan logisch als je het internationaal wil uitbrengen, maar die ambitie heb ik niet.paul schreef:Volgens de coding guidelines moet er een spatie na de //, en moet het inderdaad in het engels.
Nog een paar kleine puntjes op de "i", want in jouw code staan nu wat oude variabelen van mij en nieuwe van jou door elkaar waardoor het niet meer klopt. Onderstaande werkt iig goed bij mij:
Code: Selecteer alles
//START siggie-bbcode
//We beginnen met het zoeken van de BBcode en die in een array stoppen
preg_match_all('#\[sig\](\d+)\[/sig\]#i',$this->message, $match );
global $db;
//Vervolgens halen we voor alle signature-BBcode de gebruikersnaam en de signature op
foreach($match[1] as $user_id)
{
$sql = 'SELECT u.user_id, u.username, u.user_sig
FROM ' . USERS_TABLE . ' u
WHERE u.user_id = ' . (int)$user_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
if(!$row)
{
continue;
}
//Met deze gegevens maken we een mooi geheel ervan
$sigb = '[b]Signature van gebruiker ' . $row['username'] . " :[/b]\n" . $row['user_sig'];
//Nog even de BBcode fixen:
$sign = preg_replace("#\[(.+?):(.+?)](.*?)\[/\\1:\\2]#is", "[$1]$3[/$1]", $sigb);
//En natuurlijk moet dat weer terug in het bericht gestopt worden
$this->message = preg_replace('#\[sig\]' . $row['user_id'] . '\[/sig\]#i', $sigb, $this->message);
//Niet vergeten netjes de loop af te sluiten
}
//EINDE siggie-BBcode
Re: Onderschriften citeren
Dank je voor de support, beiden. Hier kan ik wel veel mee =) Ik moet helaas bekennen dat ik echt atechnisch ben, en ik er dus niet zo veel van snap xD Ik heb in ieder geval na de back-ups dit toegepast, en het werkt nu bijna. Ik krijg alleen vreemde codes. Waarbij ik normaal bij een bepaalde gebruiker
The sweet piano writing down my life
zou moeten krijgen, krijg ik
[i:28tpoevg]The sweet piano writing down my life[/i:28tpoevg]
Ik heb hier geen verstand van, sorry "^^
The sweet piano writing down my life
zou moeten krijgen, krijg ik
[i:28tpoevg]The sweet piano writing down my life[/i:28tpoevg]
Ik heb hier geen verstand van, sorry "^^
Re: Onderschriften citeren
Dat lijkt te zitten in de BBcode, welke voor de signatures reeds is omgezet naar uids. Welke versie van bovenstaande codes heb je toegepast, en welke versie van phpBB gebruik je?
Re: Onderschriften citeren
Jouw laatste versie, en we gebruiken versie 3.0.4
Re: Onderschriften citeren
Ok. Het leek fout te gaan bij het matchen van meerdere BBcodes. Probeer deze eens?
PS @ Paul: hoort dit niet meer bij MOD ontwikkeling thuis?
Code: Selecteer alles
//START siggie-bbcode
//We beginnen met het zoeken van de BBcode en die in een array stoppen
preg_match_all('#\[sig\](\d+)\[/sig\]#i',$this->message, $match );
global $db;
//Vervolgens halen we voor alle signature-BBcode de gebruikersnaam en de signature op
foreach($match[1] as $user_id)
{
$sql = 'SELECT u.user_id, u.username, u.user_sig
FROM ' . USERS_TABLE . ' u
WHERE u.user_id = ' . (int)$user_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
if(!$row)
{
continue;
}
//Met deze gegevens maken we een mooi geheel ervan
$sigb = '[b]Signature van gebruiker ' . $row['username'] . " :[/b]\n" . $row['user_sig'];
//Nog even de BBcode fixen:
preg_match("#\[(.+?):(.+?)](.*?)\[/\\1:\\2]#is", $sigb, $sig_uid);
$sign = str_replace(':'.$sig_uid[2], '', $sigb);
//En natuurlijk moet dat weer terug in het bericht gestopt worden
$this->message = preg_replace('#\[sig\]' . $row['user_id'] . '\[/sig\]#i', $sign, $this->message);
//Niet vergeten netjes de loop af te sluiten
}
//EINDE siggie-BBcode
Re: Onderschriften citeren
Hmm, hij werkt nu bij mijn voorbeeld, maar bij ingewikkeldere onderschriften geeft hij nog foutmeldingen (thanks iig nog ^^) Het ziet er misschien een beetje absurd uit, maar we hebben bijvoorbeeld ook dit onderschrift:
(De [gold] is overigens een custom tag bij ons, deze geeft kleur #ffbf40)
[gold]Lac[/gold]rimosa dies illa
Qua resurget ex favilla
Judicandus homo reus
Huic ergo parce Deus
Pie Jesu Domine
Dona eis requiem
[gold]Amen[/gold]
Maar ik krijg dit met de [sig]...[/sig]Qua resurget ex favilla
Judicandus homo reus
Huic ergo parce Deus
Pie Jesu Domine
Dona eis requiem
[gold]Amen[/gold]
Code: Selecteer alles
[center17fdqbdu][size=8017fdqbdu][gold17fdqbdu]Lac[/gold17fdqbdu][color=#ffbf4017fdqbdu]rim[/color17fdqbdu][color=#ffbf4017fdqbdu]osa[/color17fdqbdu] [color=#e7b65717fdqbdu]die[/color17fdqbdu][color=#dfb35f17fdqbdu]s il[/color17fdqbdu][color=#cfae6f17fdqbdu]la[/color17fdqbdu]
[color=#ffbf4017fdqbdu]Qua[/color17fdqbdu] [color=#ffbf4017fdqbdu]res[/color17fdqbdu][color=#e7b65717fdqbdu]urg[/color17fdqbdu][color=#dfb35f17fdqbdu]et e[/color17fdqbdu][color=#cfae6f17fdqbdu]x fa[/color17fdqbdu][color=#c7ac7717fdqbdu]vil[/color17fdqbdu][color=#bfa97f17fdqbdu]la[/color17fdqbdu]
[color=#ffbf4017fdqbdu]Jud[/color17fdqbdu][color=#e7b65717fdqbdu]ica[/color17fdqbdu][color=#dfb35f17fdqbdu]ndu[/color17fdqbdu][color=#cfae6f17fdqbdu]s ho[/color17fdqbdu][color=#c7ac7717fdqbdu]mo r[/color17fdqbdu][color=#bfa97f17fdqbdu]eus[/color17fdqbdu]
[color=#e7b65717fdqbdu]Hui[/color17fdqbdu][color=#dfb35f17fdqbdu]c er[/color17fdqbdu][color=#cfae6f17fdqbdu]go p[/color17fdqbdu][color=#c7ac7717fdqbdu]arc[/color17fdqbdu][color=#bfa97f17fdqbdu]e De[/color17fdqbdu][color=#b7a78717fdqbdu]us[/color17fdqbdu]
[color=#dfb35f17fdqbdu]Pie[/color17fdqbdu] [color=#cfae6f17fdqbdu]Jes[/color17fdqbdu][color=#c7ac7717fdqbdu]u Do[/color17fdqbdu][color=#bfa97f17fdqbdu]min[/color17fdqbdu][color=#b7a78717fdqbdu]e[/color17fdqbdu]
[color=#cfae6f17fdqbdu]Don[/color17fdqbdu][color=#c7ac7717fdqbdu]a ei[/color17fdqbdu][color=#bfa97f17fdqbdu]s re[/color17fdqbdu][color=#b7a78717fdqbdu]qui[/color17fdqbdu][color=#afa48f17fdqbdu]e[/color17fdqbdu][color=#a7a29717fdqbdu]m[/color17fdqbdu]
[gold17fdqbdu]Amen[/gold17fdqbdu][/size17fdqbdu][/center17fdqbdu]
Re: Onderschriften citeren
Hmm... Dat krijg ik niet gereproduceerd. Alternatiefje, misschien werkt dat wel bij jou:
Code: Selecteer alles
//START siggie-bbcode
//We beginnen met het zoeken van de BBcode en die in een array stoppen
preg_match_all('#\[sig\](\d+)\[/sig\]#i',$this->message, $match );
global $db;
//Vervolgens halen we voor alle signature-BBcode de gebruikersnaam en de signature op
foreach($match[1] as $user_id)
{
$sql = 'SELECT u.user_id, u.username, u.user_sig, user_sig_bbcode_uid
FROM ' . USERS_TABLE . ' u
WHERE u.user_id = ' . (int)$user_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
if(!$row)
{
continue;
}
//Met deze gegevens maken we een mooi geheel ervan
$sigb = '[b]Signature van gebruiker ' . $row['username'] . " :[/b]\n" . $row['user_sig'];
//Nog even de BBcode fixen:
$sign = str_replace(':'.$row['user_sig_bbcode_uid'], '', $sigb);
//En natuurlijk moet dat weer terug in het bericht gestopt worden
$this->message = preg_replace('#\[sig\]' . $row['user_id'] . '\[/sig\]#i', $sign, $this->message);
//Niet vergeten netjes de loop af te sluiten
}
//EINDE siggie-BBcode
Re: Onderschriften citeren
Jaaaaaaaaa! =D Ooh, super, hij werkt ^^ Heel erg bedankt ^^ *Blij* Nu kan ik het doorvoeren, heel erg bedankt ^^ Hij doet het nu dus vanaf de simpelste tot de ingewikkeldste onderschriften =D
Re: Onderschriften citeren
Graag gedaan. En jij en Paul ook bedankt, ik heb hiervan ook weer wat geleerd.
-
- Berichten: 194
- Lid geworden op: 02 apr 2008, 19:29
Re: Onderschriften citeren
*kuch*freeresult*kuch*
Na een select query *moet* je altijd de freeresult methode aanroepen binnen de DBAL
Tevens gebruik de
Na een select query *moet* je altijd de freeresult methode aanroepen binnen de DBAL
Code: Selecteer alles
$db->sql_freeresult($result);
void generate_text_for_edit ( $text, $uid, $flags)
functie om geparsde bbcodes te strippen voor gebruik bij een script.Proud member of the phpBB
Re: Onderschriften citeren
Hoeft niet persee, de DBAL doet dit aan het eind zelf ook nog als het niet gebeurd is, het is enkel wel zo netjes.Erik Frèrejean schreef:*kuch*freeresult*kuch*
Na een select query *moet* je altijd de freeresult methode aanroepen binnen de DBALCode: Selecteer alles
$db->sql_freeresult($result);