#php #yii
Пытаюсь сделать экспорт отмеченных позиций CGridView в CSV. Когда я передаю id отмеченных записей CGridView контроллеру методом $_POST, браузер, вместо того чтобы показать запрос на открытие либо сохранение файла, возвращает ошибку 500 (причем FireBug показывает необходимые данные). Если же в запросе контроллера я вместо массива, передаваемого из представления пишу обычный статичный массив - все прекрасно работает. Подскажите пожалуйста, где я допустил ошибку? Кнопка, отсылающая id записей контроллеру: widget('bootstrap.widgets.TbButtonGroup', array( 'type' => 'primary', 'size'=>'mini', 'buttons' => array( array( 'label' => 'Export', 'type' => 'success', 'buttonType'=>'ajaxLink', 'encodeLabel'=>true, 'icon'=> 'th white', 'url'=>Yii::app()->createUrl('/propertyPurchaseSale/ExportChecked'), 'ajaxOptions'=>array( "type" => "post", "data" => "js:{ids:$.fn.yiiGridView.getSelection('property-purchase-sale-grid')}", "update" => '#', 'success'=>"js:function(data) {window.location.assign('/propertyPurchaseSale/ExportChecked');}"), array( //htmlOptions ) ), array( ... ), ), )); ?> Действие контроллера: request->isAjaxRequest) { if(isset($_POST['ids'])) { $idx = $_POST['ids']; $count=Yii::app()->db->createCommand('SELECT COUNT(*) FROM property')->queryScalar(); // $sql='SELECT * FROM property WHERE id IN (981, 982, 985)'; --> when I use static values - all work $sql="SELECT * FROM property WHERE id IN('".implode("', '",$idx)."')"; // --> when I use join or implode function - data exist in firebug, but page return error 500 $dataProvider=new CSqlDataProvider($sql, array( 'totalItemCount'=>$count, 'sort'=>array( 'attributes'=>array( 'fullname', 'address', 'phone', 'db_number', 'created_date' ), ), 'pagination'=>false, )); fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) )); if ($fp) { echo PropertyPurchaseSale::model()->getAttributeLabel("id").";". PropertyPurchaseSale::model()->getAttributeLabel("fullname").";". PropertyPurchaseSale::model()->getAttributeLabel("address").";". PropertyPurchaseSale::model()->getAttributeLabel("phone").";". PropertyPurchaseSale::model()->getAttributeLabel("db_number").";". PropertyPurchaseSale::model()->getAttributeLabel("created_date"). " \r\n"; foreach ($dataProvider->getData() as $data) { echo $data['id'] . '; ' . $data['fullname'] . '; ' . $data['address'] . '; ' . $data['phone'] . '; ' . $data['db_number'] . '; ' . $data['created_date'] . '; ' . "\r\n"; } } exit; } } } ?>
Ответы
Ответ 1
А что пишет в /runtime/application.log ? В Yii есть ActiveRecord, зачем SQL-запросами это всё делать? count(); ... $criteria = new CDbCriteria(); $criteria->addInCondition('id', $_POST['ids']); ... $dataProvider=new CActiveDataProvider('Properties', array( 'criteria' => $criteria, ... )); P.S. Класс Properties уже должен быть, если нет - сгенерируйте с помощью giiОтвет 2
Сделайте то что вы уже сказали - конвертируйте $idx в массив, аналогично работающему статичному через $idx = array_map("intval", $_POST['ids']); И в implode можно сделать как implode(',', $idx); без пробелов и др. - там всё сделается автоматически; ну и поменять $sql="SELECT * FROM property WHERE id IN (".implode(',', $idx).")";
Комментариев нет:
Отправить комментарий