PHP code example of salesrender / plugin-core-geocoder
1. Go to this page and download the library: Download salesrender/plugin-core-geocoder library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
salesrender / plugin-core-geocoder example snippets
use SalesRender\Plugin\Components\Db\Components\Connector;
use SalesRender\Plugin\Components\Form\Autocomplete\AutocompleteRegistry;
use SalesRender\Plugin\Components\Info\Developer;
use SalesRender\Plugin\Components\Info\Info;
use SalesRender\Plugin\Components\Info\PluginType;
use SalesRender\Plugin\Components\Settings\Settings;
use SalesRender\Plugin\Components\Translations\Translator;
use SalesRender\Plugin\Core\Geocoder\Components\Geocoder\GeocoderContainer;
use SalesRender\Plugin\Instance\Geocoder\Geocoder;
use SalesRender\Plugin\Instance\Geocoder\SettingsForm;
use Medoo\Medoo;
use XAKEPEHOK\Path\Path;
# 0. Configure environment variable in .env file, that placed into root of app
# 1. Configure DB (for SQLite *.db file and parent directory should be writable)
Connector::config(new Medoo([
'database_type' => 'sqlite',
'database_file' => Path::root()->down('db/database.db')
]));
# 2. Set plugin default language
Translator::config('ru_RU');
# 3. Configure info about plugin
Info::config(
new PluginType(PluginType::GEOCODER),
fn() => Translator::get('info', 'Plugin name'),
fn() => Translator::get('info', 'Plugin markdown description'),
[
'countries' => ['RU'],
],
new Developer(
'Your (company) name',
'[email protected]',
'example.com',
)
);
# 4. Configure settings form
Settings::setForm(fn() => new SettingsForm());
# 5. Configure form autocompletes (or remove this block if not used)
AutocompleteRegistry::config(function (string $name) {
return null;
});
# 6. Configure GeocoderContainer with your geocoder implementation
GeocoderContainer::config(new Geocoder());
namespace SalesRender\Plugin\Instance\Geocoder;
use SalesRender\Components\Address\Address;
use SalesRender\Components\Address\Location;
use SalesRender\Plugin\Core\Geocoder\Components\Geocoder\GeocoderInterface;
use SalesRender\Plugin\Core\Geocoder\Components\Geocoder\GeocoderResult;
use SalesRender\Plugin\Core\Geocoder\Components\Geocoder\Timezone;
class Geocoder implements GeocoderInterface
{
/**
* @param string $typing - free-form text input by the user
* @param Address $address - structured address data
* @return GeocoderResult[]
*/
public function handle(string $typing, Address $address): array
{
// Option 1: If $typing is not empty, use it as free-form search
if (!empty(trim($typing))) {
// Call your geocoding API with the free-form text
// Parse the response into GeocoderResult objects
$resolvedAddress = new Address(
'Region', // region
'City', // city
'Street 1', // address_1
'', // address_2
'123456', // postcode
'RU', // countryCode
new Location(55.7558, 37.6173) // latitude, longitude
);
return [
new GeocoderResult(
$resolvedAddress,
new Timezone('Europe/Moscow'),
'Additional info about this result'
),
];
}
// Option 2: If $typing is empty, resolve/enhance the structured $address
$handledAddress = new Address(
strtoupper($address->getRegion()),
strtoupper($address->getCity()),
strtoupper($address->getAddress_1()),
strtoupper($address->getAddress_2()),
strtoupper($address->getPostcode()),
$address->getCountryCode(),
$address->getLocation()
);
$timezone = null;
if ($address->getCountryCode() && !empty($address->getRegion())) {
$timezone = new Timezone('UTC+03:00');
}
return [new GeocoderResult($handledAddress, $timezone)];
}
}
use SalesRender\Plugin\Core\Geocoder\Factories\WebAppFactory;
application->run();
#!/usr/bin/env php
use SalesRender\Plugin\Core\Geocoder\Factories\ConsoleAppFactory;
tory->build();
$application->run();
namespace SalesRender\Plugin\Instance\Geocoder;
use SalesRender\Plugin\Components\Form\FieldDefinitions\FieldDefinition;
use SalesRender\Plugin\Components\Form\FieldDefinitions\PasswordDefinition;
use SalesRender\Plugin\Components\Form\FieldDefinitions\StringDefinition;
use SalesRender\Plugin\Components\Form\FieldGroup;
use SalesRender\Plugin\Components\Form\Form;
use SalesRender\Plugin\Components\Form\FormData;
use SalesRender\Plugin\Components\Translations\Translator;
class SettingsForm extends Form
{
public function __construct()
{
$nonNull = function ($value, FieldDefinition $definition, FormData $data) {
$errors = [];
if (is_null($value)) {
$errors[] = Translator::get('settings', 'Field can not be empty');
}
return $errors;
};
parent::__construct(
Translator::get('settings', 'Settings'),
null,
[
'main' => new FieldGroup(
Translator::get('settings', 'Main settings'),
null,
[
'email' => new StringDefinition(
Translator::get('settings', 'Email'),
null,
$nonNull
),
'password' => new PasswordDefinition(
Translator::get('settings', 'Password'),
null,
$nonNull
),
]
),
],
Translator::get('settings', 'Save'),
);
}
}
use SalesRender\Components\Address\Address;
interface GeocoderInterface
{
/**
* @param string $typing - free-form text input
* @param Address $address - structured address data
* @return GeocoderResult[]
*/
public function handle(string $typing, Address $address): array;
}
// From timezone name
$tz = new Timezone('Europe/Moscow');
$tz->getName(); // "Europe/Moscow"
$tz->getOffset(); // null
// From UTC offset
$tz = new Timezone('UTC+03:00');
$tz->getName(); // null
$tz->getOffset(); // "UTC+03:00"
// Invalid -- throws InvalidTimezoneException
$tz = new Timezone('Invalid/Zone');