Ergebnis 1 bis 22 von 22

Thema: E-Mail Adressen aus Contao exportieren

  1. #1
    Contao-Nutzer
    Registriert seit
    24.03.2013.
    Beiträge
    2

    Standard E-Mail Adressen aus Contao exportieren

    Hallo zusammen,
    gibt es bei dem Newsletter Modul von Contao, auch die Möglichkeit
    die E-Mail Adressen wieder zu exportieren?

    Gruß Ulli

  2. #2
    Contao-Fan Avatar von w3scout
    Registriert seit
    20.06.2009.
    Ort
    Stuttgart
    Beiträge
    273
    Contao-Projekt unterstützen

    Support Contao

    Standard

    https://contao.org/de/extension-list...000009.de.html (für CT 3)
    https://contao.org/de/extension-list....10009.de.html (CT 2)

    oder im Backend -> Erweiterungskatalog nach "newsletter_export" suchen.

    Gruss

  3. #3
    Contao-Nutzer
    Registriert seit
    24.03.2013.
    Beiträge
    2

    Standard

    Danke für den schnellen Tipp, hat geklappt.

  4. #4
    Contao-Fan Avatar von aadursun
    Registriert seit
    25.09.2011.
    Beiträge
    543

    Standard

    Klappt hervorragend!

    VG
    aadursun

  5. #5
    Contao-Nutzer
    Registriert seit
    14.04.2010.
    Beiträge
    128

    Standard

    So lässt sich auch der Name mit exportieren, falls er in den Benutzerdaten hinterlegt ist:
    PHP-Code:
    $objRow $this->Database->prepare("SELECT (SELECT CONCAT_WS(' ', firstname, lastname) FROM tl_member WHERE email = n.email),email,active FROM tl_newsletter_recipients AS n WHERE pid=? ORDER by email"
    in \system\modules\newsletter_export\classes\Newslett erExport.php Zeile 45

  6. #6
    Administrator Avatar von Nina
    Registriert seit
    04.06.2009.
    Ort
    Hamburg
    Beiträge
    4.755
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Als Ergänzung zur Aussage von emkayy, probiere ich mich gerade daran, die Angaben noch etwas sauberer herauszufiltern, denn bei emkay werden Vor- und Nachname in einem Feld ausgegeben.

    Das hab ich schon:

    Vorname, Nachname und Geschlecht von den Mitgliederdaten ausgeben:
    in \system\modules\newsletter_export\classes\Newslett erExport.php Zeile 45
    PHP-Code:
        $objRow $this->Database->prepare("SELECT (SELECT CONCAT_WS(' ', firstname, lastname, gender) FROM tl_member WHERE email = n.email),email,active FROM tl_newsletter_recipients AS n WHERE pid=? ORDER by email"
    Die Felder-Überschriften im Export auch entsprechend ergänzen:
    in \system\modules\newsletter_export\classes\Newslett erExport.php Zeile 64
    PHP-Code:
            $output .= '"Firstname", "Lastname", "Gender", "E-mail", "Active"'"\n" 
    Was noch hakt:
    Ich weiß noch nicht, was ich umstellen muss, damit die ganzen Angaben jeweils in einem separaten "Feld", ausgegeben werden.

    Derzeit erscheint das Ergebnis im Export noch so:
    Code:
    "Firstname", "Lastname", "Gender", "E-mail","Active"
    "Max Mustermann male","mustermann@email.de","1"
    Haben will ich aber:
    Code:
    "Firstname", "Lastname", "Gender", "E-mail","Active"
    "Max", "Mustermann", "male","mustermann@email.de","1"
    Jemand eine Idee, was man da noch umstellen muss?
    Anbei die soweit modifizierte Datei aus der Newsletter-Export-Extension.
    Angehängte Dateien Angehängte Dateien

  7. #7
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Ich würde die Funktion so schreiben:
    PHP-Code:
        public function exportRecipients(DataContainer $dc)
        {
            if (
    $this->Input->get('key') != 'export')
            {
                return 
    '';
            }
            
            
    // get records
            
    $query "SELECT m.firstname, m.lastname, m.gender, r.email, r.active
                        FROM tl_newsletter_recipients AS r
                        LEFT JOIN tl_member AS m ON m.email = r.email
                                                AND r.pid = ?"
    ;
            
    $objRow $this->Database->prepare($query)->execute($dc->id);

            
    // start output
            
    $exportFile =  'newsletter_recipients_export_' date("Ymd-Hi");
            
            
    header('Content-Type: application/csv');
            
    header('Content-Transfer-Encoding: binary');
            
    header('Content-Disposition: attachment; filename="' $exportFile .'.csv"');
            
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            
    header('Pragma: public');
            
    header('Expires: 0');

            
    $output '';
            
    $output .= '"Firstname", "Lastname", "Gender", "E-mail", "Active'"\n" ;

            while (
    $objRow->next())
            {
                
    $output .= '"' join('","', $$objRow->row()).'"' "\n";
            }

            echo 
    $output;
            exit;
        } 
    Ist natürlich ungetestet. Kann sein, dass ich noch einen Fehler im query habe (oder dass das zusammenführen so nicht funktioniert).

  8. #8
    Administrator Avatar von Nina
    Registriert seit
    04.06.2009.
    Ort
    Hamburg
    Beiträge
    4.755
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Das ergibt leider einen Fehler im Export-Ergebnis:
    Code:
    Recoverable error: Object of class Contao\Database\Mysql\Result could not be converted to string in system/modules/newsletter_export/classes/NewsletterExport.php on line 65
    #0 system/modules/newsletter_export/classes/NewsletterExport.php(65): __error(4096, 'Object of class...', '/www/htdocs/w00...', 65, Array)
    #1 system/modules/core/classes/Backend.php(278): Contao\NewsletterExport->exportRecipients(Object(Contao\DC_Table))
    #2 contao/main.php(142): Contao\Backend->getBackendModule('newsletter')
    #3 contao/main.php(293): Main->run()
    #4 {main}
    
    Fatal error:  Call to a member function row() on a non-object in <b>/www/htdocs/xxx/system/modules/newsletter_export/classes/NewsletterExport.php on line 65
    Das hier ist die ganze NewsletterExport.php mit deiner Variante:
    PHP-Code:
    <?php 

    /**
     * Newsletter export
     * CSV export button for newsletter recipients.
     *
     * @author    John Brand (thyon), http://www.thyon.com
     * @author    Lionel Maccaud
     * @copyright John Brand (thyon), http://www.thyon.com
     * @package   newsletterExport
     * @license   LGPL
     */

    /**
     * Run in a custom namespace, so the class can be replaced
     */
    namespace Contao;


    /**
     * Class NewsletterExport
     *
     * Provide methods to handle subscriber export.
     * @copyright  Thyon Design 2008-2013
     * @author     John Brand <john.brand@thyon.com> 
     * @package    Controller 
     */
    class NewsletterExport extends \Backend
    {

        
    /**
         * Return a form to choose a CSV file and import it
         * @param object
         * @return string
         */
        
    public function exportRecipients(DataContainer $dc)
        {
            if (
    $this->Input->get('key') != 'export')
            {
                return 
    '';
            }

            
    // get records
            
    $query "SELECT m.firstname, m.lastname, m.gender, r.email, r.active
                        FROM tl_newsletter_recipients AS r
                        LEFT JOIN tl_member AS m ON m.email = r.email
                                                AND r.pid = ?"
    ;
            
    $objRow $this->Database->prepare($query)->execute($dc->id);

            
    // start output
            
    $exportFile =  'newsletter_recipients_export_' date("Ymd-Hi");

            
    header('Content-Type: application/csv');
            
    header('Content-Transfer-Encoding: binary');
            
    header('Content-Disposition: attachment; filename="' $exportFile .'.csv"');
            
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            
    header('Pragma: public');
            
    header('Expires: 0');

            
    $output '';
            
    $output .= '"Firstname", "Lastname", "Gender", "E-mail", "Active'"\n" ;

            while (
    $objRow->next())
            {
                
    $output .= '"' join('","', $$objRow->row()).'"' "\n";
            }

            echo 
    $output;
            exit;
        }
    }
    ?>

  9. #9
    Administrator Avatar von Nina
    Registriert seit
    04.06.2009.
    Ort
    Hamburg
    Beiträge
    4.755
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Ich habe in besagter Zeile 65 aus $$objRow->row() ein $objRow->row() gemacht.
    Damit ist der Fehler im Export weg.

    Nun stimmt alles. Bei normalen Abonnenten steht:
    Code:
    "","","","foo@domain.tld","1"
    und bei Mitglieder-Abonnenten steht:
    Code:
    "Max","Mustermann","male","max@mustermann.de","1"
    Die funktionierende NewsletterExport.php muss also so aussehen:
    PHP-Code:
    <?php 

    /**
     * Newsletter export
     * CSV export button for newsletter recipients.
     *
     * @author    John Brand (thyon), http://www.thyon.com
     * @author    Lionel Maccaud
     * @copyright John Brand (thyon), http://www.thyon.com
     * @package   newsletterExport
     * @license   LGPL
     */

    /**
     * Run in a custom namespace, so the class can be replaced
     */
    namespace Contao;


    /**
     * Class NewsletterExport
     *
     * Provide methods to handle subscriber export.
     * @copyright  Thyon Design 2008-2013
     * @author     John Brand <john.brand@thyon.com> 
     * @package    Controller 
     */
    class NewsletterExport extends \Backend
    {

        
    /**
         * Return a form to choose a CSV file and import it
         * @param object
         * @return string
         */
        
    public function exportRecipients(DataContainer $dc)
        {
            if (
    $this->Input->get('key') != 'export')
            {
                return 
    '';
            }

            
    // get records
            
    $query "SELECT m.firstname, m.lastname, m.gender, r.email, r.active
                        FROM tl_newsletter_recipients AS r
                        LEFT JOIN tl_member AS m ON m.email = r.email
                                                AND r.pid = ?"
    ;
            
    $objRow $this->Database->prepare($query)->execute($dc->id);

            
    // start output
            
    $exportFile =  'newsletter_recipients_export_' date("Ymd-Hi");

            
    header('Content-Type: application/csv');
            
    header('Content-Transfer-Encoding: binary');
            
    header('Content-Disposition: attachment; filename="' $exportFile .'.csv"');
            
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            
    header('Pragma: public');
            
    header('Expires: 0');

            
    $output '';
            
    $output .= '"Firstname", "Lastname", "Gender", "E-mail", "Active'"\n" ;

            while (
    $objRow->next())
            {
                
    $output .= '"' join('","'$objRow->row()).'"' "\n";
            }

            echo 
    $output;
            exit;
        }
    }
    ?>

  10. #10
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Hi,

    wenn mich nicht alles täuscht, liegt der Fehler hier:

    Code:
    $$objRow->row()
    da ist ein $ zuviel

    Korrekt müsst dann sein:
    Code:
            while ($objRow->next()) 
            { 
                $output .= '"' . join('","', $objRow->row()).'"' . "\n"; 
            } 
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  11. #11
    Administrator Avatar von Nina
    Registriert seit
    04.06.2009.
    Ort
    Hamburg
    Beiträge
    4.755
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Was mir jetzt noch auffällt:

    Es kann vorkommen, dass foo@foo.de als NL-Abonnent eingetragen ist und gleichzeitig auch ein Mitglied mit der selben E-Mail-Adresse existiert. Dann steht im Export beides drin. Kann man es so einrichten, dass das Ding erkennt, ob eine Mailadresse an beiden Orten vorkommt und - falls das der Fall ist - nur die Angaben aus der Mitgliederliste exportiert?

  12. #12
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Zitat Zitat von Nina Beitrag anzeigen
    Was mir jetzt noch auffällt:

    Es kann vorkommen, dass foo@foo.de als NL-Abonnent eingetragen ist und gleichzeitig auch ein Mitglied mit der selben E-Mail-Adresse existiert. Dann steht im Export beides drin. Kann man es so einrichten, dass das Ding erkennt, ob eine Mailadresse an beiden Orten vorkommt und - falls das der Fall ist - nur die Angaben aus der Mitgliederliste exportiert?
    Hm, komisch, dass das so ist, da der LEFT JOIN ja auf die E-Mail Adresse gemacht wird. Sollte bedeuten: wenn es für die E-Mail Adresse ein Mitglied gibt, werden die Informationen des Mitglieds zum Result hinzugefügt, ansonsten steht für diese Row nur die E-Mail Adresse da.

  13. #13
    Administrator Avatar von Nina
    Registriert seit
    04.06.2009.
    Ort
    Hamburg
    Beiträge
    4.755
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hm, irgendwas hakt da noch. Ich habe in der Export-Datei 363 Einträge drin.
    Selbst wenn ich bei dem Newsletter alle Abonnenten (100) + alle existierenden Mitglieder (139) nehme, würde ich nicht auf 363 kommen. Zudem imho nicht alle Mitglieder den Newsletter-Kanal abonniert haben.

    Kann es sein, dass der Export nicht mehr darauf achtet, dass er nur die Daten für eben diesen Newsletter-Kanal bei den Abonnenten und Mitgliedern abonniert, sondern auf die Abonnenten/Mitglieder ALLER Newsletter-Kanäle zugreift?

  14. #14
    Administrator Avatar von Nina
    Registriert seit
    04.06.2009.
    Ort
    Hamburg
    Beiträge
    4.755
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Hm, komisch, dass das so ist, da der LEFT JOIN ja auf die E-Mail Adresse gemacht wird. Sollte bedeuten: wenn es für die E-Mail Adresse ein Mitglied gibt, werden die Informationen des Mitglieds zum Result hinzugefügt, ansonsten steht für diese Row nur die E-Mail Adresse da.
    vielleicht geht das schief, wenn Abonnenten-Mailadressen manuell hinzugefügt wurden?

  15. #15
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Nein, das sollte egal sein. Geht ja nur um den SQL query der - wie schon vorbehalten - evt. nicht richtig ist .

    // hm, habe es getestet, bei mir funktioniert es so wie es soll
    Geändert von Spooky (30.03.2015 um 09:33 Uhr)

  16. #16
    Administrator Avatar von Nina
    Registriert seit
    04.06.2009.
    Ort
    Hamburg
    Beiträge
    4.755
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hast du denn auch mehrere Kanäle mit jeweils eigenen Abonnenten, wobei manche Abonnenten in allen 3 Kanälen vorkommen (und zusätzlich noch ggf. als Mitglieder existieren)?

  17. #17
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Ah, ich denke ich hab nun den Fehler. So lautet die korrekte Query:
    PHP-Code:
            // get records
            
    $query "SELECT m.firstname, m.lastname, m.gender, r.email, r.active
                        FROM tl_newsletter_recipients AS r
                        LEFT JOIN tl_member AS m ON m.email = r.email
                       WHERE r.pid = ?"


    In dieser Zeile fehlt außerdem bei Active noch ein ":
    PHP-Code:
    $output .= '"Firstname", "Lastname", "Gender", "E-mail", "Active"'"\n" 
    Geändert von Spooky (30.03.2015 um 09:57 Uhr)

  18. #18
    Administrator Avatar von Nina
    Registriert seit
    04.06.2009.
    Ort
    Hamburg
    Beiträge
    4.755
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Perfekt, damit funktioniert es jetzt! Vielen Dank!

    Hier nochmal der aktuellste Status der NewsletterExport.php:
    PHP-Code:
    <?php 

    /**
     * Newsletter export
     * CSV export button for newsletter recipients.
     *
     * @author    John Brand (thyon), http://www.thyon.com
     * @author    Lionel Maccaud
     * @copyright John Brand (thyon), http://www.thyon.com
     * @package   newsletterExport
     * @license   LGPL
     */

    /**
     * Run in a custom namespace, so the class can be replaced
     */
    namespace Contao;


    /**
     * Class NewsletterExport
     *
     * Provide methods to handle subscriber export.
     * @copyright  Thyon Design 2008-2013
     * @author     John Brand <john.brand@thyon.com> 
     * @package    Controller 
     */
    class NewsletterExport extends \Backend
    {

        
    /**
         * Return a form to choose a CSV file and import it
         * @param object
         * @return string
         */
        
    public function exportRecipients(DataContainer $dc)
        {
            if (
    $this->Input->get('key') != 'export')
            {
                return 
    '';
            }

            
    // get records
            
    $query "SELECT m.firstname, m.lastname, m.gender, r.email, r.active
                        FROM tl_newsletter_recipients AS r
                        LEFT JOIN tl_member AS m ON m.email = r.email
                       WHERE r.pid = ?"
    ;
            
    $objRow $this->Database->prepare($query)->execute($dc->id);

            
    // start output
            
    $exportFile =  'newsletter_recipients_export_' date("Ymd-Hi");

            
    header('Content-Type: application/csv');
            
    header('Content-Transfer-Encoding: binary');
            
    header('Content-Disposition: attachment; filename="' $exportFile .'.csv"');
            
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            
    header('Pragma: public');
            
    header('Expires: 0');

            
    $output '';
            
    $output .= '"Firstname", "Lastname", "Gender", "E-mail", "Active'"\n" ;

            while (
    $objRow->next())
            {
                
    $output .= '"' join('","'$objRow->row()).'"' "\n";
            }

            echo 
    $output;
            exit;
        }
    }
    ?>

  19. #19
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Ich hab' dazu auch mal einen pull request erstellt: lionel-m/newsletter-export/#2

  20. #20
    Administrator Avatar von Nina
    Registriert seit
    04.06.2009.
    Ort
    Hamburg
    Beiträge
    4.755
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Es gibt noch einen winzigen Fehler, der aber beim Importieren durchaus Auswirkungen haben kann:

    Und zwar fehlt in der Überschriften-Leiste beim letzten Eintrag das letzte Anführungszeichen. Da steht also nur "Active statt "Active". Hat hier beim Import in Newsletter2Go bewirkt, dass dann der erste echte Eintrag immer ignoriert wurde.

  21. #21
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Ja, hatte ich hier schon geposted bzw. editiert

  22. #22
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Version 3.1.0 der Extension beinhaltet nun diese Änderungen von Haus aus. Im Extension Repository ist die Version aber (noch) nicht verfügbar.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

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