Ankündigung

Einklappen
Keine Ankündigung bisher.

Opencart: Ausgabe in einem Bestellprozess als csv speichern

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Opencart: Ausgabe in einem Bestellprozess als csv speichern

    Hallo zusammen.
    Ich entwickle einen neuen Webshop mit Opencart und stosse vor ein Problem. Ich möchte beim letzten Bestellschritt (Bestellung absenden) einen Code einbauen, so dass die Bestellung per Mail bestätigt wird (bereits als Standard vorhanden) und gleichzeitig einige Felder in ein csv auf dem Server gespeichert werden.

    Dazu habe ich bereits einen Code ausprobiert:
    ...
    PHP-Code:
    $mail->setSubject(html_entity_decode($subjectENT_QUOTES'UTF-8'));
    $mail->setText($message);
    $mail->send();

    $result $order_query;
    if (!
    $result) die('Couldn\'t fetch records');
    $num_fields mysql_num_fields($result);
    $headers = array();
    for (
    $i 0$i $num_fields$i++) {
    $headers[] = mysql_field_name($result $i);
    }
    $fp fopen('/../../../files/export.csv''w');
    if (
    $fp && $result) {
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="export.csv"');
    header('Pragma: no-cache');
    header('Expires: 0');
    fputcsv($fp$headers);
    while (
    $row $result->fetch_array(MYSQLI_NUM)) {
    fputcsv($fparray_values($row));
    }
    die;

    Die Connection zur DB habe ich bewusst ausgelassen, da weiter oben bereits diese aufgebaut wird. Die ersten drei Zeilen sind die letzten Zeilen des Mail-Befehls und sind nur zum Verständnis der Positionierung aufgeführt. Die Bestellung wird mit diesem Code fehlerlos ausgeführt, jedoch wird keine Datei erzeugt. Das entsprechende Verzeichnis hat auch die benötigten Rechte. Was mache ich falsch? Auf Wunsch sende ich auch gerne die ganze PHP Datei.

    Danke und liebe Grüsse

  • #2
    Hallo,

    Opencart sendet Mails wirklich noch mit mail()???
    Dann bau das lieber um auf eine Mailerklasse ( PHPMailer oder SwiftMailer ) oder nimm Dir ein anderes OpenSource-System, das das bereits implementiert hat.

    Zu Deiner Frage: Versuch mal die Datei auch zu schliessen ( fclose($fp); )

    Gruß Arne

    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Hi Arne. Danke für die Antwort. Leider lag es nicht an fclose. Grundsätzlich stört mich die "Mail-Situation" nicht. Der Fokus liegt wirklich in der Speicherung der aktuellen Bestellung, da ein Zulieferer auf diese zugreifen muss. Opencart hat eben den Vorteil, dass es sehr einfach anzupassen ist (z.B.: gegenüber Presta). Nun, das Problem ist nicht gelöst - die Datei wird nach wie vor nicht erzeugt. Kurze Frage: Wird die Datei auch erzeugt, wenn der Query falsch ist oder wird eine Fehlermeldung generiert? Denn ich erhalte keine Fehlermeldung.

      Gruss, 27

      Kommentar


      • #4
        Das "die" im Code ist halt ziemlicher Pfusch, weil so Fehler totgeschwiegen werden. fopen() liefert im Fehlerfall FALSE. Wenn das passiert, sollte es auch behandelt und nicht einfach ignoriert werden.

        Und die header() sind hier kompletter Käse. Wer auch immer das geschrieben hat, hat überhaupt keine Ahnung, was er da macht. Das sind ganz schlechte Voraussetzungen um etwas zu programmieren.

        Kommentar


        • #5
          Und mysql_ ist veraltet und aus der aktuellen PHP Verison daher auch schon entfernt. Aktuell ist PDO oder mysqli_ für den DB-Zugriff.
          The string "()()" is not palindrom but the String "())(" is.

          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6
            Den Code habe ich empfohlen bekommen aber ich habe dort sehr geringe Erfahrung. Deshalb kann ich die Qualität nicht beurteilen. hingegen habe ich auch schon erfahren dass ich lieber PDO verwenden soll. Mangelnd Erfahrung konnte ich jedoch Nichts erstellen. Hierzu gibt es aber zu sagen, dass der DB Zugriff bereits in der Ursprungsdatei geschrieben ist und ich daher auf diese Zeilen im Code verzichten kann.

            $conn = new PDO("mysql:host=localhost;dbname=dbname", 'usr', 'pw');
            $sql = $data;
            $results = $conn->query($sql);

            $filename = "db_user_export_".time().".csv";

            $handle = fopen($filename, 'w+');

            fputcsv($handle, array('quantity','model'));

            foreach($results as $row)
            {
            fputcsv($handle, array($row['quantity'], $row['model']));
            }

            fclose($handle);

            Dieser Code generiert eine "Internal Server Error" Fehlermeldung. Die oberste Zeile müsste ich doch löschen, da die Verbindung zur DB bereits weiter oben (nicht sichtbar) hergestellt wird? Bei $sql = $data; bin ich noch unsicher, da ich keinen neuen Query, sondern bereits das Resultat von weiter oben als Query einfügen will.

            Kommentar


            • #7
              Bei der Installation wählst du den DB-Driver aus, da musst du mysqli auswählen, siehe auch http://docs.opencart.com/installation/

              Keine Ahnung was du derzeit hast, weil einmal hast du
              PHP-Code:
              $num_fields mysql_num_fields($result); 
              und dann weiter unten
              PHP-Code:
              while ($row $result->fetch_array(MYSQLI_NUM)) 
              Das kann nicht gehen.

              Kommentar


              • #8
                Die Unterscheidung zwischen PDO und MYSQLI und dem veralteten mysql leuchtet mir ein. Jedoch weiss ich nicht was hier eingesetzt wird. Die Datei ist unter dem Link

                https://github.com/opencart/opencart...kout/order.php

                einsehbar. Bleibt bei mir dennoch das Fragezeichen, ob es an diesem Detail happert oder ich einfach nicht fähig bin, die Puzzelsteine korrekt zu kombinieren.

                Kommentar


                • #9
                  "Einsetzen" muss man hier nichts. Man muss etwas programmieren. Wenn man Code erweitern möchte, muss man auch den bestehenden verstehen. Einfach nur Code irgendwo reinkopieren führt zu nichts.

                  Kommentar


                  • #10
                    Danke Hellbringer

                    Genau hier benötige ich eben die Hilfe. Ich habe den Webshop in den letzten 60 Tagen auf unserer Bedürfnisse angepasst und sogar einige neue Module geschrieben, denn dort verstand ich den Cod und konnte ihn wunschgemäss replizieren. Hier kann ich es nicht - aber ich muss. An diesem Detail steht oder fällt das Ganze, denn das ist die letzte Hürde.

                    Witzig ist, dass ich bereits ein File geschrieben habe, wo ich eine Query auslese und ganz schön strukturiert in ein csv speichere. Alles funktioniert perfekt. Doch hier muss ich nicht meine Query auslesen sondern den Bestellinhalt und da komme ich nicht weiter. Somit gebe ich mich geschlagen und akzeptiere an dieser Stelle das blosse "einsetzen ohne verstehen"

                    Kommentar


                    • #11
                      Einsetzen funktioniert aber nicht. Wenn du es selber nicht machen kannst bzw. nicht lernen willst, brauchst du jemanden, der es für dich macht. Sowas gehört dann eher in "Stellenangebote" oder "Projekthilfe" und nicht in "PHP Einsteiger".

                      Kommentar


                      • #12
                        Zitat von 27eleven
                        Ich habe den Webshop in den letzten 60 Tagen auf unserer Bedürfnisse angepasst und sogar einige neue Module geschrieben, denn dort verstand ich den Cod und konnte ihn wunschgemäss replizieren.
                        Mag ich nicht so recht glauben, wenn ich ehrlich bin.

                        [MOD: verschoben von PHP-Einsteiger]
                        Competence-Center -> Enjoy the Informatrix
                        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                        Kommentar


                        • #13
                          @hellbringer: So, gemäss deinem Vorschlag habe ich mich gestern und heute in die Materie eingelesen und kann zumindest einige Zeilen entfernen. Die oben stehenden Diskussionen über PDO, MYSQLI erübrigen sich da diese bereits durch das originale Dokument abgefangen werden. Wenn ich es richtig verstanden habe, muss ich den Query (oder das Resultat dessen) identifizieren und mit der Funktion fopen in ein csv schreiben und ablegen. Sollte ich dies korrekt verstanden haben, sollte ich es hinkriegen.

                          arne Drews: Doch doch... aber grundsätzlich ist dies in dieser Thematik auch völlig egal Dennoch danke ich für die Ehrlichkeit.

                          Kommentar


                          • #14
                            Zur Info: Konnte es nun anders lösen. Habe ein separates File geschrieben der den gewünschten Export macht und werde es mit einem Cronjob steuern. Danke für die Hilfe

                            Kommentar

                            Lädt...
                            X