slo_nik
@slo_nik

Вывод результатов поиска в ListView?

Добрый вечер.
Поиск билетов туда/обратно.
Требуется вывести результаты поиска через ListView.
Но нужно сгруппировать результат попарно.
То есть, на дату вылета есть три рейса, на дату возвращения два. Вывести надо так, чтобы в пару к каждому рейсу вылета подставился рейс возвращения.
Сейчас сделал через цикл foreach(), формирую два массива, по дате вылета и дате возвращения. Потом эти два массива объединяю в третий массив.
$dataOne = $dataProvider->getModels();

foreach($dataOne as $key => $value){
    if($value->date_start == strtotime($data['FlightsSearch']['date_from'] . ' 00:00')){
        $arr_from[] = $value->attributes;
    }
    if($value->date_end == strtotime($data['FlightsSearch']['date_to'] . ' 00:00')){
        $arr_to[] = $value->attributes;
    }
}

foreach($arr_from as $key_f => $from){
    foreach($arr_to as $key_t => $to){
        $arr_all[] = [$from, $to];
    }
}

Получается следующее.
Array
(
    [0] => Array
    (
        [0] => Array
            (
                [id] => 154
                [city_start_id] => 8
            )
        [1] => Array
            (
                        [id] => 98
                        [city_start_id] => 1
            )
    )
    [1] => Array
    (
        [0] => Array
            (
                [id] => 163
                [city_start_id] => 8
            )
        [1] => Array
            (
                        [id] => 98
                        [city_start_id] => 1
            )
    )
    [2] => Array
    (
        [0] => Array
            (
                [id] => 182
                [city_start_id] => 8
            )
        [1] => Array
            (
                        [id] => 98
                        [city_start_id] => 1
            )
    )
)

Массивы содержащие id 154, 163, 182 это рейсы "туда", массив с id 98 это рейс "обратно".
Но в этом варианте у меня не подтягиваются связи с другими моделями, например, мне нужно, что бы city_start_id был не id города, а название.
Можно, конечно, в том же цикле сделать подмену
foreach($dataOne as $key => $value){
   $value->city_start_id = $value->cityStart->city;
   /*****/
}

Но насколько это правильно?
Как в этом случае использовать связи?
Или я вообще не то делаю?
Как правильно сделать?
  • Вопрос задан
  • 467 просмотров
Решения вопроса 1
slo_nik
@slo_nik Автор вопроса, куратор тега Yii
Вопрос решил. Не знаю, насколько верно, но добился нужного мне результата.
Немного изменил свой цикл foreach(), теперь собираю попарно в массив не атрибуты моделей, а сами модели, при этом сохраняются все связи, которые мне нужны.
foreach($dataOne as $key => $value){
    if($value->date_start == strtotime($data['FlightsSearch']['date_from'] . ' 00:00')){
        $arr_from[] = $value;
    }
    if($value->date_end == strtotime($data['FlightsSearch']['date_to'] . ' 00:00')){
        $arr_to[] = $value;
    }
}

foreach($arr_from as $from){
    foreach($arr_to as $to){
        $arr_all[] = [$from, $to];
    }
}

Для вывода результата в ListView сделал два представления, одно для результатов поиска "туда" и "обратно" и одно для результатов поиска в одну сторону
'itemView' => function($model, $key, $index, $widget) use ($search, $data, $arr_all){
                  if($data['FlightsSearch']['direction'] == 2) {
                       return $this->render('_item', ['model' => $model, 'search' => $search]);
                   }
                   if($data['FlightsSearch']['direction'] == 1) {
                        return $this->render('_item_to', ['model' => $arr_all, 'search' => $search]);
                   }
}

Теперь, когда пользователь ищет билеты "туда" и "обратно" подключается одни вид, если только "туда" - другой вид.
В первом случае это выглядит так:
245f99f9aadb47739342f104333d1817.png

Во втором так:
f6a6776c04a840e0890f8760b93243f4.png

Может правильней было бы преопределить сам метод виджета, но...
В общем результат меня устраивает.
Благодарю все, кто пытался помочь в решении задачи.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы