PHP開発(PHP)Smartyを使っているがShift-JISで出力したいShift-JISで作られているCGIのサイトをPHP(テンプレートエンジンとしてSmarty使用)に移行してるんですが、やはり移行後もわけあってShift-JISでないとダメなようです。SmartyのテンプレートファイルをShift-JISで作るとエラーが。「必須」という文字がSmartyのメタ文字「{」となっちゃってるようです。Shift-JISのファイルは作っちゃダメだなということで、テンプレートファイル、PHPファイル共にUTF-8で書き、Smartyのアウトプットフィルタを使って出力時にShift-JISに変換することとしました。以下のような感じです。みたいなエラーになります。しないといけないようです。PHP開発PukiWikiのページをGUIで編集できるようにするguieditプラグインPukiWikiで情報共有サイトを作っても、エンドユーザには独特のWiki記法がネックになってしまうケースが多々あります。ページを編集できるものがないか探したところ、guieditというプラグインがありました。(こちらのデモサイトで動作を確認できます。Pukiwikiでも使えるようにしたもののようです。ダウンロードは公式サイトから可能です。インストール方法も上記サイトに書いてますが、一応メモしておきます。ダウンロードし、解凍します。ディレクトリに配置します。ディレクトリに配置します。公式サイトからダウロードします。ディレクトリに配置します。|の次行に以下を追加します。'編集';の次行に以下を追加します。し、JavaScriptを有効にします。'};';の次行に以下を追加します。1;ツールバーにリンクを追加するために、以下の設定を行います。'編集';の次行に以下を追加します。"$script?cmd=edit&page=$r_page";の次行に以下を追加します。'edit.png';の次行に以下を追加します。?>の次行に以下を追加します。?>guieditを導入して気になったのが、編集画面の縦が小さいことです。既定値は300pxのようです。これではちょっと不便なので、もっと縦を長くとってみました。所を任意の値にすると高さが変わるようです。文章入力時に普通に改行すると、違う段落になってしまうようです。改行しないといけないようですね。リンクを張る場合、リンクを張る文字列を選択し、「リンク挿入/編集」ボタンを押します。ページ名へのリンクを張る場合は、リンクタイプ:URL,プロトコルからを選択しURL欄にページ名を入力するようです。PHP開発(PHP)MVCモデルを使ったPHPアプリケーションPHPのフレームワーク(CakePHP等)は、元からMVCモデルとなっているわけですが、機能も多く重量級です。軽量のMVCフレームワークもあるのかもしれませんが、ほんとに小規模なPHPアプリケーションとかだと、案外自作にした方が効率がよいのかもしれません。5年度前に、以前の勤務先で自作MVCモデルを使ってたんですが、しばらくPHP触らない間にすっかり忘れていました。オブジェクト指向PHP.NETを参考に、軽量なMVCフレームワークを作ってみました。MVCの概念は多くのサイトで解説されているので省略します。今回作成するのは、大まかに下記のような構造になります。リクエス振り分けまずは、リクエスト振り分けの部分です。集中させ、そこからURLの内容に基づきどのコントローラのどのアクションに処理を割り振るかを制御します。対してGETパラメータを付ける方法と、/区切りでパラメータを付ける方法があります。区切りでパラータを指定する方法を取りました。みたいな感じ)参考先の設定ではサイト直下にMVCコンテンツを置くような設定になっています。イントラネットのサーバ等で1台のWEBサーバにWEBアプリが乱立していると、サイト直下に配置できないケースが出てくるんですよね。部署のディレクトリの配下にコンテンツ置く必要がある場合など)ということで、特定の階層以下からコントローラのパラータとみなすように手を加えてみました。配下にMVCモデルで作ったコンテンツを置くこととします。apacheのリライト機能の設定です。以下のように設定しました。指定するとこで、GETパラメータも引き継げます。[QSA,L]※当然MVCアプリコンテンツのパスが変わると、mod_rewriteの設定は変わります。下記のようになります。Dispatcher();IncludePathSetting($dispatcher);//apacheのドキュメントルートから何階層目のディレクトリにMVCアプリを配備するか。配下は1階層目に当たるので、1とする。PHPのinclude_pathを設定。本番環境、テスト環境を切り分ける。$path);}?>Dispatcher.phpこのPHPファイルで、リクエストを振り分けます。1つめのパラメータで、どのコントローラを使うか決めます。いうクラスのインスタンスを作成します。2つめのパラメータでどのアクションメソッドを実行するか決めます。いうメソッドを実行します。//URLの階層設定。どの階層からをパラメータとして解釈するか。どの階層からをパラメータとして解釈するか。}}?>xxxController.php各コントローラのクラスファイルです。ここで、モデル、ビューへの制御を行います。)の任意のメソッドを実行。)の任意のメソッドを実行。}}?>xxxModelクラス.php各モデルのクラスファイルです。このクラス内でDBにアクセスしたりと、メインロジックを書いて行きます。//各処理毎にメソッドを作成。}?>リクエストブラウザから送信されるリクエストですが、これもクラス化してやります。詳しいコードは、(PHP)MVCモデルを使ったPHPアプリケーション(リクエスト部分)を参照にしてください。コントローラからリクエストを取得するには下記のようにします。//とすると、全POST情報を取得できます。ビュービューは前述のとおり、テンプレートエンジンであるSmartyを使います。コントローラにSmartyのインスタンスを作成し、テンプレートを指定して表示するという方法です。Smartyについては大量に情報が出まわってますし、3流PGのメモ書きにもちょこっと書いてるのでそのあたりが参考になるかもです。考えると結構簡単にMVCモデルって作れるんですね。オブジェクト指向的には、コントローラやモデルクラスでベースクラスに汎用処理埋め込み、それを継承して各クラス別の処理を書くのが理想なんでしょうが、今回はMVCの基本的な部分だけということなので、以上です。参考先には、継承をつかった話も書いているので、見てみるといいかもしれません。PHP開発(PHP)MVCモデルを使ったPHPアプリケーション(リクエスト部分)(PHP)MVCモデルを使ったPHPアプリケーションのリクエスト部分のソースです。GET,POSTで送られてくるリクエストをオブジェクトとして扱えるようクラス化します。参考先まるままですが、こんな感じ。Request.phpコントローラからはこのクラスを呼び出し、リクエストにアクセスします。}}?>RequestVariables.phpリクエストの変数を抽象化するためのクラスです。}}?>Post.phpPOST変数を抽象化します。}}?>QueryString.phpGET変数を抽象化します。PHP開発(Ajax,PHP)Ajaxを使って入力フォームに戻ったときに値を再セットする(PHP)セッションを使ってて入力フォームページに戻ると入力内容がクリアされるや(PHP)Smarty利用時に入力チェックエラー時に入力画面に戻し入力データを再表示する方法と関係のある話になります。篳篥日記を参考にさせてもらいました。要は、入力画面で入力した値をセッション変数に保存→入力画面に戻ったらAjaxリクエストによってセッション変数に保存した値をJSONで取ってきてフォームに再セットという流れです。この手法はページ全体をAjax化してなくても、ページ毎にURLが変わる典型的なWEBページでも使うことができると思います。以下にサンプルコードを載せますが、AjaxはjQueryライブラリ、サーバサイドはPHP、テンプレートエンジンはSmartyを使っています。(文字数制限のためハイライトはOFFです)●test_inputdataset.php最初に表示する入力フォームを表示するPHPスクリプトです。Smartyを使って基本のページテンプレートを呼び出します。$smarty->display("test_input_page.tpl");?>●test_input_page.tplページのSmartyテンプレートです。最初に表示されたときは、入力フォームテンプレートである、test_input_form.tplを読み込みます。</div></body></html>●test_input_form.tpl入力フォームのテンプレートです。</form>●test_input_form.tpl確認画面のテンプレートです。backInputPate()">●test_input_preview.php確認画面を表示するためのPHPです。入力フォームから渡された値をセッション変数に保存します。$smarty->display("test_input_preview.tpl");?>●test_input_getjson.phpセッションに保存された値をJSON形式で返すPHPです。(セッションがない場合はnullが返ります。)PHPの配列をJSONにするjson_encode関数はPHP5.2以降で使えるようですね。}?>●test_input.js入力フォームで動くJavaScriptです。入力フォーム表示時に、Ajaxを使って入力済みのデータがあるかどうか問合せます。データがあればJSONで返ってくるので、フォームに値をセットします。//dataにJSONデータが入っている。Ajaxを使い、ページそのままでコンテンツのみ変更。Ajaxを使い、ページそのままでコンテンツのみ変更。false;}数年ぶりにJSONを使ったのですっかり仕様を忘れていました。参考サイトのおかげで何となく思い出すことができました。PHP開発(PHP,Ajax)SmartyでAjaxを使用するSmartyを利用しながらページ遷移をAjaxでシームレスに行ってみることにしました。アプリケーションを開発するです。若干ややこしかったので、自分なりに簡易にしてみました。Ajaxで遷移するコードを書いてみました。(ログイン失敗のメッセージもAjaxでページ遷移せずに表示します)まず、ページのSmartyテンプレートです。内をページによって書き換えていきます。内には、最初に表示するテンプレートをインクルードします。colspan="2">ログイン情報に誤りがあります。submitDemoForm()">ログイン</button></form>ログイン用の情報を入れるテキストボックスです。表示されるテンプレートです。はいり、エラーメッセージを表示します。styke="color:brue;">ログイン</span>が完了しました。<br>ページ遷移なしでコンテンツが切り替わりました。<br>更新ボタンを押下すると、ログイン画面に戻ってしまうので、セッション変数を上手く使うなど対策が必要。表示されるテンプレートです。つぎに、PHPファイルです。クライアントはこのPHPにアクセスし、どのページを表示するかのmodeに基づいて処理を割り振ります。(MVCのコントローラみたいな感じですね)今回はすべてこのPHPファイルにアクセスしていますが、別にページ毎にPHPファイルを作ってもかまいません。(ただしクライアントに表示されるURLは最初にアクセスしたページのままです。="smarty/cache";//$mode変数にどの画面を表示するかの値を持たす。"default";//どの画面を表示するか判定。ログインページテンプレートを表示。return;}?>最後に、JavaScriptのファイルです。jQueryライブラリを使ってAjaxを用います。//ajax通信が完了後、レスポンスしたデータを表示。イベントは捕まえられないようです。"エラーになってしまいます。送信されないんですね。自体が存在しないため、上記のエラーとなります。PHPでサーバ変数とか使うときは、以下のように変数が存在するかどうかをチェックしてから値を使うようにしたほうが良いですね。情シスで何でも屋の三流プログラマのコーディング、サーバ管理、PC生活関係のメモ書き。このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。31検索カテゴリ全体Linuxサーバがらみ.Net開発PHP開発C/C++開発JavaSQLツール思ったこととかニュースとか。メッセージを入力してください。