ラベル pear の投稿を表示しています。 すべての投稿を表示
ラベル pear の投稿を表示しています。 すべての投稿を表示

2011年7月18日月曜日

Pear::DBからMDB2への移行で修正した箇所

Pear::DBからMDB2への移行をしたのですが、けっこう面倒でした。
覚えている範囲でメモしておきます。

■DBへの接続

変更前
$db = DB::connect(DSN);

変更後
$db = MDB2::connect(DSN);
$db->loadModule('Extended');



■FETCHMODE定数の変更

変更前
$rs->fetchRow(DB_FETCHMODE_ASSOC)

変更後
$rs->fetchRow(MDB2_FETCHMODE_ASSOC)


■limit句

変更前
$db->limitQuery($sql, 0, 10);

変更後
$db->setLimit(10, 0);
$db->query($sql);



■quote関数

変更前
$db->quoteSmart($v["value"])

変更後
$db->quote($v["value"])


■その他

※MDB2ではexecuteMultipleで連想配列が使えないので注意。DBから値を取得して使う場合などは、MDB2_FETCHMODE_ASSOCじゃなくMDB2_FETCHMODE_ORDEREDを使うと良い。

※quoteSmartではnullを自動的に空白文字列化してくれていたが、quoteではその機能がないので、nullが入る可能性のあるカラムは予めnull化にしておく。

※上記修正の該当箇所はこんなふうにfindで調べました。

find . -name \*.php -print xargs grep limitQuery

2011年1月26日水曜日

jqueryでformタグのonsubmit属性を削除する

Pear::HTML_QuickFormで出力したフォームには

<form action="/path/to/somewhere" method="post" name="testForm" id="testForm" onsubmit="try { var myValidator = validate_testForm; } catch(e) { return true; } return myValidator(this);">

という具合に、もれなくonsubmit属性がついてきます。

今回はこのonsubmitを消すという処理をしました。

$('#test_form').attr("onsubmit");

でさくっと消せるかな~、と思ってたのですが、消えません。

ググってみたところ、

$('#test_form').removeAttr("onsubmit");

で消せることが分かりました。

http://joshuaclayton.github.com/code/2009/06/08/handling-jquery-and-onsubmit.html


ちなみにonsubmitより利用頻度の高いonclickで検索すると、やはり属性が削除できず困っているというページが何件かヒットしました。

参考:onclick属性の操作
http://d.hatena.ne.jp/ftsh/20100729/1280396560
http://stackoverflow.com/questions/249074/how-to-change-onclick-handler-dynamically


それからこちらは「nameやidに"submit"という名前を付けるとjqueryの動作が怪しくなる」という件について。
属性の削除とは別の問題ですが、今回同様の問題に遭遇して、解決の糸口になりました。
http://www.takenoshin.com/web/blog/page/6.html

2011年1月13日木曜日

jquery+Pear::HTML_QuickFormでメールフォーム

を作ってみました。

フォームの送信はjqueryのajaxメソッドで、Pear::HTML_QuickFormはエラーチェックに使っています。
エラーがある場合はphpからjsonでエラーフラグとエラーメッセージを出力し、jqueryでエラーを受け取って処理します。

jqueryでエラーチェックのロジックを書いてもいいと思いますが、HTML_QuickFormのエラーチェックは使い慣れているので、この組み合わせでメールフォームを作ってみました。

こちらがそのフォームです。メールは飛ばないので、好きなだけ送信ボタンを押して大丈夫です。

サンプルメールフォーム

html,css,javascript,phpを完全に分離しているので、このようにブログ記事、ページ内にフォームを設置できます。(linkタグをdiv内に入れるな、という警告が出てしまいますが)


ソースはこちら。

mail_form.css
mail_form.js

phpはこんな感じです。


<?php

require('HTML/QuickForm.php');
require('HTML/QuickForm/Rule.php');
$form = new HTML_QuickForm('mailForm');

$form->addElement('text','contact_name','contact_name',array());
$form->addRule('contact_name', 'お名前を入力してください', 'required', '', 'server');
$form->addElement('text','contact_email','contact_email',array());
$form->addRule('contact_email', 'メールアドレスを入力してください', 'required', '', 'server');
$form->addRule('contact_email', 'メールアドレスを正しく入力してください', 'email', '', 'server');
$form->addElement('text','contact_title','contact_title',array());
$form->addRule('contact_title', '件名を入力してください', 'required', '', 'server');
$form->addElement('text','contact_description','contact_title',array());
$form->addRule('contact_description', '内容を入力してください', 'required', '', 'server');

$result = array();
$result["error"] = 0;

if($form->validate()){ $form->process("send_emails",FALSE); }
else{
$result["error"] = 1;
$result["error_msgs"] = $form->_errors;
}

echo json_encode($result);
exit;


function send_emails($v){
//メール送信
}
?>


昨年後半から少しずつjqueryの勉強をしていますが、こうやって実用的なアプリケーションが作れるようになってくるとコーディングも楽しくなってきますね。

今年はさらにjqueryの知識や経験を深めていきたいと思います。


※2011/01/24追記
display:noneの要素(送信中表示やサンキューメッセージ)からはouterWidth()等のメソッドで要素のサイズを取得できないことがわかったので、display:noneではなくvisibility:hiddenを使うようにソースを修正しました。

2010年9月11日土曜日

Services_TwitterのOAuth対応

少し前にTwitterAPIがOAuth対応になり、これまでのベーシック認証が使えなくなりました。

そのうち対応させなきゃいけないなー、と思いつつ後回しにしていたのですが、こちらの記事を見て簡単にできることがわかったので対応してみました。

http://phpspot.org/blog/archives/2010/09/oauthphptwitter.html

まずは必要なPearライブラリを用意。その時点での最新バージョンをインストールします。


pear install channel://pear.php.net/Net_URL2-0.3.1
pear install channel://pear.php.net/HTTP_Request2-0.5.2
pear install HTTP_OAuth-0.1.18
pear upgrade channel://pear.php.net/Services_Twitter-0.6.2


※Services_Twitterはバージョン0.4以降はphp5.2以上でないとインストールできません。
自分の場合、php5.1の環境だったんですが、-fオプションで強制的にインストールしました。
そのまま使ってますが、今のところ特に問題はでていません。


続いてソースコードの修正。こんな感じになります。


require("Services/Twitter.php");
require("HTTP/OAuth/Consumer.php");

$tweet = "ツイートです\n";

$twitter = new Services_Twitter();
$oauth = new HTTP_OAuth_Consumer(
'*************', //Consumer Key
'*************', //Consumer Secret
'*************', //Access Token
'*************' //Access Token Secret
);
$twitter->setOAuth($oauth);
$msg = $twitter->statuses->update($tweet);
echo "Tweet OK \n\n";


これでAPI経由でtweetできるようになりました。

2010年7月31日土曜日

PEAR::HTML_QuickFormの拡張

今すぐ何かに必要、というわけではないんですが、PEAR::HTML_QuickFormを拡張して使っている例で参考になりそうなのがあったので、自分用メモとして投稿。

inputタグの末尾のスラッシュを外す拡張
http://d.hatena.ne.jp/KeyKey/20071220/1198154161

出力コードをカスタマイズする拡張
http://mamok.com/2007/06/05/342/

2007年9月20日木曜日

Pear::DBは古い、これからはPear::MDB2だ

日ごろ愛用してるPear::DBですが、いつのまにか時代遅れになっていたようです。

http://itpro.nikkeibp.co.jp/article/COLUMN/20070827/280396/

今後はPear::MDB2が基本路線になっていくようです。Pear::DBでできることは、Pear::MDB2でもほぼすべてカバーできているようです。

http://www.phpied.com/db-2-mdb2/

移行するにはプログラム全部見直しが必要だし、テストも必要。面倒だなぁ。。。
でもPear::MDB2にして実行速度が速くなるのは魅力だな。と思ったんですが、

http://blog.zuzara.com/2006/09/07/112/

ほとんど変わらないみたいですね。

同じ移行コスト払うならPDOにしちゃったほうが良さそう。

でもPDOってgetOne()とかがないからちょっと面倒なんですよね。ま、それも半年くらい前に調べたことなので今はもう改善されてるのかもしれない。ちょっと調べてみよう。。

2006年11月7日火曜日

PEARのPagerクラスを使う


「前へ 1 2 3 4 5 6 7 8 9 10 次へ」



↑こういう感じのページナビゲーション、いわゆるページング処理を手軽に実装できるのがPEAR::Pagerです。実際使ってみたんですが、かなり便利です。



基本的な使い方は「pear pager」などでググると有用なページがいくつも見つかるのでそちらを参考にするといいと思います。というよりもむしろ実際に試して体で覚えるのがいいと思います。すごく簡単なので。



ちなみにこのページング処理、検索エンジン対策としてPATH_INFOにも対応できるといいな、、、って思っていたら、やってる方がいました。



http://project-p.jp/halt/anubis/blog_show/469



こちらを参考に実装してみました。



<?php

/*** pager.php ***/

//PATH_INFOから現在のページを取得
$tpath = explode("/", $_SERVER['PATH_INFO']);
array_shift($tpath);
if($tpath[0]){ $current_page = $tpath[0]; }else{ $current_page = 1; }


require('Pager/Pager.php');
require('Smarty/Smarty.class.php');

$smarty = new Smarty;
$smarty->template_dir = './smarty/template';
$smarty->compile_dir  = './smarty/template_c';


//ページング処理
$params = array(
    "perPage" => 5,
    "totalItems" => 100,
    'mode' => 'Sliding',
    'delta' => 2,
    'path' => 'http://localhost/pager/',
    'currentPage' => $current_page,
    'fileName' => '%d',
    'append' => false,
    'altPrev' => '前のページ',
    'altNext' => '次のページ',
    'altPage' => 'ページ',
    'firstPageText' => '最初',
    'altFirst' => '最初',
    'lastPageText' => '最後',
    'altLast' => '最後',
    'extraVars' => array("a" => 1),
    'showAllText' => 'show all',
    'importQuery' => true
    );
$pager = Pager::factory($params);
$navi = $pager->getLinks();
$smarty->assign("pageNavi",$navi['all']);

$smarty->display("pager.tpl");

?>



{** pager.tpl **}

<html>
<body>

{$pageNavi}

</body>
</html>


実は extraVars とか、いまいち動作がよく分からない変数があるんですが、その辺はあまり深く追求せずに使ってます。こういうのは自作しないでライブラリ使ったほうが絶対いいので、一度試してみる価値はあると思います。

2006年6月30日金曜日

PEARのパッケージをまとめてインストール

新しくサーバーを立てたときなど、まとめてPEARパッケージを入れるとき用にまとめてみました。この順番だと依存関係もスルーしてスンナリ入れられます。(たぶん)

pear install pear_info
pear install DB
pear install MDB2
pear install MDB2_Driver_mysql
pear install File
pear install Log
pear install Text_Password
pear install Net_SMTP
pear install Mail
pear install Mail_Mime
pear install Auth
pear install HTML_Common
pear install HTML_QuickForm
pear install Net_URL
pear install HTTP_Request
pear install HTTP
pear install HTTP_Header
pear install HTTP_Download
pear install XML_RPC
pear install XML_Parser
pear install Pager
pear install MIME_Type
pear install File_Archive
pear install XML_Tree
pear install XML_RSS

pear install -f HTML_Ajax
pear install channel://pear.php.net/Services_Trackback-0.6.2




※Services_Amazonを入れる場合
(随時アップデートされてるようなので、マメに最新バージョンが出てないかチェックするといいです)

pear install Cache
pear install XML_Util
pear install channel://pear.php.net/XML_Serializer-0.20.2
pear install channel://pear.php.net/Services_Amazon-0.8.0



※2011年7月16日追加。Twitter関連のライブラリのインストール
pear install channel://pear.php.net/Net_URL2-0.3.1
pear install channel://pear.php.net/HTTP_Request2-2.0.0RC1
pear install channel://pear.php.net/Services_Twitter-0.6.3
pear install channel://pear.php.net/HTTP_OAuth-0.2.3