public function updateCountryList(): bool
{
$reader = $this->app()
->http()
->reader()
;
$countryList = null;
try
{
$response = $reader->getUntrusted('http://api.countrylayer.com/v2/all?access_key=YOUR_API_KEY');
if ($response)
{
$jsonText = $response->getBody()->getContents();
$response->getBody()->close();
if ($response->getStatusCode() == 200)
{
try
{
$countryList = \GuzzleHttp\json_decode($jsonText, true);
}
catch (\InvalidArgumentException $e)
{
\XF::logException($e, false, 'Security error:');
return false;
}
}
else
{
\XF::logError(\XF::phraseDeferred('received_unexpected_response_code_x_message_y', [
'code' => $response->getStatusCode(),
'message' => $response->getReasonPhrase()
]));
return false;
}
}
}
catch (\GuzzleHttp\Exception\RequestException $e)
{
\XF::logException($e, false, 'eCommerce error:');
return false;
}
if (!is_array($countryList))
{
return false;
}
/** @var \DBTech\eCommerce\Entity\Country[]|\XF\Mvc\Entity\ArrayCollection $existingCountries */
$existingCountries = $this->findCountriesForList()->fetch();
$currentCountries = [];
foreach ($countryList as $country)
{
if (!isset($existingCountries[$country['alpha2Code']]))
{
/** @var \DBTech\eCommerce\Entity\Country $newCountry */
$newCountry = $this->em->create('DBTech\eCommerce:Country');
$newCountry->bulkSet([
'country_code' => $country['alpha2Code'],
'name' => $country['name'],
'native_name' => $country['name'],
'iso_code' => $country['alpha3Code'],
]);
$newCountry->save();
$currentCountries[$country['alpha2Code']] = $newCountry;
}
else
{
/** @var \DBTech\eCommerce\Entity\Country $newCountry */
$newCountry = $existingCountries[$country['alpha2Code']];
if ($newCountry->name != $country['name'])
{
$newCountry->fastUpdate('name', $country['name']);
}
$currentCountries[$country['alpha2Code']] = $newCountry;
}
}
$missingCountries = array_diff_key($existingCountries->toArray(), $currentCountries);
/** @var \DBTech\eCommerce\Entity\Country $country */
foreach ($missingCountries as $country)
{
$country->delete();
}
return true;
}