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

2021年2月1日 at 17:33

aniyaさま

いつもお世話になっております。
先日の週間concrete5 配信内容を参考に、取り急ぎ、Expressエンティティ
の属性名を取得して、リストからそれぞれの入力データをgetUserid();などの
メソッドで取得し、エントリーデータをループすることでcsvファイルとして
出力することはできました。
logs.php での csvファイル作成方法が大変役立ちました。
ありがとうございました。

引き続き、エンティティ名別にエントリーデータを動的に取得する方法
を試行中でございます。
完成いたしましたら、ご報告させていただきます

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

2021年2月2日 at 12:41
取り急ぎ・・・
ざっくりアドバイスですいませんが、

> 引き続き、エンティティ名別にエントリーデータを動的に取得する方法
を試行中でございます。

コードを奥深くまで読み解く必要があるのですが、
Express の管理画面の方のコードを参考にされると良いと思います。

詳しくは金曜日に・・・
 

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

2021年2月2日 at 14:13
katzさま

 いつもご支援ありがとうございます。
どうぞよろしくお願いいたします。
次回の週刊concrete5を楽しみにお待ち
しております。
 

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

2021年2月9日 at 17:35
katzさん
 いつも大変お世話になっております。
先週の週刊concrete5を拝聴させていただき、大変勉強になりました。
ありがとうございます。

番組内でご説明いただいた、エンティティのIDを取得しようと試みて
おります。

hissyさんよりご説明いただいた、
public function csv_export($treeNodeParentID = null){
$me = $this;
$parent = $me->getParentNode($treeNodeParentID);
$entity = $me->getEntity($parent);
...
}

において、$treeNodeParentID が、MYSQLの「ExpressEntities」テーブル
における "id" に該当すると思うのですが、違いますでしょうか?

hissyさんがご説明下さっているのは、ダッシュボードのExpressエンティティ
詳細画面でエントリーデータ一覧を表示させているため、
$me->getParentNodeID() で表示しているExpressエンティティのエントリー
データの親ID(エンティティID)を取得していると思うのですが、これを
エントリーリストから取得するとしますと、
まず、$entity = Express::getObjectByHandle('●●●●');
●●●●はエンティティのハンドル名
でエンティティ情報を取得してきて、そのデータのIDを
$id = $entity->getID();
で取得すればよいように考えたのですが、この考えは間違っておりますで
しょうか?

ExpressEntitiesテーブルの「id」が取得できれば、あとは、
public function csv_export と同じ方法でcsvファイルの作成ができると
考えております。
どうぞよろしくお願い申し上げます。
 

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

2021年2月9日 at 17:51
その辺は不要です。お送りしたコードのハイライト部分にもあえて含めてません。
$entity までは取れているようでしたので、そのあと必要な部分だけをハイライトでお送りしました。
 

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

2021年2月9日 at 18:02
hissyさん

ありがとうございます。
そこまでご配慮いただき、感謝申し上げます。
はい、上のようにして$entityを取得しておりますので、
これを public function csv_export に引き継いで、
一度試させていただきます。

ありがとうございます。
 

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

2021年2月12日 at 16:14
いつもお世話になっております。
viewのリストボックスで取得したエンティティ名(ハンドル名)を
controller側へ渡して$entname に代入し、エントリーデータを取得しようと
いたしました。
ところが、下記コードを実行しましても、CSVダウンロードのための
ダイアログボックス自体も表示されません。
なんの反応もない状態でございます。
コードの解釈が間違えていると思います。
$input['csvent'] に、viewで選択したエンティティ名'enqa'を渡しているのですが、
これが原因でしょうか?
ご教示いただければ幸いです。


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

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


$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');

return 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);
}
 

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ファイルが無事
ダウンロードできました。