Я создал кастомный модуль, где в блоке отображаю погоду, используя данные из https://openweathermap.org/
Код этого блока:
https://phpsandbox.io/n/sweet-forest-1lew-1wmof
Также у меня есть файл WeatherForm.php с формой, которая добавляет в конфигурацию город и API-key, необходие чтобы отображать погоду.
Мне нужно было добавить проверку формы:
1. поля не должны быть пустыми
2. Название города не должно содержать цифр
Я сделал это следующим образом:
<?php public function validateForm(array &$form, FormStateInterface $form_state) {
$pattern = '/[0-9]/';
if (empty(
$form_state->getValue('weather_city'))) {
$form_state->setErrorByName('weather_city', $this->t('Fields should not be empty'));
}
if (preg_match($pattern, $form_state->getValue('weather_city'))) {
$form_state->setErrorByName('weather_city', $this->t('City name should not contain numbers'));
}
}
?>
Но я получил это замечание после code review:
Also, will be good to validate the API key and the city name by the API request.
Cуть замечания в том что нужно проверить, отвечает ли API key и City для сайта https://openweathermap.org/, тоесть подерживает сайт город(есть ли вообще для такого города данные о погоде, ведь пользователь может написать Fdjfjdf) который ввели в инпут, и отвечает ли API key доступу для OpenWeatherMap.
Пользователь вводит в инпуты город и api key и сразу летит запрос к OpenWeatherMap. И соотвественно в коде должна бить такая штука:
<?php$url = "https://api.openweather.org/data/2.5/weather?q=$city_name&appid=$api_key";
$response = $this->client->request('GET', $url);
?>
Где например в $city_name
должно попадать:
$form_state->getValue('weather_api_key')
Тоесть то что введено в форму. Также и для api key нужно сделать.
Я нашел пример как это реализовать:
<?php
public function validateWeatherData(string $city_name, $api_key):bool {
try {
$url = "https://api.openweather.org/data/2.5/weather?q=$city_name&appid=$api_key";
$response = $this->client->request('GET', $url);
if ($response->getStatusCode() != 200) {
throw new \Exception('Failed to retrieve data.');
}
$reg_ex = "#^[A-Za-z-]=$#";
return preg_match($reg_ex, $city_name);
}
catch (GuzzleException $e) {
return FALSE;
}
}?>
Но я не знаю, как интегрировать код примера в мою функцию validateForm
. Подскажите пожалуйста как это сделать?
Весь код моей формы:
https://phpsandbox.io/n/spring-mountain-gdnn-emozx
Комментарии
Похоже на тестовое задание какое-то и, судя по всему, вы не совсем понимаете что делаете
Будет примерно так.
https://phpsandbox.io/n/falling-wave-l6mv-rls2j
P.S. код я не проверял и не гарантирую его работоспособность, писал наобум без автокомплитов и прочих штук, которые обычно помогают писать без ошибок, поэтому нужно всё всё всё проверять
Добавил комментариев, чтобы было хоть чуть-чуть понятней.
Ну и - я бы на месте проверяющего спрашивал про каждую строчку кода, так что надо готовиться
Спасибо большое. Вы проделали большую работу! Я очень извиняюсь я наверное не правильно сформулировал вопрос, но суть замечания в том что нужно проверить, отвечает ли API key и City для сайта https://openweathermap.org/, тоесть подерживает сайт город(есть ли вообще для такого города данные о погоде, ведь пользователь может написать Fdjfjdf) который ввели в инпут, и отвечает ли API key доступу для OpenWeatherMap.
Пользователь вводит в инпуты город и api key и сразу летит запрос к OpenWeatherMap. И соотвественно в коде должна бить такая штука:
<?php$url = "https://api.openweather.org/data/2.5/weather?q=$city_name&appid=$api_key";
$response = $this->client->request('GET', $url);
?>
Где например в
$city_name
должно попадать:$form_state->getValue('weather_api_key')
Тоесть то что введено в форму. Также и для api key нужно сделать.
Понимание, что нужно сделать у меня уже нарисовывается, а вот как это кодом реализовать, здесь сложнее.
Обновил https://phpsandbox.io/n/falling-wave-l6mv-rls2j
Смысл в том, что мы читаем ответ и проверяем на наличие всего одного поля в ответе, возможно этого будет достаточно.
Нужно читать документацию и тестировать что я там понаписал, никакой уверенности нет.