Re: エクスプレスエントリーデータダウンロードを外部フォームから実行したい

2021年2月16日 at 7:40

通常のコントローラーは、Responseオブジェクトを返すだけでいい感じに処理してくれるのですが、外部フォームはそうではないようです。

return StreamedResponse::create(function () use ($entity, $me, $bom, $datetime_format) {
...
}



$response = StreamedResponse::create(function () use ($entity, $me, $bom, $datetime_format) {
...
}
$response->send();

と変更すれば動きそうです

Re: エクスプレスエントリーデータダウンロードを外部フォームから実行したい

2021年2月16日 at 10:35
hissyさん

 おはようございます。ありがとうございます。
2/12の週刊concrete5において、katzさんより、
viewから渡したエンティティハンドル名がどのように
なっているかなど、var_dump で確認してみてくださいと
教えていただきましたので、それぞれの変数を確認して
見ました。

var_dump($entname);
exit();
としたところ、$entname は、予定通り、エンティティのハンドル
名が渡っておりました。
その後、return StreamedRespons::create~
の上の行までは、正常に値が取れておりました。
return StreamedRespons::create~で何も取得できていない状態
になっておりましたので、教えていただいた方法で検証させて
いただきます。ありがとうございます。
 

Re: エクスプレスエントリーデータダウンロードを外部フォームから実行したい

2021年2月16日 at 13:21
ご教示ありがとうございます。
参照クラスを以下のように設定し、コードを変更いたしました。
そうしますと、「このサイトにアクセスできません。
ウェブページは一時的に停止しているか、新しいウェブアドレスに移動した可能性があります。」と表示されました(添付ファイル)。
参照クラス設定か、どこかで間違えている可能性もあるかと存じます。
どこが原因か、お教えいただけますと幸いでございます。どうぞよろしくお願い
申し上げます。

参照クラス・名前空間
namespace Application\Block\ExternalForm\Form\Controller;
use Concrete\Core\Controller\AbstractController;
use Concrete\Core\Csv\WriterFactory;
use Concrete\Core\Express\Export\EntryList\CsvWriter;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Concrete\Core\Entity\Express\Entity;
use Concrete\Core\Express\EntryList;
use Core;
use UserInfo;
use User;
use Express;

public function action_submit(){
//CSV作成対象エンティティの取得
$input['csvent'] = $this->post('csvent');
$me = $this;

if (isset($input['csvent']) && $input['csvent'] != ''){
$entname = $input['csvent'];
}

//$fileName = $entname.' download file';
$entity = Express::getObjectByHandle($entname);

$headers = [
'Content-Type' => 'text/csv',
'Content-Disposition' => 'attachment; filename=' . $entity->getHandle() . '.csv',
];

$config = $this->app->make('config');
$bom = $config->get('concrete.export.csv.include_bom') ? $config->get('concrete.charset_bom') : '';
$datetime_format = $config->get('concrete.export.csv.datetime_format');
//ここまでのすべての変数は、中身が正常に取れておりました
$response = StreamedResponse::create(function () use ($entity, $me, $bom, $datetime_format) {
$entryList = new EntryList($entity);
$writer = $this->app->make(CsvWriter::class, [
$this->app->make(WriterFactory::class)->createFromPath('php://output', 'w'),
new Date()
]);
echo $bom;
$writer->insertHeaders($entity);
$writer->insertEntryList($entryList,$datetime_format);
}, 200, $headers);

$response->send();

$this->set('message', 'csvダウンロードが終了しました。');
}
 

Re: エクスプレスエントリーデータダウンロードを外部フォームから実行したい

2021年2月17日 at 10:58
hissyさん

おはようございます。ありがとうございます!!できました!!
昨日投稿した「ページが表示できません」メッセージについては、
参照するクラスが抜けていたことが原因のようでございます。
ご迷惑をおかけいたしました(;^_^A

hissyさんのお教え通りに、$response = StreamRsponse::create(function () use...)
と致しまして、
$response->send(); を実行することで、ダイアログが表示され、無事ダッシュボード
と同じ機能が実現できました。
気になったところと致しましては、この方法でダウンロードしたcsvファイルを
ExcelからUTF-8で読み込んでみますと、
HTMLタグが一緒に吐き出されておりました。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="stylesheet" type="text/css" href="/tkp_system/concrete/themes/elemental/css/bootstrap-modified.css">
<link href="/tkp_system/application/files/cache/css/elemental/main.css?ts=1599545416" rel="stylesheet" type="text/css" media="all">・・・

そこで、
$response->send();
の後にdie関数をかませることで、防止することができました。

$response->send();
die();

これで何とか解決できました。
hissyさん、katzさん、aniyaさん、フォーラムの皆さん、本当に
ありがとうございました。
 

Re: エクスプレスエントリーデータダウンロードを外部フォームから実行したい

2021年2月17日 at 11:05
die(); で強制するより \Core::shutdown(); の方が望ましいです。
適切に処理を終了してくれます。
 

Re: エクスプレスエントリーデータダウンロードを外部フォームから実行したい

2021年2月17日 at 11:10
hissyさん

 ご教示ありがとうございます。
さっそく、そのように実装させていただきます。
ありがとうございました!!
 

Re: Re: エクスプレスエントリーデータダウンロードを外部フォームから実行したい

2021年2月17日 at 11:35
hissyさん

 ありがとうございました。
無事、できました。

$response->send();
\Core::shutdown();
//die();
とすることで、HTMLタグもなく、CSVファイルが無事
ダウンロードできました。