+ Antworten
Ergebnis 1 bis 9 von 9

Thema: com_attend_events - Frage an PHP/JOOMLA-Experten

  1. #1
    Neu an Board
    Registriert seit
    07.12.2005
    Beiträge
    47
    Bedankte sich
    8
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Frage com_attend_events - Frage an PHP/JOOMLA-Experten

    Hi,

    ich habe JOOMLA 1.0.13 und die Komponenten com_attend_events installiert. Hierzu habe ich eine eigene, einfache Form geschrieben, mit der die User die Möglichkeit haben, eigene Veranstaltungen über das Frontend zu erfassen.

    Bei den Veranstaltungen die geplant werden, handelt es sich um Formel-1, Bundesliga, oder Filme, die wir in unserem kleinen Vereinskinosaal ausstrahlen. Hierbei sind die Plätze begrenzt und in der Vergangenheit kam es auch mal zu Diskussionen, wer wo sitzt.

    Daher habe ich eine neue Tabelle 'jos_events_registrations_seats' angelegt, in der die einzelnen Sitzplätze eingetragen werden.

    Aufbau der Tabelle: id, session_id, seat, userid

    Soweit sogut - wenn eine Veranstaltung angelegt wird, werden automatisch entsprechend viele Sitzplätze (Reihe1-Sitz1, Reihe1-Sitz2, ... Reihe8-Sitz5) angelegt. Dabei ist die session_id natürlich überall die Gleiche und die userid zunächst immer 0.

    Jetzt möchte ich, dass die User sich bei der Anmeldung, einen entsprechenden Platz aussuchen können.

    Hierzu habe ich in der attend_events.html.php folgenden Eintrag ergänzt:

    PHP-Code:
                      <?php if (!empty($row->venue_postalcode)) echo $row->venue_postalcode "<br />"?>
                      <?php if (!empty($row->venue_country)) echo $row->venue_country "<br />"?>
                      <?php if (!empty($row->venue_webaddress)) echo "<a href=\"" $row->venue_webaddress "\">" $row->venue_webaddress "</a><br />"?>
                  </td>
              </tr>
              <?php ?>
              <?php echo @$number?>
              <tr>
            </tr>
        </table>
        
                <?php
                
    /* Auswahlbox für die Sitzplätze*/
                
    echo "Sitzplatz auswählen: ";
                
    ?>
                <select name="Sitzplatz" size="1">
                <?php
                $SQL_statement
    ="SELECT seat FROM `jos_events_registrations_seats` WHERE session_id = '$session_id' AND userid = 0 ORDER BY `id`";
                
    $resultset=mysql_query($SQL_statement);
                while(
    $data=mysql_fetch_array($resultset)){
                echo 
    '<option>'.$data['seat'] .'</option>';}
                
    ?>
                </select>

    <?php    /*
             * Check to see whether the registration form should be displayed.
             * For instance, a session may be listed even though the registration
             * period hasn't begun, or sessions may be displayed to all users
             * including guests, but only registered users can register.
             */

             
    $errorMsg "";
    Jetzt habe ich das Problem, an welcher Stelle ich die Auswahl abfragen muss, damit ich diese auch in die Datenbank schreiben kann?

    PHP-Code:
                <?php
                $Sitzplatz 
    trim($_POST["Sitzplatz"]);
                
    $create_update_sql "UPDATE `jos_events_registrations_seats` SET user_id = '$my->id'
                WHERE seat = '$Sitzplatz' and user_id = 0 and session_id = '$row->session_id'"
    ;
                
    $create_update_kz mysql_query($create_update_sql);
                while (
    $create_update_kz_array mysql_fetch_array($create_update_kz))    {}
                
    ?>
    Das eigentliche Update wird scheinbar über ein Javascript vorgenommen. Wenn ich aber hier unter "form.submit()" den oben genannten Code eintrage, funktioniert es nicht, da scheinbar auch die $row->session_id nicht mehr bekannt ist.

    PHP-Code:
              // check to see if we are ok to submit
              
    if (msg=='') {
                
    // no message so we can submit
                
    form.task.value=pressbutton;
                
    form.submit(); 
    In der attend_events.php wird bspw. die Email für die Bestätigung generiert. Ich weiß aber nicht, wie ich an dieser Stelle bzw. in diese Funktion, die Auswahl des Users übertrage.

    Ich hoffe ich habe mich verständlich ausgedrückt. Ich weiß nicht, an welcher Stelle ich das Update einfügen muss, damit es funktioniert.

    Im nächsten Schritt muss ich noch überprüfen, ob die vielleicht zwei Teilnehmer die Registrierungsform zur Veranstaltung geöffnet und zufällig den gleichen Sitz ausgewählt hatten. Dann darf die Registrierung für den zweiten ja nicht stattfinden. Vielleicht kann mir hier auch jemand weiterhelfen.

    Vielen Dank!
    Darius

  2. #2
    Gehört zum Inventar
    Registriert seit
    18.02.2005
    Beiträge
    8.841
    Bedankte sich
    85
    Erhielt 2.269 Danksagungen
    in 1.936 Beiträgen

    Standard

    Hallo Darius,

    dazu hätte ich einiges anzumerken. Zunächst zwei wichtige Punkte. Wenn du Joomla
    verwendest ist es sinnvoll auch die Joomla Klassenbibliothek und damit die Methoden,
    insbesondere die Datenbankklasse zu benutzen. Weiterhin solltest du dich mit dem Thema
    SQL und PHP Sicherheit auseinandersetzen. Ein Wert, der von außen kommt, egal ob
    POST, GET oder COOKIE darf niemals einfach so in einer Datenbankabfrage etc. verwendet
    werden. Sichtwort SQL Injektion.

    Nun zum Thema. Ich werde mal ein paar Vorschläge machen:
    Das Anlegen eurer Sitzplätze in einer Tabelle. "jos_events_registrations_seats", dazu
    schlage ich folgende Struktur vor:
    id | seat | info

    Dann eine Referenztabelle mit den jeweiligen Buchungen. "#__events_registrations_bookings" ggf. zusätzlich von eine id für die Vorführungen
    id | seat_id | user_id

    Damit erzeugst du zunächst eine Liste der möglichen Plätzt, zum Beispiel mit
    PHP-Code:
    <?php
    global $database;
    $query "SELECT s.id, s.seat, s.info FROM #__events_registrations_seats AS s"
        
    ."\n LEFT JOIN #__events_registrations_bookings AS b ON b.seat_id = s.id"
        
    ."\n WHERE ISNULL(b.seat_id)"
        
    ;
    $database->setQuery($query);
    $seats $database->loadObjectList();

    foreach(
    $seats as $seat) {
        
    $info = !empty($seat->info) ? ' ('.$seat->info.')' '';
        
    $list_seats[] = mosHTML::makeOption($seat->id,$seat->seat.$info);    
    }

    echo 
    mosHTML::selectList$list_seats'seat''class="inputbox" size="1"''value''text'null);
    ?>
    Soweit so gut.
    Nun gibt es ggf. noch eine Tabelle mit den jeweiligen Dingen, die gezeigt werden sollen.
    Das lass ich hier an dieser Stelle aus, das wäre aber noch wichtig, und müsste oben in
    die Abfrage nach als weitere LEFT JOIN einfließen.

    Zur Speicherung der Daten: (Grundform, ohne check etc.)
    PHP-Code:
    <?php
    global $database$my;

    //ggf. zusaätzlich die id der Vorführung hier in show_id
    $seat intval(mosGetParam($_POST,'seat',0));

    $query "INSERT INTO #__events_registrations_bookings (user_id,seat_id,show_id) VALUES (".(int)$my->id, (int)$seat,(int)$show.")";
    $database->setQuery($query);
    $database->query(); 
    ?>
    Diese ganze Session id Geschichte brauchst du gar nicht, allerdings hast du derzeit
    noch ein Problem mit der Struktur.

    Grüße
    ec

  3. Erhielt Danksagungen von:


  4. #3
    Neu an Board
    Registriert seit
    07.12.2005
    Beiträge
    47
    Bedankte sich
    8
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Hi ecomeback,

    vielen Dank für Deine Ausführungen bzw. Lösungsansätze. Schade, dass Du nicht ganz genau auf meine Vorgaben und Fragen eingegangen bist, aber das liegt sicherlich auch daran, dass ich die Sache noch nicht richtig erklärt habe - außerdem muss man sich dann durchbeißen und versteht die Dinge besser. ;o)

    Zunächst zwei wichtige Punkte. Wenn du Joomla verwendest ist es sinnvoll auch die Joomla Klassenbibliothek und damit die Methoden, insbesondere die Datenbankklasse zu benutzen
    Hi, bisher habe ich mich nicht daran getraut, bzw. auch nicht richtig beschäftigt. Aber dank Deiner Beschreibung, habe ich die Verwendung der Klassen - glaube ich - etwas verstanden.

    Weiterhin solltest du dich mit dem Thema SQL und PHP Sicherheit auseinandersetzen. Ein Wert, der von außen kommt, egal ob POST, GET oder COOKIE darf niemals einfach so in einer Datenbankabfrage etc. verwendet werden. Sichtwort SQL Injektion.
    Okay - vielen Dank - habe ich auch verstanden und werde meine bisherigen Datenbank-Statements abändern.

    Nun zum Thema. Ich werde mal ein paar Vorschläge machen:
    Das Anlegen eurer Sitzplätze in einer Tabelle. "jos_events_registrations_seats", dazu
    schlage ich folgende Struktur vor:
    id | seat | info
    Dann eine Referenztabelle mit den jeweiligen Buchungen. "#__events_registrations_bookings" ggf. zusätzlich von eine id für die Vorführungen
    id | seat_id | user_id

    Deine Struktur ist sicherlich richtig, wenn die Sitzplatzbezeichnungen immer gleich wären. Diese ändern sich aber von session zu session - dies hatte ich aber nicht beschrieben, von daher ist Dein Hinweis auf eine Stammtabelle mit entsprechender Referenztabelle richtig. So muss ich aber trotzdem auf die session_id zurückgreifen. Daher mache ich erstmal mit der Tabelle: id, session_id, seat, userid - wobei die id nur einen primary-key darstellt, der automatisch hochgezählt wird. Ich möchte erstmal, dass das UPDATE grundsätzlich funktioniert und mache dann mit dem Feintuning weiter.

    Damit erzeugst du zunächst eine Liste der möglichen Plätzt, zum Beispiel mit
    Das Prinzip habe ich - glaub ich - verstanden und Deinen Code, wie folgt geändert:

    PHP-Code:
                <?php
                
    global $database;
                
    $query "SELECT id, seat FROM #__events_registrations_seats WHERE session_id = '$row->session_id' AND userid = 0 ORDER BY `id`";
                
    $database->setQuery($query);
                
    $seats $database->loadObjectList();

                foreach(
    $seats as $seat) {

                    
    $list_seats[] = mosHTML::makeOption($seat->id,$seat->seat);
                }

                echo 
    mosHTML::selectList$list_seats'seat''class="inputbox" size="1"''value''text'null);
                
    ?>
    Jetzt wird die Inputbox auch templateconform angezeigt - super!

    Leider weiß ich immer noch nicht, an welcher Stelle ich das UPDATE-Statement (bei Dir INSERT) eintragen muss. Entweder wird die session_id oder die Variabel $seat = intval(mosGetParam($_POST,'seat',0)); nicht gefüllt, oder ich bin noch auf dem Holzweg.

    Vielen Dank für Deine bisherige Unterstützung!!!

    Gruss
    Nick

  5. #4
    Gehört zum Inventar
    Registriert seit
    18.02.2005
    Beiträge
    8.841
    Bedankte sich
    85
    Erhielt 2.269 Danksagungen
    in 1.936 Beiträgen

    Standard

    Du sendest das Ganze doch bestimmt irgendwie ab oder nicht?
    Dort wirst du doch bestimmt eine URL angeben, wo die Daten nach dem Absenden
    ankommen sollen. Über versteckte Felder steuerst du den internen Ablauf. Das
    kann dann über einen Switch oder eine if/else Bedingung geschehen. Möglichkeiten
    gibt es viele.

    Was ich noch nicht verstehe ist, dass ihr die Platznummern ständig wechelt? Warum
    verändern sich die Plätze in euren Räum und Reihe 1 Platz 1 ist nicht immer Reihe 1
    Platz 1. Das verstehe ich nicht. Mit solchen Konstrukten kann man keine sinnvollen
    Datenbankstrukturen aufbauen. Das geht schief, "error by design".

    Unter session_id verstehe ich etwas ganz anderes, die ID der UserSession und das
    ist damit bestimmt nicht gemeint.

    Grüße
    ec

  6. #5
    Neu an Board
    Registriert seit
    07.12.2005
    Beiträge
    47
    Bedankte sich
    8
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Hi,

    vielen Dank noch mal - ich dachte Du hättest die Komponente com_attend_events auch installiert. Das Absenden habe ich nämlich nicht selber geschrieben und finde es auch irgendwie nicht.

    In der Datei attend_events.html.php ist die Registrierungsform für die Veranstaltung eingetragen. Hier finde ich aber nicht den richtigen Abschnitt, wo ich den UPDATE-Befehl eintragen musss.

    In der attend_events.php - diese wird scheinbar nach Klick auf den Registrierungsbutton, irgendwie aufgerufen - wird eine Bestätigungsemail an den Besucher versendet. Wenn ich es an der Stelle eintrage, wird aber scheinbar $seat = intval(mosGetParam($_POST,'seat',0)); nicht übergeben.

    Die $row->session_id ist die eindeutige ID der Veranstaltung.

    Hab schon echt viel herumexpirementiert, aber noch keine Lösung gefunden.

    Gruss
    Darius

  7. #6
    Gehört zum Inventar
    Registriert seit
    18.02.2005
    Beiträge
    8.841
    Bedankte sich
    85
    Erhielt 2.269 Danksagungen
    in 1.936 Beiträgen

    Standard

    Die attend_events.php ist die Datei, die immer aufgerufen wird. Die "HTML" Datei wird
    in die attend_events.php inkludiert. Der Funktionsaufruf erfolgt also über
    attend_events.php > task > switch > funktion > html Datei > funktion (ggf. klasse)

    Über den task (so nehme ich an) wird auch diese Komponente interen gesteuert.
    Nach dem Absenden wird also ein Wert für task mitgeschickt, die attend_events.php
    aufgerufen, über den switch in die jeweilige Funktion. Dort sollte dann in der entsprechenden
    Funktion auch das Speichern möglich sein.

    Grüße
    ec

  8. #7
    Neu an Board
    Registriert seit
    07.12.2005
    Beiträge
    47
    Bedankte sich
    8
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Okay, wenn ich Dich richtig verstanden habe, dann sollte der Aufruf intval(mosGetParam($_POST,'seat',0)) in der attend_events.php funktionieren, obwohl die Auswahlbox 'seat' in der attend_events.html.php liegt!?

    Tja, das habe ich schon probiert, aber es hat nicht geklappt - muss wohl irgendwo noch einen Fehler haben.

    Danke
    Darius

  9. #8
    Gehört zum Inventar
    Registriert seit
    18.02.2005
    Beiträge
    8.841
    Bedankte sich
    85
    Erhielt 2.269 Danksagungen
    in 1.936 Beiträgen

    Standard

    Wenn du die Daten mit der Methode POST versendest, dann ja.

    Schau dir doch einmal mal an, was
    PHP-Code:
    var_dump($_POST); 
    zu bieten hat, dann wirst du sehen.

    Gruß
    ec

  10. Erhielt Danksagungen von:


  11. #9
    Neu an Board
    Registriert seit
    07.12.2005
    Beiträge
    47
    Bedankte sich
    8
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Zitat Zitat von ecomeback Beitrag anzeigen
    Wenn du die Daten mit der Methode POST versendest, dann ja.

    Schau dir doch einmal mal an, was
    PHP-Code:
    var_dump($_POST); 
    zu bieten hat, dann wirst du sehen.

    Gruß
    ec
    Hi ecomeback,

    vielen vielen Dank, habe noch etwas probiert und es endlich hinbekommen. Tja, manchmal schlägt auch der CopyPaste-Teufel zu. ;o)

    Sehr gute Unterstützung, ohne gleich einen eigenen Hack anzubieten!

    Gruss
    Darius

+ Antworten

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein