another_dream
@another_dream
Backend-разработчик, Laravel/ZF2/Yii2

Как корректно реализовать совмещение параметров TDS?

Имеется простая реализация TDS-трекера, где можно настраивать редиректы для определённых правил:
- Страна посетителя
- Веб-браузер
- Девайс
- Мобильный трафик / десктопный
- ОС
То есть на каждый параметр есть поле, в которое заносится URL, куда посетитель будет перенаправлен при соответствии условия.
Теперь же необходимо каким-то образом реализовать возможность совмещения некоторых параметров, например:
- Беларусь, мобильный, iPad;
- Россия, десктопный, Chrome;

Пример текущей реализации без совмещения параметров:
<?php
# $alt_url - массив альтернативных URL для редиректов,
# например, $alt_url['os']['android'] или $alt_url['browser']['chrome']

// OS
if (!empty($alt_url['os'][$os])) {
    return $alt_url['os'][$os];
}
// Device
if (!empty($alt_url['device'][$device])) {
    return $alt_url['device'][$device];
}
// Type
if ($is_mobile && !empty($alt_url['type']['mobile'])) {
    return $alt_url['type']['mobile'];
}
// Browser
if (!empty($alt_url['browser'][$browser])) {
    return $alt_url['browser'][$browser];
}
// Country
if (!empty($alt_url['country'][$country])) {
    return $alt_url['country'][$country];
}


Если те, кто сталкивался с подобными задачами? Буду благодарен хоть за какие-нибудь идеи, сам уже несколько часов голову ломаю, ничего дельного не приходит.

Спасибо.
  • Вопрос задан
  • 153 просмотра
Решения вопроса 2
alsopub
@alsopub
Самое простое на мой взгляд это добавить в массив следующие url:
$alt_url['country:type:device']["Беларусь:desktop:ios"] = "http://...";


И перед вашими условиями добавить:
if (!empty($alt_url['country:type:device']["$country:$type:$os"])) {
  return $alt_url['country:type:device']["$country:$type:$os"];
}
Ответ написан
Комментировать
wielski
@wielski
✔ Совет: Вам помогли? Отметьте ответы решением.
Минимальная реализация того, что вы описали

<?php
Class TDSRouting {
  public $routing = [
    [
      'os' => 'android',
      'url' => '/url/to/redirect'
    ],
    [
      'os' => 'android',
      'browser' => 'chrome',
      'country' => 'ru',
      'type' => 'mobile',
      'url' => '/url/to/redirect2'
    ]
  ];
  public $default = '/url/default';

  public function redirect($options = []){
    $keys = array_keys($options);

    foreach($this->routing as $route){
      $diff = array_diff_assoc($options, $route);

      if(count(array_intersect_key(array_flip($keys), $route)) === count($keys) && empty($diff)){
        return $route['url'];
      }
    }
    return $this->default;

  }
}

$routing = new TDSRouting;
print_r($routing->redirect([
  'os' => 'android',
  'browser' => 'chrome',
  'country' => 'ru',
  'type' => 'mobile'
  ]));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы