はもちくわ

コードについて自分なりの解釈を書いてます。

【PHP】TCPDFのMultiCellとTextの配置

自分で作っているページのシフト表ページに機能追加した話です。
時間単位を1時間から15分刻みにし、出力するPDFサイズをA4とA3対応に変更。PDF出力時にフォントの大きさ設定ができるものにしました。ブラウザ操作で下のようになります。データ入力は面倒なのでCSVファイルでアップロードも可能です。

f:id:hamochikuwa440:20210219150712p:plain

このようにシフト表がブラウザ上に表示されたあとに、下の操作をすると、

f:id:hamochikuwa440:20210219151036p:plain

と出るわけです。

 

もっと、簡単に機能追加できると思ったんですが、「15分だけのシフト」の表示にとても困ったので、ここで紹介します。

 

PHPでPDF出力する「TCPDF」というライブラリを使っています。私は座標を計算させて配置していく設計をしてますが、座標計算は思った通りの挙動をしてくれるのでとても扱いやすいイメージです。

シフト表とは別に、履歴書作成ページもつくったのですが(私のページで個人情報入力はおすすめしませんが(笑))これもちゃんと動きます。JIS規格のA3で写真もリサイズ(縦だけですが、、、)してと、、、ちょっと話がずれたので戻します。

 

さて、困ったことというのは、

 

15分シフトが小さすぎてテキストが入らないということです。実際にどうなったのかといいますと、下のようなコードを書いて作成したところ、表示されない訳です。

 

f:id:hamochikuwa440:20210219152525p:plain



Excelさんだと、セルに合わせてフォントを縮小してくれますが、そんな便利な機能はついてないので、上の絵の水曜日の「橋本」さんのように自分で設定を組み込まねばなりません。私は15分区切を1マスとしてカウントし、3マス以下もしくは4マス以下で名前が4文字のときはフォントを半分にするという設定をしてます。

当然、表示されてない火曜日もフォントを半分にしてますが、小さすぎて表示されないようです。このMultiCellは座標指定もできて、自動折返しもしてくれる便利な命令なのですが、、、はみ出しでは使えないということですね。どうにか、はみ出してもいいので表記したい。

 

では、Cellという命令に切り替えて試してみます。MultiCellとCellは姉妹品みたいなものなのですが、引数の指定場所がちょっと違うので注意が必要です。(とても丁寧に説明をまとめてくださっている方がおりますので、「TCPDF」で検索してみてください。)

 

f:id:hamochikuwa440:20210219153515p:plain

 

残念ながら時間表記のところに改行されずに上書きされたようです。では、改行してみたらいいんじゃないか?ということで、表示前に改行してみます。

 

f:id:hamochikuwa440:20210219153950p:plain

 

改行しましたが、他にも影響を与えながら改行してしまいました。シフトデータを順番にセルで配置するループ内でやってますので、他にも影響がでるものは大きくコードを変えなければいけないので避けたい。。。そこで思いついたのが、小さいセルはテキストなしで塗り潰し表記して、その上からテキストを貼り付けるように表記する方法です。

長くなるので細かいコードの説明は省略しますが、MultiCellは改行する、しないを引数で判断してますので、X軸だけ$s_cell変数で与えてます。ですが、TextさんはしっかりX軸とY軸を与えないと意図しない場所に出ます。そのため、テキストが空のセルを表示したあと、現在地をGetY,GetXで調べて与えてます。

 

f:id:hamochikuwa440:20210219154725p:plain

 

すると、こんな感じで横に表示されました!これならX軸とY軸を調整すればいいじゃないということで、私の設定している変数のセル幅が$shift_w、高さが$shift_hなので、それっぽく計算いれて、X軸とY軸を調整してみます。

 

f:id:hamochikuwa440:20210219155523p:plain

 

なにか、私の計算した「セルの高さの半分」という、改行が入ってしまったようです。

 

こういう調整を解決させるのは苦手だな。。。と思ったとき、ひらめきました(笑)このシフト表はPDFに出力させているとき、TCPDFが作った$pdfの中でカーソルの場所もグリグリ動いています。ということは、表だけ作った後に、上から載せてしまおう!ということです。解決するとなんだそんなことか、、、というものかもしれませんが、思いつかなかったです。そこで、こんな設計で動かしてみました。

 

f:id:hamochikuwa440:20210224014928p:plain

 

ループ中に枡の小さいシフトが出たら、そこで表示解決させるのではなく、配列に情報をいれてひとまず棚上げします。そして、ループを抜けたら、料理の最後にのせるパセリのごとく、メモしておいた場所に名前を置きに行くと、、、結果は、

f:id:hamochikuwa440:20210219160425p:plain

 

ちょっとずれていますが、15分シフトはイレギュラーですし、きっちり収めないのもいいかな。ということでこれにしました。ですが、作成中に分岐が面倒になり、フォントの選択分岐は半分しか設定してないので、条件分岐をもう少し入れて、大きさも細かな設定をいれれば、もっと良さそうですね!!あと、フォントの出力のズレは、フォント自体の大きさを加味すれば解決しそう。。。お金取るシフト表作成ツールならそれは当然でしょうけど、これただ私が作っているだけなので、まあこんなものでしょうね(笑)

注意:最後のコードのフォント指定にMSPゴシックの指定がありますが、初期設定では無いです!自分で追加が必要です。Macなら瞬殺で設定できるのですが、Winはちょっと工夫が必要みたいですよ。

 

実際のページはこちらです。

シフト表作成ページ

次はループの話か、$_POSTの話にしようかと思います。