<?php
/***************************************************************************
- * Copyright (C) 2003-2010 Polytechnique.org *
+ * Copyright (C) 2003-2011 Polytechnique.org *
* http://opensource.polytechnique.org/ *
* *
* This program is free software; you can redistribute it and/or modify *
abstract class Geocoder {
// Geocodes @p the address, and returns the corresponding updated address.
// Unknown key-value pairs available in the input map are retained as-is.
- abstract public function getGeocodedAddress(Address &$address);
+ abstract public function getGeocodedAddress(Address $address);
// Cleans the address from its geocoded data
- abstract public function stripGeocodingFromAddress(Address &$address);
+ abstract public function stripGeocodingFromAddress(Address $address);
// Updates geoloc_administrativeareas, geoloc_subadministrativeareas and
// geoloc_localities databases with new geocoded data and returns the
// corresponding id.
- static public function getAreaId(Address &$address, $area)
+ static public function getAreaId(Address $address, $area)
{
static $databases = array(
'administrativeArea' => 'geoloc_administrativeareas',
'subAdministrativeArea' => 'geoloc_subadministrativeareas',
'locality' => 'geoloc_localities',
);
+ static $extras = array(
+ 'subAdministrativeArea' => array(
+ 'field' => 'administrativearea',
+ 'name' => 'administrativeAreaName'
+ )
+ );
$areaName = $area . 'Name';
+ $areaNameLocal = $areaName . 'Local';
$areaId = $area . 'Id';
if (!is_null($address->$areaName) && isset($databases[$area])) {
- $res = XDB::query('SELECT id
+ $extra = (isset($extras[$area]) ? $extras[$area]['administrativeAreaName'] : false);
+
+ $res = XDB::query('SELECT id, nameLocal
FROM ' . $databases[$area] . '
WHERE name = {?}',
$address->$areaName);
if ($res->numRows() == 0) {
- XDB::execute('INSERT INTO ' . $databases[$area] . ' (name, nameLocal, country)
- VALUES ({?}, {?}, {?})',
- $address->$areaName, $address->$areaNameLocal, $address->countryId);
+ XDB::execute('INSERT INTO ' . $databases[$area] . ' (name, nameLocal, country' .
+ ($extra ? ', ' . $extras[$area]['field'] : '') . ')
+ VALUES ({?}, {?}, {?}' . ($extra ? ', {?}' : '') . ')',
+ $address->$areaName, $address->$areaNameLocal, $address->countryId,
+ ($extra ? $address->$extra : null));
$address->$areaId = XDB::insertId();
} else {
// XXX: remove this once all areas have both nameLocal and name.
// and the city name, within the limit of $limit number of lines.
static public function getFirstLines($text, $postalCode, $limit)
{
- $textArray = explode("\n", $text);
+ $text = str_replace("\r", '', $text);
+ $textArray = explode("\n", $text);
+ $linesNb = $limit;
+
for ($i = 0; $i < count($textArray); ++$i) {
- if ($i > $limit || strpos($textLine, $postalCode) !== false) {
- $limit = $i;
+ if ($i > $limit || strpos($textArray[$i], $postalCode) !== false) {
+ $linesNb = $i;
break;
}
}
- return implode("\n", array_slice($textArray, 0, $limit));
+ $firstLines = implode("\n", array_slice($textArray, 0, $linesNb));
+
+ // Adds empty lines to complete the $limit lines required.
+ for (; $i < $limit; ++$i) {
+ $firstLines .= "\n";
+ }
+ return $firstLines;
}
// Returns the number of non geocoded addresses for a user.