Выгрузка отмеченных полей GridView в Xml-файл

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
dymsonn
Сообщения: 60
Зарегистрирован: 2018.06.13, 15:37

Выгрузка отмеченных полей GridView в Xml-файл

Сообщение dymsonn » 2019.02.26, 12:15

Здравствуйте! В моем коде не хватает какой то мелочи. Как всё устроено:
Отмечаю галочками поля. по нажатию на кнопку,которая во Вью выгляди так:

Код: Выделить всё

<?= Html::a('<span class="glyphicon glyphicon-export"></span> Экспорт в XML',
        array_merge(['exportxml'], Yii::$app->request->queryParams),
        ['class' => 'btn btn-default', 'id' => 'export']) ?>
срабатывает этот JS:

Код: Выделить всё

$script = <<< JS
    $("#export").on("click",  function(e){
       e.preventDefault();
        var keys = $(".grid-view").yiiGridView("getSelectedRows");
        $.ajax({
         url: "exportxml",
         type: "POST",
         data: {id: keys},
         success: function(data){            
         }
       })
   });
JS;
$this->registerJs($script/*, yii\web\View::POS_END*/);
И он нас отправляет в соответствующий контроллер с не менее соответствующим экшеном:

Код: Выделить всё

public function actionExportxml()
    {
        //-- выбираем нужные данные 
        foreach (Yii::$app->request->post('id') as $obj) {
            $data[] = $obj;           
        }
        $model = Object::findAll($data);
        //-- создаём XML-документ нужной версии и кодировки
        $xml = new \DOMDocument('1.0', 'UTF-8');
        // Создаём корневой элемент
        $root = $xml->createElement('Obj');
        $xml->appendChild($root);
        foreach ($model as $record) {
            $rec = $xml->createElement('rec');

            $element = $xml->createElement('String1', htmlspecialchars($record['string1']));
            $rec->appendChild($element);
            $root->appendChild($rec);
//и тут много подобных строк xml-документа
        }

        $file_name = $data[0];
        if (count($data) > 1) {
            $file_name = $file_name . '-' . $data[count($data) - 1];
        }
        $file_name = $file_name . '.xml';
        $file = $xml->saveXML();
        if ($file == FALSE) {
            exit();
        }

        return Yii::$app->response->sendContentAsFile($file, $file_name);
    }

Вдальнейшем это переедет в модель, за это не пинайте.
Так вот id выбираются правильно и они попадают в контроллер, и создается неоходимый массив. Но файл на сохранение не открывается. Т.е. в дебаге я вижу правильно сформированную структуру xml-документа, а в файл на сохранение это дело не выводится. Методом GET так же не получается.
Изначально было без JS. Там все работало и сохранялось, но там грузились все id отображенные на странице, а мне нужны только отмеченные.

someweb
Сообщения: 544
Зарегистрирован: 2017.03.09, 10:12

Re: Выгрузка отмеченных полей GridView в Xml-файл

Сообщение someweb » 2019.02.26, 12:36

Не отправляйте ajax ом, а формируйте через JS ссылку, по которой кликнет пользователь.
Еще можно как то так
https://developer.mozilla.org/en-US/doc ... inary_Data
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

dymsonn
Сообщения: 60
Зарегистрирован: 2018.06.13, 15:37

Re: Выгрузка отмеченных полей GridView в Xml-файл

Сообщение dymsonn » 2019.02.26, 15:50

А есть пример? Или почитать где?

frid-karatel
Сообщения: 50
Зарегистрирован: 2017.03.06, 15:37
Откуда: Владивосток

Re: Выгрузка отмеченных полей GridView в Xml-файл

Сообщение frid-karatel » 2019.02.26, 15:59

Альтернативный вариант - сгенерировать файл, а через AJAX передать redirect на этот файл.

dymsonn
Сообщения: 60
Зарегистрирован: 2018.06.13, 15:37

Re: Выгрузка отмеченных полей GridView в Xml-файл

Сообщение dymsonn » 2019.02.28, 11:37

someweb писал(а):
2019.02.26, 12:36
Не отправляйте ajax ом, а формируйте через JS ссылку, по которой кликнет пользователь.
А если попробовать докопаться до сути? Чем плохо отправлять аджаксом? Я как бы вижу что не получается)))но все таки, природа отрицательного результата какова, интерсно?
А JS ссылку так и не понял как примостырить :oops:

Ответить