#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).")";
Комментариев нет:
Отправить комментарий