refirio.org
気ままな雑記帳&実験場。好き勝手に色々やっています。
エントリー
フレームワーク
オレオレフレームワークを作る機会があったので置いておきます。
本格的なフレームワークを導入するほどの規模ではないが、それなりに多機能なのである程度の処理は任せたい。今更PHP4に対応させる必要があるが、PHP5でも動作させる必要がある。本番環境のテストが公開直前までできないので、ひととおり内部を見渡せる軽量なフレームワークが好ましい。ついでに、簡易なデータベース管理ツールも欲しい。
…という場合に役に立つかもしれません。というか、そんなことがあったために自作することにした。_(:3 」∠ )_
PHPでオブジェクトを配列に変換
ググると色々出てきたものの、「オブジェクトの中に配列があって、さらにその中にオブジェクトがあって、さらにその中に配列がある」のような場合に正しく変換できなかったり、privateな値もまとめて取得したい場合に対応できなかったり…ばかりだったので書いてみた。
privateな値に直接アクセスできるようにするのは邪道な気もするけど、どうしても必要な時があったりなかったり。
function object2array($data)
{
if (is_object($data)) {
$data = (array)$data;
}
if (is_array($data)) {
foreach ($data as $key => $value) {
$key1 = (string)$key;
$key2 = preg_replace('/\W/', ':', $key1);
if (is_object($value) or is_array($value)) {
$data[$key2] = object2array($value);
} else {
$data[$key2] = (string)$value;
}
if ($key1 != $key2) {
unset($data[$key1]);
}
}
}
return $data;
}
使う時は
$array = object2array($object);
のように呼び出します。まだまだ調整の余地がありそうですが、ひとまずこれで。
PayPal管理画面操作メモ
毎回探すのに手間取るのでメモ。「個人設定」にマウスオーバーでは一部のメニューしか表示されないので注意。
設置済みボタンの確認
「ログイン」→「マイアカウント」→「個人設定」をクリック→「販売ツール」→「オンライン販売」→「PayPalボタン」で確認できる。
支払いデータ転送(PDT)の設定
「ログイン」→「マイアカウント」→「個人設定」をクリック→「販売ツール」→「オンライン販売」→「ウェブサイトの設定」で「支払いデータ転送(オプション)」を「オン」にする。
「ウェブ ペイメントの自動復帰」を「オン」にし、「復帰 URL」にPDTを受け取るプログラムのURLを設定する。
即時支払い通知(IPN)の設定
「ログイン」→「マイアカウント」→「個人設定」をクリック→「販売ツール」→「支払いとリスク管理」→「即時支払い通知」
PHPで可逆暗号化
PHPでは mcrypt_generic()
を使えば可逆暗号化ができ、mdecrypt_generic()
で復号化できます。…が、使い方がちょっとややこしかったのでメモ。関連する関数を色々と呼び出す必要があります。
具体的には、以下のコードで暗号化ができます。
<?php
//暗号化するデータ
$plain_text = 'これは秘密のメッセージです。';
//暗号化&復号化キー
$key = md5('KQAHGOEUXD');
//暗号化モジュール使用開始
$td = mcrypt_module_open('des', '', 'ecb', '');
$key = substr($key, 0, mcrypt_enc_get_key_size($td));
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
//暗号化モジュール初期化
if (mcrypt_generic_init($td, $key, $iv) < 0) {
exit('error.');
}
//データを暗号化
$crypt_text = base64_encode(mcrypt_generic($td, trim($plain_text)));
//暗号化モジュール使用終了
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
//結果を表示
echo "<!DOCTYPE html>\n";
echo "<html lang=\"ja\">\n";
echo "<head>\n";
echo "<meta charset=\"utf-8\" />\n";
echo "<title>暗号化テスト</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "<h1>暗号化テスト</h1>\n";
echo "<dl>\n";
echo "<dt>暗号化前</dt><dd>" . $plain_text . "</dd>";
echo "<dt>暗号化後</dt><dd>" . $crypt_text . "</dd>";
echo "</dl>\n";
echo "</body>\n";
echo "</html>\n";
?>
この場合、これは秘密のメッセージです。
という文字が暗号化されます。KQAHGOEUXD
は、暗号化と復号化に使うパスワードのようなものです。この値を知っている人だけが、このデータを復号化できます。
実行すると、以下のように暗号化前の文字と暗号化後の文字が表示されます。
暗号化テスト
暗号化前
これは秘密のメッセージです。
暗号化後
eVVX5OPG0Vj4L49cuq8A3KT1R2nljAIPn74vAw0d/QbYQ1CfUApMlqSpSkyDjDvi
復号化は以下のようにします。
<?php
//復号化するデータ
$crypt_text = 'eVVX5OPG0Vj4L49cuq8A3KT1R2nljAIPn74vAw0d/QbYQ1CfUApMlqSpSkyDjDvi';
//暗号化&復号化キー
$key = md5('KQAHGOEUXD');
//暗号化モジュール使用開始
$td = mcrypt_module_open('des', '', 'ecb', '');
$key = substr($key, 0, mcrypt_enc_get_key_size($td));
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
//暗号化モジュール初期化
if (mcrypt_generic_init($td, $key, $iv) < 0) {
exit('error.');
}
//データを復号化
$plain_text = trim(mdecrypt_generic($td, base64_decode($crypt_text)));
//暗号化モジュール使用終了
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
//結果を表示
echo "<!DOCTYPE html>\n";
echo "<html lang=\"ja\">\n";
echo "<head>\n";
echo "<meta charset=\"utf-8\" />\n";
echo "<title>復号化テスト</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "<h1>復号化テスト</h1>\n";
echo "<dl>\n";
echo "<dt>復号化前</dt><dd>" . $crypt_text . "</dd>";
echo "<dt>復号化後</dt><dd>" . $plain_text . "</dd>";
echo "</dl>\n";
echo "</body>\n";
echo "</html>\n";
?>
eVVX5OPG0Vj4L49cuq8A3KT1R2nljAIPn74vAw0d/QbYQ1CfUApMlqSpSkyDjDvi
は、先のコードで暗号化した文字列です。KQAHGOEUXD
は、暗号化したときと同じ値を指定します。
実行すると、以下のように表示されます。
復号化テスト
復号化前
eVVX5OPG0Vj4L49cuq8A3KT1R2nljAIPn74vAw0d/QbYQ1CfUApMlqSpSkyDjDvi
復号化後
これは秘密のメッセージです。
Perlで特定フォルダ内の全文検索
Windows7でファイル内の文字列を検索したかったのですが、インデックスを作成してみたりフォルダオプションで「ファイル名と内容を常に検索する」に設定してみたりしても、何故か全文検索になってくれませんでした。
専用の検索ツールをインストール…とも思ったけど、後々使えるかもしれないので全文検索ツールをPerlで書いてみた。
##################################################
#ファイル内検索プログラム
##################################################
use strict;
print '検索ワード:';
my $input = <STDIN>;
chop($input);
&search('./', $input);
<STDIN>;
exit;
### 全文検索
sub search {
my($dir, $word) = @_;
opendir(DIR, $dir);
my @dir = sort { $a cmp $b } readdir(DIR);
closedir(DIR);
foreach my $file (@dir) {
if ($file eq '.' or $file eq '..') {
next;
}
my $target = "$dir$file";
if (-d $target) {
&search("$target/", $word);
} else {
my $flag = 0;
open(FH, $target);
while (my $line = <FH>) {
if (index(lc($line), lc($word)) >= 0) {
$flag = 1;
}
}
close(FH);
if ($flag) {
print $target . "\n";
}
}
}
return;
}
search.pl
とかの名前でファイルを作成して、上の内容を書いておきます。あとはダブルクリックで実行すれば、検索文字を入力できる画面になるので、文字を入力してエンターキーを押します。検索対象は、search.pl
を置いたフォルダ内全てです。(PerlがインストールされたWindowsを想定。)
エラー処理が無かったり、文字コードの異なるファイルの検索を想定していなかったり…と色々問題はありますが、ちょろっと検索するくらいなら十分でした。
ただ、EmEditorがインストールされた環境なら「フォルダを右クリック → EmEditorでファイルから検索」を実行すれば全文検索ができると教えてもらったので、実は専用ソフトをインストールする必要も検索ツールを作る必要も無かったという…。_(。゚⊿ 」∠)_
ショッピングカートプラグインと注文管理プラグイン(正式版)
ようやく正式版を公開できました。それなりに長い道のりだった…。_(:3 」∠ )_
PHPでファイルアップロードサイズの上限を変更
とっくにメモしてあると思ったらメモしていなかったので、コピペ&調整で使えるようにメモ。
PHPのデフォルト設定では2M以上のファイルはアップロードできないけど、.htaccess
ファイルを作成して以下の内容を書けば上限を変更できる。php.ini
の編集権限があれば、そちらで設定してもOK。
php_value max_execution_time 600
php_value memory_limit 512M
php_value post_max_size 288M
php_value upload_max_filesize 256M
サイズは upload_max_filesize < post_max_size < memory_limit
となるように設定する。場合によってはApache側の設定も必要。
以下、参考ページ。
ショッピングカートプラグインと注文管理プラグイン(ベータ版)
ショッピングカートプラグインと注文管理プラグイン(どちらもアルファ版)を公開しました。
一週間ほど様子を見てから、問題なければ正式版として公開したいと思います。
以下、アルファ版に対していただいた意見への返信です。
アマゾンのような、ログインしてカートに入れると保存される機能やレビュー(星)機能もあるといいです!
ログインしてカートに入れると保存される機能は、注文管理プラグインに実装しました。
レビュー投稿は、別プラグインとして作る予定リストに入れておきます。
注文者が配送方法を選ぶ形式の他に、計算表内の最安の配送方法を自動的に選択されて注文の合計金額に反映されるような設定にできるとありがたいです。
あと、送料をサークル側が負担する場合もあるかと思うので、この項目自体を表示・非表示できたほうがいいのかも?とも思いました。
都道府県を選択するまで最終的な送料を決定できないので、最安の自動選択は難しいです。配送方法が固定の場合にいちいち選択しなくてもいいように、一番上の配送方法をデフォルトで選択済みにできるようにしました。
現仕様だと支払い方法は項目が一つでも必須選択項目として出てきています。
選択肢がないならわざわざクリックさせるのもなぁと思うので、これも項目自体、フォームに反映させるかさせないかの選択肢があってほしいです。
配送方法と同じく、一番上の支払い方法をデフォルトで選択済みにできるようにしました。
現状ではファイルアップロードの形式のみですが、URL指定で通常のページ(ページ機能使った小説本文のサンプルとか)を指定できるといいです。
その際はURLを別窓(_blank)指定で開ける選択肢があるといいなと思います。
「オプション」として入力項目を追加できるので、それでサンプルページのURLを掲載する方法を解説したいと思います。
商品一覧ページでも印刷形式(オフセット等)やページ数など詳細を表示されていてほしいです。
でも表示はなるべく簡易にしたい人もいると思うので、これも表示・非表示を選べるといいと思います。
迷ったのですが、デフォルトで商品一覧でもそれらを表示するようにしました。不要な場合、templates/plugins/catalog/default.html
を編集して削除すればOKです。
表示を追加するのは難しいかもしれませんが、削除するなら難しくないかなと思うので。
現状、15禁と18禁の選択のみですが、カテゴリ同様に項目のメンテナンスをしたいです。
視覚的に「全年齢」を項目に入れたかったり、「20禁」もあるかもしれませんし。
files/plugins/catalog_defines/targets.csv
を編集すれば項目を増減できます。データ形式は機能解説の「対象の編集」に記載しました。
該当する商品がない項目は非表示をデフォルトにして欲しいです。
標準機能のカテゴリー一覧などで、該当0でも項目を表示させているのでそちらに合わせて「常に表示」としました。
年齢制限のある作品は、現状、その個別ページを開いた時にtarget画面に自動できりかわり、認証前には一覧には表示されなくなっていると思います。
これを、認証しなくても一覧に表示できるかどうかを選択できるようにはできないでしょうか?
「デフォルトで15禁に認証済み」「デフォルトで18禁に認証済み」のように、訪問者の初期値を設定できるようにしました。設定方法は機能解説の「設定の編集」に記載しました。
初めて注文する人用に通販利用方法が説明してあるページを作成
普通にfreoのページ機能などで作るか、テンプレートを編集して説明を掲載すればいいかなと思うので、未対応です。そういう意味でなければ詳細をお知らせください。
一つのリンク先にサンプル画像を原寸で並べて表示する
templates/plugins/catalog/view.html
を編集すれば可能です。
1種類の商品をn個以上はカートに入れられない
商品登録時、「一度に購入できる最大数」で設定できます。
連絡事項の入力内容に特定の単語が含まれていないと注文完了できない
そのうち機能追加したいと思います。
情報入力画面にチェックボックスを追加(おまけにメッセージカードを付けていいですか?などの希望を取りたいからです)
そのうち機能追加したいと思います。
注文後お礼画面にリダイレクトする
templates/plugins/catalog/order_complete.html
が注文完了画面ですが、これを編集すればリダイレクトさせることも可能です。
入金方法によって内容の違う自動返信メールを送信する
ちょっと無理矢理気味な方法になりますが、注文内容によって送信されるメールの内容の一部を変化させることはできるので、そのうち解説を用意したいと思います。
「商品追加しました」「メールアドレスが届かない方がおられますので~」などの事務連絡用ツイッターをナビゲーションに表示
Twitter公式のウィジェットをテンプレートに埋め込めばOKです。
mod_rewriteによるURLの統一
mod_rewriteでのURL統一について調べることがあったので、テストも兼ねてこのサイトに導入してみました。
統一方法はググればすぐに出てきたものの、静的ページを前提にしているのかPHPページだと微妙に正しく動かないものが多かったのでメモ。
- http://www.favorite-labo.org/
- http://favorite-labo.org/
- http://www.favorite-labo.org/index.php
- http://favorite-labo.org/index.php
- http://www.favorite-labo.org/page/about
- http://favorite-labo.org/page/about
- http://www.favorite-labo.org/index.php/page/about
- http://favorite-labo.org/index.php/page/about
それぞれ一番上のURLに統一されます。(www
あり。index.php
なし。)設定してあるmod_rewriteは以下のとおりです。すでにfreo用のmod_rewriteを設定している場合、それは削除します。(もしくは、見比べながら加筆します。)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^favorite-labo.org
RewriteRule ^(.*)$ http://www.favorite-labo.org/$1 [R=301,L,NE]
RewriteCond %{THE_REQUEST} ^GET\ .*/index.php
RewriteRule ^(.*)index.php/?(.*)$ http://www.favorite-labo.org/$1$2 [R=301,L,NE]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php/$1 [L]
</IfModule>
URLがこのサイト用なので、各々のサイトに導入する場合は調整が必要です。そのうち、再度色々と検証してからfreoサイトに解説を書くとします。
↑書きました。URLの簡略化(mod_rewrite)について
ショッピングカートプラグインと注文管理プラグイン(アルファ版)
ショッピングカートプラグインと注文管理プラグイン(どちらもアルファ版)を公開しました。
汎用性は高くしたつもりですが、薄い本とかCDを個人で売ることを主に想定しています。
商品サイズに応じた配送方法を選択してもらうことができたり、配送方法ごとに支払い方法や地域ごとの送料を設定できたり、年齢認証を設けることができたり、印刷用ページをHTMLテンプレートで編集したりブラウザ上で直接いじったり。などなど。
今はまだ仕様変更が容易なので、「こんな風になっていた方がいい」「こんな機能があった方がいい」「これは意味が解らない」とかあれば、教えてもらえると嬉しいです。
ユーティリティ
カテゴリー
タグクラウド
- 33分探偵1
- AMBITIOUS JAPAN!1
- ARIA2
- Air2
- Android2
- BLACK CAT2
- C#1
- Chrome2
- FINAL FANTASY2
- Flash2
- GAE1
- JavaScript18
- Kindle1
- Mac2
- MySQL7
- PHP68
- PayPal1
- Perl3
- PostgreSQL2
- Python1
- Ruby1
- SQLite6
- Switch1
- TinyMCE4
- Windows Media Player1
- bot1
- fragile1
- freo53
- iPhone3
- iTunes1
- levis1
- mod_rewrite2
- node.js1
- sola1
- true tears1
- いつかのメリークリスマス1
- いつか帰るところ1
- けいおん!1
- ここにしか咲かない花3
- とある魔術の禁書目録1
- とらドラ!2
- ひぐらしのなく頃に2
- みなみけ1
- イラスト4
- ガンダム003
- クロノトリガー1
- ザナルカンドにて4
- テラ1
- ニコニコ動画8
- ハゲタカ2
- ピアノ36
- マクロスF3
- ユニットテスト1
- ルパン三世1
- ローズ・オブ・メイ4
- 初音ミク1
- 半分の月がのぼる空1
- 名探偵コナン1
- 戦場のメリークリスマス5
- 携帯10
- 攻殻機動隊1
- 桜2
- 機工魔術士1
- 決行~姫をさがして~1
- 涼宮ハルヒの憂鬱10
- 深愛2
- 灼眼のシャナ4
- 聖剣伝説2
- 蕾3
- 蟲師2
- 返信2
- 野球1
- 鋼の錬金術師1