質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1471閲覧

SmartyのテンプレートからPDFを作成したい

Melancholic

総合スコア3

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/08/28 08:55

編集2020/08/28 09:54

現在、Smartyを利用した発注システムを作っています。
(前回の質問では、大変お世話になりました。)

画面上で動的に発注内容を入力→発注内容をSQLへ→メールで送信!という流れです。
そこで、発注内容を記載したPDF(領収書?発注書控え?のようなもの)を作りたいのですが、
SmartyのテンプレートからPDFを生成する方法について相談したいです。

HTMLからPDFという動きはTCPDFから一通りできたのですが、
Smartyのテンプレートから、となるとtplにTCPDFの変換部分(下記)を入れても動きませんでした。
PDFにならず、TCPDFの部分が通常の文字として出力されます。

※下記のソースは/templates以下の.tplのみです。
DBからのデータ取得や変数などのassignは/templatesディレクトリと同階層の別.phpファイルで行っています。

PHP

1//ここから 2<?php 3require_once "tcpdf/tcpdf.php"; // include_path配下に設置したtcpdf.phpを読み込む 4 5$tcpdf = new TCPDF(); 6$tcpdf->AddPage(); // 新しいpdfページを追加 7 8$tcpdf->SetFont("kozgopromedium", "", 10); // デフォルトで用意されている日本語フォント 9//この辺りまで文字に 10 11$html = <<< EOF 12<head> 13<meta charset="UTF-8"> 14</head> 15<body> 16 <div> 17 <table class ="center-position" border="1"> 18 <!-- 見出し項目表示箇所 Start --> 19 <tr style=color:"#ffffff" bgcolor="#000000" height=30px> 20 <th class ="menu" width=100>メーカー</th> 21 <th class ="menu" width=220>商品名</th> 22 <th class ="menu" width=100>単価(円)</th> 23 <th class ="menu" width=50>数量</th> 24 </tr> 25 <!-- 見出し項目表示箇所 End --> 26 27 <!-- 検索データ表示箇所 Start --> 28 {section name=dbList loop=$result} 29 <tr height=35px> 30 <td class="display-center">{$result[dbList].MAKER}</td> 31 <td class="display-left">{$result[dbList].NAME}</td> 32 <td class="display-right">{$result[dbList].KINGAKU}</td> 33 <td width=50><input class = "number2" type="tel" name="suryo[]" autocomplete="off" maxlength="2" style="width:50px; height:4px; font-size: 17px;"></td> 34 </tr> 35 {/section} 36 <!-- 検索データ表示箇所 End --> 37 </table> 38</body> 39</html> 40EOF; 41 42//ここから 43$tcpdf->writeHTML($html); // 表示htmlを設定 44$tcpdf->Output('samurai.pdf', 'I'); // pdf表示設定 45//ここも文字に 46?>

SmartyテンプレートからのPDF作成は、TCPDFで可能なのでしょうか?
それとも、別のライブラリを使用したほうが良いのでしょうか。

Smartyを使わないPDF生成で楽なものがあるかもしれませんが、
データベースからのレコード取得ができている現状にPDF生成の機能を追加、という動きにどうしてもとどめたいです。

ご教授いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

提示のやり方ではそもそもSmartyとして実行してすらいません。変数をassignして、テンプレートを実行しなければhtml出力されません。
TCPDFが必要とするのはあくまで出力されたhtmlなので、テンプレートっぽいコードを渡してもそれは単なるそういう文字列です。
Smartyの構文はあくまでSmartyのエンジンのなかで動作するからです。

どうしてもSmarty絡めたいのでしたら、PDF化したいhtmlを出力するリクエストを1つ作り、file_get_contentsなどでそのリクエストを読み込み(つまりURLを指定する)、htmlを得てTCPDFに渡す感じですかね。
画像など持っていきたい場合はできないかもしれませんが…。
ただやはり、コード管理が煩雑になるので、生のPHPで出力用htmlを組んだ方がよさそうに思います。

投稿2020/08/28 09:23

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Melancholic

2020/08/28 09:50

すみません、提示しているソースに関しては.tplファイルのみなのです。 Smartyエンジンに沿ったディレクトリ構成を作り、別.php内で、DBからのデータ取得などを行い、 必要な変数や配列を$smarty->assign、最後に$Smarty->displayでテンプレ―トを呼び出しています。 file_get_contentsの部分に関しては、DBからデータ取得し&Smartyのテンプレート表示するというphpプログラムを作成し、そのURLを指定する、という形でしょうか? また、File_get_contentsでのプログラム呼び出しは、headerと同じように変数をGETで渡すことができるのでしょうか? 質問が多くすみません、よろしくお願いします。
m.ts10806

2020/08/28 21:03

>file_get_contentsの部分に関しては、DBからデータ取得し&Smartyのテンプレート表示するというphpプログラムを作成し、そのURLを指定する、という形でしょうか? はい。 >また、File_get_contentsでのプログラム呼び出しは、headerと同じように変数をGETで渡すことができるのでしょうか? PHPマニュアルの例1のとおりです。 https://www.php.net/manual/ja/function.file-get-contents.php 何も指定しなければ単にURL叩いたときと同じくGETです。 例4のようにヘッダ指定すればPOSTも可能です。 まずはやってみてください。
Melancholic

2020/08/30 00:45

file_get_contentsの説明まで丁寧にいただきありがとうございます。 教えていただいた方法で、Smartyの実行URLを指定したところ、PDFが出力されました。 レイアウトの微調整などは必要そうですが、おおむね狙い通りの動きをさせることができました。 大変助かりました、ありがとうございます!
m.ts10806

2020/08/30 00:54

ヒントになったようで何よりです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問