У меня есть код
<?php
namespace api\modules\v1\models;
use Yii;
const KYIV = 'Kyiv';
const ODESSA = 'Odessa';
class Coordinates
{
public function checkForTheExistenceOfCoordinates($postCoordinates){
$erros = new Errors();
//массив данных которые должны быть ОБЯЗАТЕЛЬНЫЕ
$arrayCoordinates =
['startLatitude','startLongitude','endLatitude','endLongitude','city'];
$arr2 = array_flip($arrayCoordinates);
$arr3 = array_diff_key($arr2,$postCoordinates);
$result = array_diff_key($arr3,$postCoordinates);
if(!empty($result)){
$errorMessage = 'To determine the price is not enough';
foreach ($result as $key => $data){
$errorMessage .= ', '. $key;
}
return $erros->returnError('To determine the price is not enough'. $errorMessage);
}else{
return true;
}
}
}
И есть код
<?php
namespace api\modules\v1\models;
use api\modules\v1\models\Coordinates;
class Bond extends Coordinates
{
const BOND = 'bond';
public function createRequestUrl($postData){
$city = $postData['city'];
if($city == 'Kyiv'){
return "https://taxibond.kiev.ua/calcprice//coos2/?coox1={$postData['startLatitude']}&cooy1={$postData['startLongitude']}&coox2={$postData['endLatitude']}&cooy2={$postData['endLongitude']}&rule=";
}elseif($city == "Odessa"){
return "https://bond.od.ua/calcprice//coos2/?coox1={$postData['startLatitude']}&cooy1={$postData['startLongitude']}&coox2={$postData['endLatitude']}&cooy2={$postData['endLongitude']}&rule=";
}else{
return false;
}
}
public function calculatePrice($output, $city){
$price = (int)explode(" ", $output)[7];
if($price == 0){
$price = (int)explode(" ", $output)[11];
}
if($city == $this::KYIV){
$standartPrice = $price;
$businessPrice = $price * 1.3; // умножить на 1.3, такова цена бизнесс цены в Бонд Такси
}elseif($city == ::ODESSA){
}
}
}
Как я могу использовать константу KYIV
в классе Bond?
Если это не возможно или неправильно, можете ли вы подсказать, как это реализовать другим способом?
Константы, как и классы, доступны при указании полного имени \api\modules\v1\models\KYIV
, кроме того их можно импортировать use api\modules\v1\models\KYIV;
. Если нэймспйсы совпадают, то можно использовать просто имя KYIV
.
Но в вашем случае можно обойтись без констант. Напишите клёвые классы для городов:
class City {
private $id;
private $name;
private $url;
public function __construct($id, $name, $url) {
$this->id = $id;
$this->name = $name;
$this->url = $url;
}
public function getId() {
return $this->id;
}
public function getName() {
return $this->name;
}
public function getUrl() {
return $this->url;
}
}
class Cities implements \IteratorAggregate {
private $cities = [];
public static function createDefault() {
$defaultCities = [
new City('Kyiv', 'Киев', "https://taxibond.kiev.ua/calcprice//coos2/"),
new City('Odessa', 'Одесса', "https://bond.od.ua/calcprice//coos2/"),
];
$self = new self;
foreach ($defaultCities as $city) {
$self->addCity($city);
}
return $self;
}
public function addCity(City $city) {
$this->cities[$city->getId()] = $city;
}
public function getById($id) {
return $this->cities[$id]?? null;
}
public function getIterator() {
return new \ArrayIterator($this->cities);
}
}
$postData = [
'city' => 'Kyiv',
'startLatitude' => 12,
'startLongitude' => 34,
'endLatitude' => 56,
'endLongitude' => 76,
];
$query = [
'coox1' => $postData['startLatitude']?? '',
'cooy1' => $postData['startLongitude']?? '',
'coox2' => $postData['endLatitude']?? '',
'cooy2' => $postData['endLongitude']?? '',
'rule' => '',
];
$cities = Cities::createDefault();
$city = $cities->getById($postData['city']);
echo $city->getUrl() . '?' . http_build_query($query), "\n";
foreach ($cities as $city) {
echo '<option value="' . $city->getId() . '">' . $city->getName() . '</option>', "\n";
}
Теперь список ваших городов будет в одном месте, добавить город будет просто. А когда-нибудь эти данные даже смогут переехать в базу и админы будут добавлять новые города без участия программиста!
P.S. И не палите коммерческую тайну такси Бонд :-)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
У меня есть сайтИ я хочу реализовать на нём автоматическую очистку кеша
Как в данном массиве найти элемент и поменять соседнее значение? те
У меня есть форма, где надо писать счет-фактуру, мне нужно чтобы когда я писал на поле СЧ-111111/11 мне выводил этот счет из api
Что нужно поменять в данном коде, чтоб картинка 156png была слева а не внизу? Заранее благодарен