ウェブデザイナーの日記

php :: 商品ページのpdfへリンクをサクサク挿入

2007.05.01 14:05

php :: 商品ページのpdfへリンクをサクサク挿入

いまつくってるお客様のサイトで、各商品ページにそれぞれの商品を説明するpdfへのリンクがついてます。こんなかんじで↓

pdf_gazo.jpg

こういうのがすべてのカタログページの下部に出てくる。pdfの数は不定だ。多くて3つ、たいてい1つ、たまにないページもある。カタログページは30ページ以下なのでひとつひとつリンクを張っていってもよいが、今後の更新する手間を考えるとたいへんだし、そこの会社はバリバリ新商品を開発して、ガシガシ更新していきたいというヤルキに満ちあふれているので、そのたんびにいちいち<a href=なんちゃらなんてやっていたら日が暮れちゃうだろう。てわけでphpで自動にhtmlを吐き出すシカケをつくってみた。こりゃべんり。

各商品ページのディレクトリ内に "pdf" というディレクトリをつくり、そこにpdfファイルをガシガシ放り込んでいく。そのpdfファイルに対応する名前のテキストファイルを用意し(abc.pdfならabc.txt)、そこにはそのpdfのタイトルを一行書いとく。"pdf" ディレクトリの中はこんなかんじになる↓

abc.pdf
abc.txt
hello.pdf
hello.txt
happy.pdf
happy.txt

こうしとくと勝手にこんなhtmlを吐く↓

<h4>PDF/画像データ</h4>
abcのタイトル [<span class="pdf"><a href="./pdf/abc.pdf" title="abcのタイトル">PDFファイル ○○ MB</a></span> ]<br />
てかんじで残り同様

pdfフォルダがない場合はreturn nothingでスルーされる。これで不注意なリンク切れの心配はなくなるし、だいぶかんたんになった。どうせならpdfのタイトル名も自動取得したいが、ファイル名を日本語にするのはサーバの設定とかたいへんだし(wikipediaみたいにしないといけない)、pdfの中身を読むライブラリがあったような気がするけど、私はよく知らないしなんだか重くなりそうなので今回はこれでいいや。pdfのタイトル名自動取得は今後の課題としよう。

このスクリプトを下に挙げときます。似たような状況を打開したいひとは参考にどうぞ。

これをサーバのどっかにあげといて、使いたいページからincludeし、

echo grab_pdf_tag();

と書いとくとhtmlが自動挿入される。すべてのページにincludeナントカと書くのはめんどいなと思うかもしれないが、いまつくってるやつはMovable Typeでやってるので、エントリのテンプレに書いとくだけでぜんぶに挿入されるのだ。

これと似たパターンで、ディレクトリの中に画像ファイルをドバーと放り込んでおくと勝手にアルバムページをつくるというのもよくある。アレなサイトでよくやります。今回のはかなりイージーバージョンだが、これを発展させてフォルダの中のフォルダを読むようにしていけば何百とある画像フォルダの中身をイッパツでアルバム表示させるというのもかんたんにできるようになる。

ところで余談だが、このscriptの中にある関数の中で、ディレクトリ内のファイル名を取得するのに私は旧来のreaddir関数を使っているが、php5以降はscandir関数が使えるようになったのでべんりになった。でも、未だphp4のサーバも多いので、結局いつもこのreaddirでやることが多い。

もっと余談だが、パスを取得するのにrealpath関数を使うとシンボリックリンクを展開して常に正しい絶対パスを返してくれるのでほんとはこれでやったほうがよいのだろう。よくあるハマるパターンだと、Apacheの設定で、cgi-binとか特定ディレクトリをほんとは別の場所にあるんだけど、http://yourname.com /cgi-bin/でアクセスできるようにしてたりするじゃないですか!アレだと環境変数で取得したパスと変わったりしてトホホなことになる。バタバタしてると忘れてしまう。

もっと余談だが、grab_filesize()というユーザー関数が下の中にあるでしょう?これよく使う。ファイルへのパスを与えると、ファイルサイズを取得し、その大きさに応じてB/KB/MB/GBをくっつけて小数点をまるめて返してくれるというものだ。単純だけど重宝してます。

てわけで、社長〜!がんばってますです。

, ,

ウェブデザイナーの日記 [コメント (0) :: トラックバック (0) ]

このエントリーのトラックバックURL:
http://blog.3ot.net/ping/876