Hallo zusammen,
gibt es bei dem Newsletter Modul von Contao, auch die Möglichkeit
die E-Mail Adressen wieder zu exportieren?
Gruß Ulli
Hallo zusammen,
gibt es bei dem Newsletter Modul von Contao, auch die Möglichkeit
die E-Mail Adressen wieder zu exportieren?
Gruß Ulli
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
Danke für den schnellen Tipp, hat geklappt.
So lässt sich auch der Name mit exportieren, falls er in den Benutzerdaten hinterlegt ist:
in \system\modules\newsletter_export\classes\Newslett erExport.php Zeile 45PHP-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")
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
Die Felder-Überschriften im Export auch entsprechend ergänzen: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")
in \system\modules\newsletter_export\classes\Newslett erExport.php Zeile 64
Was noch hakt:PHP-Code:
$output .= '"Firstname", "Lastname", "Gender", "E-mail", "Active"'. "\n" ;
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:
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?Code:"Firstname", "Lastname", "Gender", "E-mail","Active" "Max", "Mustermann", "male","mustermann@email.de","1"
Anbei die soweit modifizierte Datei aus der Newsletter-Export-Extension.
Ich würde die Funktion so schreiben:Ist natürlich ungetestet. Kann sein, dass ich noch einen Fehler im query habe (oder dass das zusammenführen so nicht funktioniert).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;
}
Das ergibt leider einen Fehler im Export-Ergebnis:
Das hier ist die ganze NewsletterExport.php mit deiner Variante: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
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;
}
}
?>
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:
und bei Mitglieder-Abonnenten steht:Code:"","","","foo@domain.tld","1"
Die funktionierende NewsletterExport.php muss also so aussehen:Code:"Max","Mustermann","male","max@mustermann.de","1"
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;
}
}
?>
Hi,
wenn mich nicht alles täuscht, liegt der Fehler hier:
da ist ein $ zuvielCode:$$objRow->row()
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...
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, 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?
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)
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)?
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)
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;
}
}
?>
Ich hab' dazu auch mal einen pull request erstellt: lionel-m/newsletter-export/#2
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.
Ja, hatte ich hier schon geposted bzw. editiert
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 in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Lesezeichen