2015-07-07 4 views
0

У меня есть представление с gridview с checkboxcolumn и google-map (2amigos). Пользователь выбирает машины для отображения на карте, выбирая соответствующие элементы в gridview. Кнопка html передает выбранные ключи контроллеру. После кода Controler (DataProvider обновляется пост-запроса):yii2 render after post-request

//some code before render 
$dataProvider = new ActiveDataProvider(['query'=>$query, 'pagination'=>false]); 
return $this->render('locating', [ 
    'model' => $model, 
    'searchModel' => $searchModel, 
    'dataProvider1' => $dataProvider1, 
    'dataProvider' => $dataProvider, 
    ]); 
} 

И это JS-скрипт для кнопки HTML:

$('#showButton').click(function(){ 
    var keys = $('#w0').yiiGridView('getSelectedRows'); 
    $.post("http://localhost:8080/eddb1/frontend/web/index.php?r=tracking/locating", 
    {'keylist': keys}, 
    function(data){ 
     console.log(data); 
    }); 
}); 

Проблема заключается в том, что с запросом на пост результат команды php-render получает запись в виде html-строки в post-response, но представление не получает повторной визуализации. Если я делаю то же самое с activeForm вместо gridview (для выбора машин) и кнопки отправки, страница будет повторно отображаться так, как должна (но этот способ не работает для меня, потому что мне нужен gridview с фильтром и сортировка). Что я могу сделать, чтобы карта (или представление) была повторно отображена с последующим запросом?

+0

Пожалуйста, покажите код контроллера ... – scaisEdge

+0

Не понимаю, почему ... но я буду размещать в целом контроллера код –

+0

Любые идеи для этой проблемы? –

ответ

0
public function actionLocating() 
{ 
    $searchModel = new ViewMachinesSearch(); 
    $dataProvider1 = $searchModel->search(Yii::$app->request->queryParams); 
    $dataProvider1->pagination = false; 
    $model = new TrackingForm(); 

    if (Yii::$app->request->post()){ 
     $model->machine_select = Yii::$app->request->post('keylist'); 
     $machines = $model->machine_select; 
    }else{ 
     $machines = $model->getMachines(); 
    } 

    if(!in_array(Yii::$app->user->identity->company_id, Yii::$app->CompaniesByUser->getCompaniesByUser(21))){ 
     $query = New Query; 
     $query ->select(['licenceplate', 'identifier', 'timestamp', 'lat', 'lng']) 
       ->from('gps_live') 
       ->where(['machine_id' => $machines]) 
       ->orderBy(['timestamp' => SORT_DESC]); 
    }else{ 
     $subquery = New Query; 
     $subquery ->select(['licenceplate', 'identifier', 'timestamp', 'lat', 'lng']) 
        ->from('btc_m1_v1_1') 
        ->join('INNER JOIN', 'machine', 'machine.id_machine = machine_id') 
        ->where(['machine_id' => $machines]) 
        ->andWhere('lat <> 0') 
        ->andWhere('lng <> 0') 
        ->orderBy(['timestamp' => SORT_DESC]); 
     $query = New Query; 
     $query ->from(['sub' => $subquery]) 
       ->groupBy(['sub.licenceplate']) 
       ->all(); 
    } 

    $dataProvider = new ActiveDataProvider(['query'=>$query, 'pagination'=>false]); 
    return $this->render('locating', [ 
     'model' => $model, 
     'searchModel' => $searchModel, 
     'dataProvider1' => $dataProvider1, 
     'dataProvider' => $dataProvider, 
     ]); 
} 
1

Попробуйте использовать renderAjax метод, чтобы сделать ваше мнение, когда оно запрашивается с помощью AJAX. Я предполагаю, что вы используете actionLocating, чтобы отобразить ваше мнение для запроса страницы и для ajax. Поэтому, прежде чем позвонить оказать в контроллере, проверьте, если это Ajax запрос или нет:

$renderMethod = Yii::$app->request->isAjax ? 'renderAjax' : 'render'; 

return $this->$renderMethod('locating', $viewParams); 
+0

Привет, Тони, спасибо за ответ. Пожалуйста, извините мой поздний ответ ... Я путешествовал. –

+0

Я попробовал renderAjax раньше, также попробовал свой код ... тот же результат: dataProvider создается правильно, но все равно нет рендера –

+0

@ChrisvD есть ли ошибки в консоли браузера? – Tony

0

вы можете создать некоторую функцию базового контроллера, чтобы убедиться, что она была оказана как AJAX или нет, код похоже.

protected function renderIsAjax($view, $params = []) 
{ 
    if (Yii::$app->request->isAjax) { 
     return $this->renderAjax($view, $params); 
    } else { 
     return $this->render($view, $params); 
} 

затем в контроллере просто вызвать этот метод

return $this->renderIsAjax('locating', [ 
    'model' => $model, 
    'searchModel' => $searchModel, 
    'dataProvider1' => $dataProvider1, 
    'dataProvider' => $dataProvider, 
]); 
Смежные вопросы