From 6736975720a310f8e4089b393410358d33447204 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rapha=C3=ABl=20Barrois?= Date: Mon, 18 Jun 2012 01:04:58 +0200 Subject: [PATCH] Include pre-split address lines in CSV export. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Since other entities insist on joining the lines themselves, we have to split them when exporting. Administrations, wasting computing power since 1798... Signed-off-by: Raphaël Barrois --- include/userset.inc.php | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/include/userset.inc.php b/include/userset.inc.php index ac6b261..d191161 100644 --- a/include/userset.inc.php +++ b/include/userset.inc.php @@ -427,6 +427,36 @@ class AddressesView implements PlView $this->set =& $set; } + /* Convert a single address field into 3 lines. + */ + public static function split_address($address) + { + $lines = preg_split("/(\r|\n)+/", $address, -1, PREG_SPLIT_NO_EMPTY); + $nb_lines = count($lines); + switch ($nb_lines) { + case 0: + // No data => nothing + return array("", "", ""); + case 1: + // Single line => Assume it's city+zipcode + $line = $lines[0]; + return array("", "", $line); + case 2: + // Two lines => Assume it's street \n city + $line1 = $lines[0]; + $line3 = $lines[1]; + return array($line1, "", $line3); + case 3: + return $lines; + default: + // More than 3 lines => Keep 2 last intact, merge other lines. + $line3 = array_pop($lines); + $line2 = array_pop($lines); + $line1 = implode(" ", $lines); + return array($line1, $line2, $line3); + } + } + public function apply(PlPage $page) { $pids = $this->set->getIds(new PlLimit()); @@ -434,7 +464,10 @@ class AddressesView implements PlView pl_cached_content_headers('text/x-csv', 'iso-8859-1', 1, 'adresses.csv'); $csv = fopen('php://output', 'w'); - fputcsv($csv, array('PROMOTION', 'CIVILITE', 'NOM', 'PRENOM', 'SOCIETE', 'ADRESSE', 'CP', 'EMAIL'), ';'); + fputcsv($csv, + array('PROMOTION', 'CIVILITE', 'NOM', 'PRENOM', 'SOCIETE', 'ADRESSE', 'ADRESSE1', 'ADRESSE2', 'ADRESSE3', 'CP', 'EMAIL'), + ';'); + if (!empty($pids)) { $res = XDB::query("SELECT pd.promo, p.title, IF (pn.firstname_ordinary = '', UPPER(pn.firstname_main), UPPER(pn.firstname_ordinary)) AS firstname, @@ -448,8 +481,12 @@ class AddressesView implements PlView AND pj.id = IF(pa.type = 'job', pa.id, NULL)) LEFT JOIN profile_job_enum AS pje ON (pj.jobid = pje.id) WHERE pa.pid IN {?} AND FIND_IN_SET('ax_mail', pa.flags)", $pids); - foreach ($res->fetchAllAssoc() as $item) { - fputcsv($csv, array_map('utf8_decode', $item), ';'); + foreach ($res->fetchAllRow() as $item) { + list($promo, $title, $lastname, $firstname, $company, $full_address, $zipcode, $email) = array_map('utf8_decode', $item); + $lines = self::split_address($full_address); + fputcsv($csv, + array($promo, $title, $lastname, $firstname, $company, $full_address, $lines[0], $lines[1], $lines[2], $zipcode, $email), + ';'); } } fclose($csv); -- 2.1.4