wsdl2php を使ってSOAPクライアント用PHPスケルトンコードを生成してみる。

「SOAP?WSDL?なんのことかさっぱりわからんちん( -ω-)」状態から半日過ぎ、WSDLと言われる呪文を唱えてWebサーバーとやり取りするんだな、というところまでようやくたどり着きました。

そこで、サーバーに司令を送るためのクライアントを、SOAPサーバーが参照しているWSDL文書をもとにシコシコ書いてたんですが、数行書いたところで早くも折れましたorz

そういえば、風のうわさによれば、Java界隈には「wsdl2java」という、手書きでいちいち書くのを数秒かからずに終わらせてくれる魔法のようなツールがあるというではないですか!
こ、これはもしや「wsdl2xxx」のノリでPHPでも出ているのでは!?とグーグル先生に聞いてみたら、ほんとにそのままのネーミングでありましたwww

wsdl2php – http://www.urdalen.no/wsdl2php/

いかにもパパっと手早くやってくれそうな感じがしますね!!ちょーわくわくしますね!!でも日本語の記事が無いんですね!(´;ω;`)

仕方ないので、俺の雰囲気英語力でそれっぽい記事を読んで見ることにしました。以下に続く使い方はこの記事に書いてある内容と同じなので、読める人はそっちを読んだほうがいいですよ!

IT Workarounds: Simple SOAP client with wsdl2php using WSDL – http://itworkarounds.blogspot.jp/2011/10/simple-soap-client-with-wsdl2php-using.html

ちなみにうちの鯖の環境はこちら↓。

  • CentOS 5.7
  • apache 2.2.3
  • PHP 5.3.3
  • php-pear 1.4.9

※すべてLinuxのコマンドライン上での操作です。
はじめに、公式サイトのsourceforgeから最新のpear.tgzファイルをDLしてきます。

pear install コマンドでインストール。

インストールに成功したら、「wsdl2php」コマンドが有効になっているはずなので、wsdlファイルのパスを投げてPHPコードを生成します。

こうすると、カレントのディレクトリに生成されたPHPコードが置かれているはずです。

 

ここまで特につっかえることなく進んじゃいましたので、「できないよ~(´;ω;`)」って言われてもわかりません!ごめんなさい><

ではでは~(´・ω・)ノシ

ECCUBE 商品カテゴリをDBから手動で登録するときの注意点メモ

ECCUBEのカテゴリ管理でのお話です。

カテゴリのCSV一括登録機能では、category_id, category_name, parent_category_id フィールドが入ったCSVをアップロードして一気に登録します。新規登録ならば、色々と自動的に割り振っていい感じにしてくれるかと思いますが、更新目的で一括登録機能を使用すると、カテゴリの構成を大幅に変更したとき、いろいろと不都合が生じます。(その前にそんな大幅な変更が入らないようにしっかり構成にしろって話ですが……)

その時は仕方ないのでDBを直接操作することになると思いますが、そこでの注意点をいくつかメモっておきたいと思います。

ますは、dtb_categoryテーブルの構造です。

  • category_id
    カテゴリID
  • category_name
    カテゴリ名
  • parent_category_id
    親カテゴリID
  • level
    階層
  • rank
    ランク
  • creator_id
    作成者ID
  • create_date
    作成日時
  • update_date
    更新日時
  • del_flg
    削除フラグ

ECCUBEのカテゴリは、階層上に構成することができます。その際の階層レベルはlevelフィールドで設定します。一番上が1で、あとは2,3……と設定していきます。あるカテゴリの子供としてカテゴリを設定変更した際は、この辺の変更をしないとおかしくなります;;

そして、おそらく一番面倒なのが順番の設定だと思います。rankフィールドの変更です。 ほかのECCUBEのテーブルと同様、降順で番号を割り振ります。つまり、番号の大きい順から並んで「1」がリストの一番下に配置されます。

……なんだかいちいち説明するのがめんどくさいので結論から言いますと、親カテゴリ「お菓子」のrankが10だとしたら、その子供になるカテゴリは 9,8,7 という具合に、親の連番としてrankを割り振った方が変な表示になりにくいです。どうしても連番にならなければ、親カテゴリと子供カテゴリの間には、別のカテゴリは入り込まないように注意するべきです。 処理上は問題ないみたいですが、表示上では別のカテゴリが紛れ込んでいるかのような見え方になってしまいます。

自分が実際に行ったやり方は、level1の親カテゴリには、あらかじめrank200個分ぐらいの間隔を取って番号を割り振り、その範囲の中で子カテゴリに番号を割り振っていきました。 こうすれば別のカテゴリ同士が混じることはないと思います。

なんだかごちゃごちゃな説明ですが、とりあえずこの辺で……

[PHP]大量の配列をPOST/GETで渡す時に、要素が途中で切れて、すべて渡せない件。

分かった今はなんてことないのですが……(・ω・`)

PHPで大量のパラメータをPOSTで送ろうとする(自分の場合は1160個程度)と、こんなエラーが出てきました。

Warning: Maximum number of allowable file uploads has been exceeded in Unknown on line 0

とりあえず調べると、php.ini内にある「max_input_vars」プロパティをいじくれよ!と公式ドキュメントに書いてありました。
http://php.net/manual/ja/info.configuration.php

自分のphp.iniを見てみると、どこにも書いていないのでとりあえず追加。

max_input_vars = 2000

ちなみにデフォルトの値は1000みたいです。普通ならこの数で十分足りるはずなんですけどね……。

ほんと、なんてことない話なんですけど、俺がこの問題にぶつかったときにいじくっていたのがECCUBEで、こいつは画面上にPHPのエラーをそのまま吐き出してくれないんですよね。
仕方ないのでapacheのエラーログを見てみると、明らかに怪しいエラーがわんさかあったので、それを手掛かりに解決できました。

……あれ、この記事を書いていて思ったんだけど、よく考えたら、ECCUBEほどのものなら、デバッグモードぐらい用意されてるんじゃないだろうか?

探してみたらありました。これで出てくるんじゃないかしらorz
http://web-karakuri.com/archives/2510

複数行にまたがってパターン検索したい時は、「マルチラインモード」じゃなくて「シングルラインモード」で検索するもんだと今頃気がついた水曜日の夜。

どうもご無沙汰してます。にしふなです。

正規表現で、デリミタ(/)の後にiだかgだとか入れて、いろんなことができて幸せになれる機能があるじゃないですか。
その機能の中に、複数行にまたがってパターンをマッチさせるか否か、と言う機能があるじゃないですか。ありますよね。
俺はそれを、単一行マッチを「シングルラインモード」、複数行マッチを「マルチラインモード」だと思ってたんですね。
でも実際は、複数行マッチさせたい場合はシングルラインモードを使うみたいなんですね。

なぜなら、「マルチ」、「シングル」は、「検索される側の文字列」(php風にいえば$subject)を、一行として扱うか、それとも複数行として扱うか、と言う違いを切り替える言葉なんですね。

例えば、下記のように人が見やすいように改行・インデントが加えられたソースコードがあったとします。

このようなソースコードに「シングルラインモード」を適用すると、以下のように扱われるみたいです。

つまり、改行・インデントといった、整形に関わる記号をすべて「通常の文字」として扱い、「検索される側の文字列」を1行としてみなすモードが「シングルラインモード」と言うことみたいなんですね。
と言うことは、正規表現の挙動はどちらのモードでも変わってないということになりますね。シングルでもマルチでも、1行分しかパターンを適用していないです。

とりあえず結論は、複数行にまたがって検索したい時は「シングルラインモード」で検索しろ!ってことですね。
ちなみに俺は、このことに気づくまで1時間ぐらいウンウン唸ってました。なんというかお恥ずかしい……(;ω;`)

でもですね、言い訳じみた感じになってしまって恐縮ですが、Web上で正規表現のチェックが出来る「PHP正規表現チェッカー」さんでは、複数行にまたがってパターン検索するときには「マルチラインモード(m)」にチェックを入れるんですよ!! これはかなり混乱してしまいました……まじどっちなんだよとorz
でも、このツール自体はかなり便利なので、気にせず使っていくと思いますけどね。
http://www.rider-n.sakura.ne.jp/regexp/regexp.php

Zend FrameworkからGoogle CalendarのAPIを利用してイベントの追加をするとき、Author属性は書き込める?

タイトルの通り、Google Calendar にAPI経由でイベントの追加をする際に、Author属性(カレンダーのイベントの作成者)をどうやって書きこんだらいいか?という件です。

自分が使っているZend Frameworkのバージョンは1.9.6です。最新バージョン(1.11.11)でも変わらないと思います。

結論から言うと、書き込めないみたいですね(´;ω;)

まず自分が参照したZendFrameworkのマニュアルの中の1ページ「Google Calendarの使用法」(http://framework.zend.com/manual/1.9/ja/zend.gdata.calendar.html)には、Author属性についてはこう書いてあります。

その他、オプションで設定できる属性は次のようになります。

  • Author は、そのイベントを作成したユーザについての情報です。

この文面を読む限り、Authorは設定できるものだと思いますよね??でもサンプルコードにはAuthorの書き方は書いてないし、マニュアル以外の記事にもそれらしいものは載ってませんでした。

仕方ないので、Google本家の「Data API Developer’s Guide: PHP」(http://code.google.com/intl/ja/apis/calendar/data/1.0/developers_guide_php.html#CreatingEvents )をのぞいてみたら、こんなことが書いてありました。

Other useful functions include but are not limited to:

  • author, retrieved using getAuthor, can be used to access the user who created the event. Note that the calendar API will not accept user-submitted updates to this attribute.

多分、「APIじゃこの属性はいじれないよ!」みたいなことでも書いてあるんですかね?英語よくわかんない(つД`)

とりあえず、この文面を見る限りはAuthor属性は変更できないみたいです。この問題でかなりの時間ハマってしまいました。トホホorz