Your-pMF
     registrieren     benutzer     suche     team     kalender     hilfe     index    
Chat     downloads     link us     gästebuch     supportforum    
 

Hilfe bei event-reg

original Thema anzeigen

19.05.09, 22:37:27

siebi

Hallo Ich möchte den Hack EventReg mal wieder ein bisschen erweitern :D Wenn sich meinetwegen 5 User auf Teilnehmen geklickt haben, sollen die aufgelistet werden. Weitere Anmeldungen sollen zwar möglich sein, aber nicht mehr in diese Liste erscheinen sondern in eine Warteschlange stehen. Damit die bei einer Absage einer der ersten 5 der nächste User nachrutschen können. Die User, die nicht in der Liste der Teilnehmer auftauchen, sollen dann in eine extra Liste in der Warteschlange erscheinen. Hoffe ich konnte einigermaßen verständlich erklären was ich überhaupt will ;) Ich denke diese Datei müsste geändert werden: event.inc.php [PHP]fetch_array($result_event)) { // $gast_count = $Event['sum_gast']; // } $count_1 = '0'; $count_0 = '0'; $count_2 = '0'; ### Status $result_eventstatus = mysql_query('SELECT `end_date`, `action1` FROM `'.$_cfg['DB_PREFIX'].'event` WHERE `topic_id` = '.$_GET['id'].''); $EventStatus = $_db->fetch_array($result_eventstatus); $sum_zaehler = $EventStatus['action1']; if((($EventStatus['end_date'] + '86400') >= PMF_TIME) OR ($EventStatus['end_date'] == '1')) { $EventStatusText = 'Anmeldung möglich'; if($EventStatus['end_date'] != '1') { $EventStatusText .= ' (noch bis zum '.date('d.m.Y', $EventStatus['end_date']).')'; } $EventStatusNr = '1'; } else { $EventStatusText = 'Anmeldung nicht mehr möglich'; $EventStatusNr = '0'; } ### Maximale Teilnehmer $result_teilnehmer = mysql_query('SELECT * FROM `'.$_cfg['DB_PREFIX'].'event` WHERE `topic_id` = '.$_GET['id'].' '); $TeilnehmerStatus = $_db->fetch_array($result_teilnehmer); $Teilnehmer = $TeilnehmerStatus['max_teilnehmer'] - $TeilnehmerStatus['action1']; if($TeilnehmerStatus['gasterlaubnis'] == '1') { $Gasterlaubnis = ' mit Gästen'; } else { $Gasterlaubnis = ' keine Anmeldung von Gästen möglich!'; } if($TeilnehmerStatus['max_teilnehmer'] > '0') { $Gastanmeldung = $Teilnehmer - '1'; if($Gastanmeldung == '1') { $gast = 'Es ist nur noch '.$Gastanmeldung.' Gast möglich!'; } elseif($Gastanmeldung == '0') { $gast = 'Es sind keine Gäste mehr möglich!'; } else { $gast = 'Es sind nur noch '.$Gastanmeldung.' Gäste möglich!'; } } if($Teilnehmer == '1') { $Anmeldungen = 'Anmeldung'; } else { $Anmeldungen = ' Anmeldungen'; } if(($TeilnehmerStatus['max_teilnehmer'] > $TeilnehmerStatus['action1']) OR ($TeilnehmerStatus['max_teilnehmer'] == '0')) { $Anmeldung = '1'; } if($TeilnehmerStatus['max_teilnehmer'] > $TeilnehmerStatus['action1']) { $TeilnehmerStatusText = 'Noch '.$Teilnehmer.' '.$Anmeldungen.' möglich'; }elseif($TeilnehmerStatus['max_teilnehmer'] == '0') { $TeilnehmerStatusText = ' Keine max. Teilnehmerzahl '; } else { $TeilnehmerStatusText = 'Max. Teilnehmerzahl erreicht'; } ### Event auslesen $result_event = mysql_query('SELECT r.`user_id`, r.`action`, r.`date`, u.`name` AS username, r.`gast` FROM `'.$_cfg['DB_PREFIX'].'event_reg` AS r LEFT JOIN `'.$_cfg['DB_PREFIX'].'user` AS u ON u.`id`=r.`user_id` WHERE r.`topic_id` = '.$_GET['id'].' ORDER BY r.`date`'); while ($Event = $_db->fetch_array($result_event)) { ### Ausgabe formatieren $Event['date'] = date('d.m.Y', $Event['date']); ### Ausgabe if($Event['action'] == '1') { $count_1++; $event_lines_1 .= eval('return ("'.$_style->get('event_line_1').'");'); } elseif($Event['action'] == '0') { $count_0++; $event_lines_0 .= eval('return ("'.$_style->get('event_line').'");'); } elseif($Event['action'] == '2') { $count_2++; $event_lines_2 .= eval('return ("'.$_style->get('event_line').'");'); } } ?>[/PHP] Der entsprechende Bereich sollte dieser hier sein: [PHP]### Event auslesen $result_event = mysql_query('SELECT r.`user_id`, r.`action`, r.`date`, u.`name` AS username, r.`gast` FROM `'.$_cfg['DB_PREFIX'].'event_reg` AS r LEFT JOIN `'.$_cfg['DB_PREFIX'].'user` AS u ON u.`id`=r.`user_id` WHERE r.`topic_id` = '.$_GET['id'].' ORDER BY r.`date`'); while ($Event = $_db->fetch_array($result_event)) { ### Ausgabe formatieren $Event['date'] = date('d.m.Y', $Event['date']); ### Ausgabe if($Event['action'] == '1') { $count_1++; $event_lines_1 .= eval('return ("'.$_style->get('event_line_1').'");'); } elseif($Event['action'] == '0') { $count_0++; $event_lines_0 .= eval('return ("'.$_style->get('event_line').'");'); } elseif($Event['action'] == '2') { $count_2++; $event_lines_2 .= eval('return ("'.$_style->get('event_line').'");'); } }[/PHP] Dachte es müsste mit einer Schleife gehen, kriege es aber nicht hin. Deshalb hoffe ich nun auf eure Hilfe!!!
19.05.09, 23:47:59

siebi

Habs anscheinend doch noch hinbekommen. Kommt so dem ganzen schon recht nahe ;) [PHP] ### Ausgabe if($Event['action'] == '1') { $count_1++; if($count_1 <= $Limit_errechnet){ $event_lines_1 .= eval('return ("'.$_style->get('event_line_1').'");'); }else { $event_lines_3 .= eval('return ("'.$_style->get('event_line_3').'");'); } $sum_teilnehmer = $count_1 + $Limit_rechnen['summe']; $sum_warteliste = $TeilnehmerStatus['max_teilnehmer'] - $count_1 + $Limit_rechnen['summe']; } elseif($Event['action'] == '0') { $count_0++; $event_lines_0 .= eval('return ("'.$_style->get('event_line').'");'); } elseif($Event['action'] == '2') { $count_2++; $event_lines_2 .= eval('return ("'.$_style->get('event_line').'");'); }[/PHP]
19.05.09, 23:54:40

pip

yo du hast recht, die änderung müsste an dem von dir zitierten code gemacht werden. super, vielen dank fürs posten des codes etc, das macht das helfen um einiges leichter :D am anmeldeverfahren selber muss nichts verändert werden, da die anmeldeldung nach 5 anmeldungen trotzdem noch erlaubt sein soll. lediglich die ausgabedarstellung soll anders sein... [PHP]while($Event = $_db->fetch_array($result_event)) { ... }[/PHP] diese schleife durchläuft alle anmeldungen des ausgewählten events und ordnet sie den entsprechenden gruppen zu. 1 = teilnehmen 0 = unsicher 2 = absagen folglich muss die zuordnung der anmeldungen (1=teilnehmen) [i]einfach[/i] nach 5 zuordnungen in eine warteschleife umgeleitet werden. das könnte man so machen: [php] ### Ausgabe if($Event['action'] == 1) { if($count_1==5) { $event_lines_wait .= eval('return ("'.$_style->get('event_line').'");'); } else { $count_1++; $event_lines_1 .= eval('return ("'.$_style->get('event_line_1').'");'); } } elseif($Event['action'] == 0) { ...[/php] die variable [i]$event_lines_wait[/i] enthält nun logischerweise alle sich auf der warteliste befindenen teilnehmer und muss noch im x_event.tpl an der gewünschten stelle eingefügt werden...
21.05.09, 17:06:01

siebi

Danke, pip. Habs nun so hinbekommen, wie ich es brauche. So läuft es nun bei mir: [PHP] ### Ausgabe $sum_teilnehmer = 0; if($Event['action'] == '1') { $count_1++; if($count_1 <= $Limit_errechnet){ $event_lines_1 .= eval('return ("'.$_style->get('event_line_1').'");'); }else { $event_lines_3 .= eval('return ("'.$_style->get('event_line_3').'");'); } $sum_teilnehmer = $count_1 + $Limit_rechnen['summe']; $sum_warteliste = $count_1 + $Limit_rechnen['summe'] - $TeilnehmerStatus['max_teilnehmer']; } elseif($Event['action'] == '0') { ...[/PHP] Allerdings hätte ich da noch einen Wunsch, bei dem ich noch nicht mal einen Ansatz habe. Und zwar hätte ich gerne, wenn bei der Teilnehmer-Liste jemand abspringt und aus der Warteliste der (oder die, wenn der Teilnehmer Gäste eingetragen hat) nächste nachrückt, eine PN und/oder Mail bekommt, dass er nun teilnehmen kann. Das gestaltet sich soweit als schwierig, weil ja auch die User in der Warteliste als Teilnehmer (also in der Spalte "action1") eingetragen sind.
21.05.09, 18:03:39

pip

siebi: das müsste man in der /event.php machen. dort wird bei der änderung eines anmeldungsstatuses das db-query durchgeführt. wenn also jemand der unter den ersten fünf angemeldeten absagt, soll der aufrücker eine email bekommen. das könnte man in etwa so machen: [php] ### Reg insert | update // get old status $result_event = $_db->query('SELECT `user_id`, `action`, `topic_id` FROM `'.$_cfg['DB_PREFIX'].'event_reg` WHERE `topic_id`='.intval($_POST['topic_id']).' AND `user_id`='.intval($_user['id']).' LIMIT 1'); $old_event_status = $_db->fetch_array($result_event); if(is_numeric($old_event_status['action'])) { // check if email should be send if($old_event_status['action'] == 1) { ### Event auslesen $count = 0; $result_event = $db->query('SELECT `user_id`, `action`, `date` FROM `'.$_cfg['DB_PREFIX'].'event_reg` WHERE `topic_id` = '.intval($_GET['id']).' ORDER BY `date`'); while ($Event = $_db->fetch_array($result_event)) { if($Event['action'] == 1) { $count++ } if($Event['user_id'] == $_user['id']) break; } if($count <=5) { // send email... } } // --> UPDATE $_db->query('UPDATE `'.$_cfg['DB_PREFIX'].'event_reg` SET action = '.$reg.', date = '.PMF_TIME.' WHERE topic_id ='.intval($_POST['topic_id']).' AND user_id ='.intval($_user['id']).'') } else { // --> INSERT $_db->query('INSERT INTO `'.$_cfg['DB_PREFIX'].'event_reg` (`topic_id`, `user_id`, `action`, `date`) VALUES ('.intval($_POST['topic_id']).','.$_user['id'].','.$reg.','.PMF_TIME.')'); }[/php] der code ist nicht getestet, sollte aber so in etwa funktionieren :D hoffe das hilft dir, sonst einfach nochmal nachfragen
21.05.09, 18:42:42

siebi

Danke dir schonmal, pip. Klar hab ich noch Fragen ;) :D Und zwar, scheint da noch ein Fehler zu sein, der mir nix sagt :rolleyes: [QUOTE]Fatal error: Call to a member function query() on a non-object in C:\xampp\htdocs\Forum\phpmyforum_415\event.php on line 50[/QUOTE] Das wäre dann folgende Zeile: [PHP] $result_event = $db->query('SELECT `user_id`, `action`, `date` [/PHP] Und die PN wird verschickt, wenn ein User der Teilnehmerliste absagt?! Hab ja nun auch noch die Gastanmeldung drin. Was würde passieren, wenn auf einem mal 3 Plätz frei würden? Den Zähler mit den Gästen zu erhöhen hab ich damals so gelöst: [PHP] $result_event = mysql_query('SELECT SUM(`gast`) as sum_gast FROM `'.$_cfg['DB_PREFIX'].'event_reg` WHERE topic_id = '.intval($_POST['topic_id']).''); while ($Event = $_db->fetch_array($result_event)) { $gast_count = $Event['sum_gast']; } $count_1 = $gast_count;[/PHP] So startet der counter direkt mit der Anzahl der Gäste.
21.05.09, 19:25:32

pip

[PHP]$result_event = $_db->query('...');[/PHP] gäste werden nicht berücksichtigt...
21.05.09, 20:54:32

siebi

geändert von: siebi - 21.05.09, 21:24:06

Oh, das hätte ich auch selbst sehen können :rolleyes: Jetzt funtz das. Wie komme ich denn an die user_id, an die die PN verschickt wird? Müsste dann ja der 6.User der Liste sein. [quote="pip"][PHP]$result_event = $_db->query('...');[/PHP] gäste werden nicht berücksichtigt...[/quote] Also wird, auch wenn zwei Plätze frei werden immer nur eine PN an den nächsten, und nicht an den übernächsten der ja auch hoch rutscht, verschickt? Hier müsste das dann ja der 7., 8., ... User sein.
21.05.09, 22:33:44

pip

geändert von: pip - 21.05.09, 22:52:27

yo genau, ist der sechste user aus dem array... die id kannste direkt vorm break befehl in einer variablen speichern, so zum beispiel: [PHP] ### Event auslesen $count = 0; $beak = false; $result_event = $db->query('SELECT `user_id`, `action`, `date` FROM `'.$_cfg['DB_PREFIX'].'event_reg` WHERE `topic_id` = '.intval($_GET['id']).' ORDER BY `date`'); while ($Event = $_db->fetch_array($result_event)) { if($Event['action'] == 1) { $count++ } if($break) { $user4mail = $Event['user_id']; break; } if($Event['user_id'] == $_user['id']) $break=true; } if($count <=5) { // send email... }[/PHP] gäste werden bei den 5 teilnehmern so nicht berücksichtigt. hmm, wenn gäste auch mitgezählt werden sollen, müsste man die db-abfragen erweitern und das ganze wird etwas umfangreicher ... im moment werden die wie gesagt ganz außen vor gelassen.
22.05.09, 10:56:38

siebi

Hm, irgendwie klappt das mit der user_id nicht so ganz. So sieht nun mein Code aus: [PHP]### Reg insert | update // get old status $result_event = $_db->query('SELECT `user_id`, `action`, `topic_id` FROM `'.$_cfg['DB_PREFIX'].'event_reg` WHERE `topic_id`='.intval($_POST['topic_id']).' AND `user_id`='.intval($_user['id']).' LIMIT 1'); $old_event_status = $_db->fetch_array($result_event); if(is_numeric($old_event_status['action'])) { // check if email should be send if($old_event_status['action'] == 1) { ### Event auslesen $count = 0; $break = false; $result_event = $_db->query('SELECT `user_id`, `action`, `date` FROM `'.$_cfg['DB_PREFIX'].'event_reg` WHERE `topic_id` = '.intval($_GET['id']).' ORDER BY `date`'); while ($Event = $_db->fetch_array($result_event)) { if($Event['action'] == 1) { $count++; } if($break) { $user4mail = $Event['user_id']; break; } if($Event['user_id'] == $_user['id']) $break=true; } if($count <= $Limit_errechnet) { $_db->query('INSERT INTO `'.$_cfg['DB_PREFIX'].'private` (`from_id`,`to_id`,`send`,`name`,`text`,`sign`,`del`,`monitor`,`bbcode`,`smilie`,`html`,`clickable`) VALUES (1,'.$user4mail.','.PMF_TIME.',"test","nureinTest",1,0,1,1,1,0,1)'); } } // --> UPDATE $_db->query('UPDATE `'.$_cfg['DB_PREFIX'].'event_reg` SET action = '.$reg.', gast = '.$gast.', date = '.PMF_TIME.' WHERE topic_id ='.intval($_POST['topic_id']).' AND user_id ='.intval($_user['id']).''); } else { // --> INSERT $_db->query('INSERT INTO `'.$_cfg['DB_PREFIX'].'event_reg` (`topic_id`, `user_id`, `action`, `gast`, `date`) VALUES ('.intval($_POST['topic_id']).','.$_user['id'].','.$reg.', '.$gast.','.PMF_TIME.')'); }[/PHP] Aber es gibt keinen Wert $user4mail.
22.05.09, 11:52:28

pip

geändert von: pip - 22.05.09, 11:57:57

hmm, ich kann keinen grund finden, warum die variable leer sein sollte. ein kleiner fehler ist mir aber noch aufgefallen, die if-bedingung muss anders geschachtelt sein damit das gewünschte ergebnis eintritt: [php] while($Event = $_db->fetch_array($result_event)) { if($Event['action'] == 1) { if($break && $count==5) { $user4mail = $Event['user_id']; break; } $count++; } if($Event['user_id'] == $_user['id']) $break=true; }[/php] wenn die variable bei dir leer bleibt obwohl es genug personen auf der warteliste gibt muss ich mir wohl den hack mal lokal installieren und selber testen wo das problem ist, denn sehen woran es liegt tu ich im moment wie gesagt nicht.
22.05.09, 16:40:45

siebi

Sorry, pip. Bringt mich auch nicht weiter. Immer wieder folgende Meldung: [QUOTE]SQL Error: 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 '1243003178,"test","nureinTest",1,0,1,1,1,0,1)' at line 2 INSERT INTO `pmf_private` (`from_id`,`to_id`,`send`,`name`,`text`,`sign`,`del`,`monitor`,`bbcode`,`smilie`,`html`,`clickable`) VALUES (1,,1243003178,"test","nureinTest",1,0,1,1,1,0,1)[/QUOTE]
24.05.09, 18:10:41

pip

hab den fehler gefunden, in der folgenden db-abfrage habe bei der topic_id get anstatt post verwendet... so ist es richtig: [php] if($old_event_status['action'] == 1) { ### Event auslesen $count = 0; $break = false; $result_event = $_db->query('SELECT `user_id`, `action`, `date`, `topic_id` FROM `'.$_cfg['DB_PREFIX'].'event_reg` WHERE `topic_id` = '.intval($_POST['topic_id']).' ORDER BY `date`'); while($Event = $_db->fetch_array($result_event)) {[/php]
25.05.09, 10:25:35

siebi

Hi pip Danke dir, jetzt wird die PN verschickt. Allerdings musste ich noch was ändern. Es kam eine Fehlermeldung, wenn ein User abgesagt hat, und niemand auf der Warteliste stand. Habe es nun wie folgt gelöst und es funzt soweit. [PHP] while($Event = $_db->fetch_array($result_event)) { if($Event['action'] == 1) { if($break && $count == $Gast_errechnet) { $user4mail = $Event['user_id']; $_db->query('INSERT INTO `'.$_cfg['DB_PREFIX'].'private` (`from_id`,`to_id`,`send`,`name`,`text`,`sign`,`del`,`monitor`,`bbcode`,`smilie`,`html`,`clickable`) VALUES (1,'.$user4mail.','.PMF_TIME.',"test","nureinTest",1,0,1,1,1,0,1)'); break; } $count++; } if($Event['user_id'] == $_user['id']) $break=true; }[/PHP] Nun muss ich nur noch gucken, wie ich es hinbekomme mehrere PNs zu verschicken, wenn mehrere Plätze gleichzeitig frei werden :rolleyes: Kann man diese if-Bedingung nicht mehrmals durchlaufen lassen? [PHP]if($break && $count == 5)[/PHP] Die müsste dann so oft durchlaufen, wie der User Gäste angemeldet hat. Ist aber wahrscheinlich nicht so leicht zu realisieren, oder?!
25.05.09, 11:29:14

pip

hmm, man könnte eine weitere bedingung einbauen, sodass erst alle benötigten user zusammengestellt werden. so könnte es funktionieren: [php]while($Event = $_db->fetch_array($result_event)) { if($Event['action'] == 1) { if($break && $count == $Gast_errechnet) { $user4mail[] = $Event['user_id']; $count_anzahl_neuer_teilnehmer++; if($count_anzahl_neuer_teilnehmer == $anzahl_neuer_teilnehmer) break; } $count++; } if($Event['user_id'] == $_user['id']) $break=true; } foreach($user4mail as $user_id) { // write email }[/php]
25.05.09, 12:23:01

siebi

Klappt bei mir leider nicht. Selbst wenn ich die Anzahl der freigewordenen Plätze von Hand eingebe, wird die PN nur einmal verschickt: [PHP] if($count_anzahl_neuer_teilnehmer == 2) break; [/PHP] Die Anzahl der freigewordenen Plätze bekomme ich doch hier raus, oder?! [PHP] $result_event = $_db->query('SELECT `user_id`, `action`, `topic_id`, `gast` FROM `'.$_cfg['DB_PREFIX'].'event_reg` WHERE `topic_id`='.intval($_POST['topic_id']).' AND `user_id`='.intval($_user['id']).' LIMIT 1'); $old_event_status = $_db->fetch_array($result_event); $anzahl_neuer_teilnehmer = $old_event_status['gast'] + 1;[/PHP] Und so sieht es im Moment komplett aus: [PHP] ### Reg insert | update // get old status $result_event = $_db->query('SELECT `user_id`, `action`, `topic_id`, `gast` FROM `'.$_cfg['DB_PREFIX'].'event_reg` WHERE `topic_id`='.intval($_POST['topic_id']).' AND `user_id`='.intval($_user['id']).' LIMIT 1'); $old_event_status = $_db->fetch_array($result_event); $anzahl_neuer_teilnehmer = $old_event_status['gast'] + 1; if(is_numeric($old_event_status['action'])) { // check if email should be send if($old_event_status['action'] == 1) { ### Event auslesen $count = 0; $count_anzahl_neuer_teilnehmer = 0; $break = false; $result_event = $_db->query('SELECT `user_id`, `action`, `date`, `topic_id`, `gast` FROM `'.$_cfg['DB_PREFIX'].'event_reg` WHERE `topic_id` = '.intval($_POST['topic_id']).' ORDER BY `date`'); while($Event = $_db->fetch_array($result_event)) { if($Event['action'] == 1) { if($break && $count == $Gast_errechnet) { $user4mail[] = $Event['user_id']; $count_anzahl_neuer_teilnehmer++; if($count_anzahl_neuer_teilnehmer == 2) break; } $count++; } if($Event['user_id'] == $_user['id']) $break=true; } foreach($user4mail as $user_id) { $_db->query('INSERT INTO `'.$_cfg['DB_PREFIX'].'private` (`from_id`,`to_id`,`send`,`name`,`text`,`sign`,`del`,`monitor`,`bbcode`,`smilie`,`html`,`clickable`) VALUES (1,'.$user_id.','.PMF_TIME.',"test","nureinTest",1,0,1,1,1,0,1)'); } }[/PHP]
25.05.09, 14:23:59

pip

[PHP]if($break && $count >= $Gast_errechnet) {[/PHP] es muss >= heißen, da er dort sonst nur 1mal reingeht...
25.05.09, 15:02:06

siebi

Stimmt, hätte ich auch selbst drauf kommen können :rolleyes: So scheint es zu funzen :) :) Mal schauen, was mir sonst noch so einfällt ;) Ich danke dir auf jeden Fall für deine Hilfe!!!
 
Powered by: phpMyForum 4.2.1 © Christoph Roeder
SQL Error