PhpWordでborderInsideVSizeが効かない不具合の修正

phpでワードファイルを出力する「PhpWord」ですが、開発が止まっていると思っていたらGitHubのほうで開発が進んでいるようです。

セクション要素を追加しても改ページしないでテーブルの外枠余白を設定できたり、テーブルの縦横結合に対応していたりと便利になっていますが、TableStyleに設定したborderInsideVSizeが効かないというバグがありました。
下記で修正されます。
(こんな普通のバグがあるんですね。。。 )MarginBorder.php

(参考)https://github.com/PHPOffice/PHPWord/commit/5c8e100d4113641e93e1f150c0c84c2e15aeb3c6

日本語の情報が少ないので英語サイトメインで見ないといけません。。。

 

カテゴリー: php

ログでデバッグ

php で、簡単にログを出力する関数があったのでメモ。

error_log()

という関数です。

第1引数はmessageで、ログに出力する内容。
自動で改行はされませんので、必要に応じてここに含めます。

第2引数はmessage_typeで、0~4の整数。

この内、よく使うと思われるのは1と3でしょう。

第3引数はdestinationで、第2引数に関連します。

第2引数で1を指定した場合、destinationにはメールアドレスを指定します。

ここで指定したアドレスにメールを送信してくれるわけですが、
phpが動いているサーバーにsmtpなどのメールに必要な設定がされている必要があります。

第2引数で3を指定した場合、destinationにはファイル名を指定します。

ここで指定したファイルにログを出力してくれます。

ログファイルでデバッグ、これは今後使うかもしれないです。

カテゴリー: php

foreach で値を参照で受け取った場合は、配列を壊さないようにunset()するべき。

下記のように、foreach で参照で値を受け取って配列の値を加工する場合に、最後にunset()しないと、配列を破壊する場合があります。

//下記のunset($val)をしないと、$list[2] への参照が $val に残っていて$valに値を入れると、$list[2]の値が下記かわってしまう
unset($val);  

要注意ですね。
(変数の持ち回しがよくないとか、参照で処理するのはコストがかかるのでしないほうがいい、とかいう意見もありそうですが、もしやるならunset()も必須でという感じです。)

最初に現象が出た時には、なんなんだこの動きは?って思いましたが納得です。

カテゴリー: php

js エラー 「識別子、文字列または数がありません」

ボタンをクリックされたら ajax を使用してデータを取得し、

php 側でテーブル等のタグを全部生成して返し

javascript では返ってきたデータを jquery の html メソッドで

表示する、というプログラムを作っていた。

 

掲題のエラーは jquery.js 内の

elem.innerHTML = value;

の箇所で発生していた。

 

調べた所、掲題のエラーは IE6 や IE7 で

var hoge = { arg1, arg2, };

のようにarg2 の後ろに余分なカンマが

ある場合に起きるエラー、とのことだった。

 

今回のエラーとの関連は余りなさそうだ。

 

PG を調べた所、php でテーブルタグを生成するのに

ヒアドキュメントを使用していた。

$data = <<<DATA

<table>

<tr><td></td></tr>

</table>

DATA;

のような感じ。

ループの中でタグにid を振るときに

ヒアドキュメントの中で

for($i = 0; $i < count($data); $i++){

$ret_data = <<<DATA

~~ 中略 ~~

<input type=”text” id=”hoge_{($i + 1)}”>

のように括弧を駆使していたが、

どうやらこれがエラーの素だったようだ。

ここの所を

<input type=”text” id=”hoge_%u”>

として

$data = sprintf($data, ($i + 1));

のようにsprintf() で置換するように修正することでエラーが発生しなくなった。

へぇ~。

 

mb_convert_encodingで外字はエンコーディング変換される?

ちょっと気になったので、mb_convert_encoding で外字がきちんとコード変換されるか確認してみました。

Windowsの外字エディタで外字を登録して、mb_convert_encoding()を使って sjis-win、utf8、utf16 それぞれに変換後、文字コードを出力してみました。

SJIS:F040(unicode:E0000)

■SJISから変換

sjis-win: f040

utf8: ee8080

utf16: e000

■UTF-8から変換

sjis-win: f040

utf8: ee8080

utf16: e000

SJIS:F9FC(unicode:E757)

■SJISから変換

sjis-win: f9fc

utf8: ee9d97

utf16: e757

■UTF-8から変換

sjis-win: f9fc

utf8: ee9d97

utf16: e757

きちんと変換されています。

ただ、ブラウザに表示すると IEではクライアントPCに登録されている外字がきちんと表示されますが、Chromeでは正常に表示されず□で表示されました。(HTML上かブラウザの設定で表示させる方法があるのかも。)

データとして取り扱うには問題なさそうですね。

(あれっ?システムの外字対応の為に、PHPソースやDBの文字コードは、UTF-8でも問題ない?)

ちなみに、文字コードの16進数表記は bin2hex() 関数を使用しました。(ぐるぐる回してord()関数の結果を接続する方法より簡単です。)

では。

カテゴリー: php