Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Проблема экспорта в CSV

#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).")";

Комментариев нет:

Отправить комментарий