PHP-Objekte mit Ajax verwenden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • PHP-Objekte mit Ajax verwenden

    Hi,

    ich hab mich jetzt schon ma durch google gesucht und weiss nun nicht mehr weiter. Folgende Problematik.

    Ich bin dabei meine Website zu programmieren. Dabei habe ich mir schon für den shop einige Klassen erstellt. Nun möchte ich eine dieser Klassen (für den Warenkorb auszugeben) über AJAX mit einem onClick-Ereignis aktualisieren lassen. Wie ein normaler httpRequest über AJAX mit GET und POST funktioniert weiss ich schon. Nur kann ich damit soweit ich weiss nur eine PHP-Datei aufrufen. Diese läuft dann linear von oben nach unten durch. Ich möchte aber dass eine Klasse automatisch beim httpRequest instanziiert wird. Klar könnte ich jetzt in der PHP-Datei am Anfang einfach die Klasse instanziieren und die nötige Methode aufrufen, oder über __construct() das gute Stück vonn alleine loslegen lassen, aber dafür gibt es denk ich sicherlich eine einfachere Methode.

    Expliziten Quellcode habe ich noch nicht. Damit fange ich nachher erst an. Ich hatte gehofft, das mir einer netter Weise einen kurzen Tipp geben kann, wie ich sowas über AJAX aufrufen kann.

    Mfg

    Ralle
  • Wie ein normaler httpRequest über AJAX mit GET und POST funktioniert weiss ich schon. Nur kann ich damit soweit ich weiss nur eine PHP-Datei aufrufen. Diese läuft dann linear von oben nach unten durch

    du hast es richtig verstanden. Und deswegen schließt es aus, dass irgendwelchen Code dynamisch nachlädst.

    Erläutere uns doch einfach was du vorhast. Schließlich macht es keinen Sinn Objekte zu instanziieren, die nichts tun... und wenn sie etwas tun sollen, dann kannst du ja alles super linear mit einem HTTP Request realisieren.
  • Hi,

    Wie schon gesagt bastel ich an meiner Website und programmiere mir dazu ein eigenes CMS, da mir Joomla und Co. nicht richtig gefallen (immer das gleiche). Im Shop habe ich für jeden Artikel ein Formular mit einem Butten. Wenn ich auf diesen drauf klicke, soll der Artikel in den Warenkorb gelegt werden. Genau das will ich über AJAX lösen. Jedoch wollt ich dass das ganze in eine Klasse packen, weil ich dort später noch auf gewisse Methoden (wie z.B. DB-Abfragen) zurgreifen möchte. Wenn ich es linear aufbauen müsste ich ja wieder alle Dateien einbinden und Objekte erzeugen. Daher dachte ich , dass es evtl eine Möglichkeit gäbe, dies eleganter zu lösen.

    Hier mal der Anfang vom Warenkorb:

    Quellcode

    1. class _CART extends _SHOP {
    2. public function __construct() {
    3. switch($case = _CART::CHECKCART($_REQUEST['product'])):
    4. case "0": $_SESSION['cartObjects'] = $_REQUEST['product']; break;
    5. case "1": $_SESSION['cartObjects'] .= ", ".$_REQUEST['product']; break;
    6. case "2": _CART::REQUEST_ADD(); break;
    7. endif;
    8. }
    9. private function CHECKCART($product) {
    10. if(isset($_SESSION['cartObjects'])):
    11. $cartObjects = explode(",", $_SESSION['cartObjects']);
    12. foreach($cartObjects as $object): if($object == $product): return 2; endif; endforeach;
    13. return 1;
    14. else:
    15. return 0;
    16. endif;
    17. }
    18. private function REQUEST_ADD() {
    19. }
    20. }
    Alles anzeigen


    Mfg

    Ralle
  • Verfolge deinen objektorientierten Ansatz mal weiter.
    Letztendlich wirst du ein Model/View/Controller Konzept verfolgen und du wirst einen zentralen Controller (index.php) haben der sowohl AJAX Requests als auch normale Templates ausliefert.
    Dann wirst du keine Probleme mehr mit Includes haben und das geschilderte Problem wird es nicht geben.

    Ich habe auch erst vor kurzem einen Shop programmiert und um ein Produkt hinzuzufügen brauchst du auch mit AJAX eigentlich nicht mehr als drei Zeilen.

    Quellcode

    1. <?php
    2. include('requirements.php'); // alle notwendigen includes + session_start
    3. Warenkorb::addItem(new Product($_GET['productID']));


    Kleine Anmerkung zu deinem Code Beispiel: Schalte Warnungen mit error_reporting(E_ALL) mal an.
    Dann wirst du ein paar Warnungen zu deinem Code bekommen.
    Mit "_CART::" ruft man statische Funktionen auf. Mit $this normale Memberfunktionen.
  • Danke für deine schnelle Antwort.

    Quellcode

    1. Warenkorb::addItem(new Product($_GET['productID']));


    ist das der Aufruf der PHP-Methode und in den Klammer das (new Product($_GET['productID'])); der AJAX Teil? Ich kenn mich da leider noch nicht so gut aus. Hab bis jetzt zu dem Thema im Netz immer nur die standard POST und GET-Methode gefunden. Hab hier auch ein Buchliegen, aber so ganz blicke ich da noch nicht durch. Kannst du mir bitte die Zeile erklären?

    Mfg

    Ralle
  • Die Zeilen haben nichts magisches. AJAX kann man nicht in PHP programmieren.
    Das sind nur zwei PHP Klassen: Warenkorb und Product.

    Und der AJAX Aufruf macht nur einen HTTP Call auf z.B. index.php?action=additem&productID=10
    Danach ist das Item im Warenkorb.

    Ändere den Aufruf mal zu ...

    index.php

    Quellcode

    1. Warenkorb::getInstance()->addItem(new Product($_GET['productID']));


    Dann hast du User Validierung, Produkt Validierung, Warenkorb hinzufügen und Zähler erhöhen, falls das Item schon im Warenkorb war:

    Zum Nachlesen
    * [wiki]Einführung in PDO[/wiki]
    * [wiki]AJAX Hintergrundwissen[/wiki]

    Warenkorb.php

    Quellcode

    1. // minumum requirements
    2. require_once('Product.php');
    3. require_once('MyDB.php');
    4. /**
    5. * shopping basket
    6. */
    7. class Warenkorb {
    8. /**
    9. * @var Warenkorb
    10. */
    11. private static $instance = null;
    12. /**
    13. * @var integer
    14. */
    15. private $userID = 0;
    16. /**
    17. * hide because of singleton
    18. */
    19. private function __construct($userID) {
    20. $this->userID = $userID;
    21. }
    22. /**
    23. * singleton
    24. * this ensures the user to be logged in
    25. */
    26. public static function getInstance() {
    27. if(!isset($_SESSION['userID'])) {
    28. throw new Exception('you have to be logged in');
    29. }
    30. if(self::$instance === null) {
    31. self::$instance = new self($_SESSION['userID']);
    32. }
    33. return self::$instance;
    34. }
    35. /**
    36. * adds item to shopping basket
    37. *
    38. * @param Product $item
    39. * @return boolean
    40. */
    41. public function addItem(Product $item) {
    42. $sql = "INSERT INTO warenkorb (userID,itemID) VALUES (:userID, :itemID) ON DUPLICATE KEY UPDATE count = count + 1";
    43. $stmt = MyDB::getInstance()->prepare($sql);
    44. return $stmt->execute(array(
    45. ':userID' => $_SESSION['userID'],
    46. ':itemID' => $item->itemID
    47. ));
    48. }
    49. }
    Alles anzeigen


    Product.php

    Quellcode

    1. class Product {
    2. public $productID = 0;
    3. public function __construct($productID) {
    4. // TODO: db query - does this product exist?
    5. $this->productID = $productID;
    6. }
    7. }


    PS: Thread ins PHP Forum verschoben
  • Hi,

    danke für die Antwort. Ich hab eben erst ma deinen Tipp mit der requirement und dem $this und so befolgt. Jetzt läuft nix mehr -.-. Ich hab zwar ne DB Verbindung so wies aussieht (bekomme keine Fehlermeldung), aber meine DB-Abfragen ergeben kein fetch_array mehr, obwohl die queries korrekt sind.

    Wenn ich jetzt mit $this-> irgendwelche Methoden innerhalb einer Klasse aufrufe, bekomme ich direkt einen Fehler.

    Ich glaub ich muss doch noch einiges neu aufbauen und über php und so lernen.

    Mfg

    Ralle

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von RaleKay ()

  • Joa. Ich muss erst ma die Website fertig bekommen. Die is eigentlich schon überfällig. Aber ich bin halt ne standalone Entwicklungsabteilung.

    Das Problem mit dem Einfügen von Artikeln in den Warenkorb hab ich übrigens inzwischen gelöst bekommen. Hab mal grob alles im FireBug und FirePHP überprüfen lassen. Scheint keine Fehler zu geben und hat ne Ladezeit von insgesamt 515ms. Das sollte ausreichend schnell sein.

    Mfg

    Ralle