Archives
fuelphp使って分からなかったこと
fuelphp使うって言ってもmodelにmysql使ったりしてないんでイレギュラーな
感じなんですけど。
以下に分からなかったことなど
1,modelの検索メソッドがクラスメソッド
検索条件を検索メソッドに渡してレコードオブジェクトを受け取るんだから別に
インスタンスメソッドである必要はないんだけど、じゃぁ返ってきたモノは
ただの連想配列なのかモデルオブジェクトの塊なのか…
昔、Javaを少し自習した時にレコードオブジェクトのクラスとオブジェクトの塊を保持する
クラスが別になる書き方があって、自分にはその方がしっくり来るんだけど、多分塊を保持
するクラスが余計っていう考えなのだろうか。
何にしっくりこないかというと、モデルクラスの1インスタンスが1レコードオブジェクトなのか
その塊(1個以上)が1インスタンスなのかという事。
Model_Crudのメソッド見てるとhas_next()とかあるから、1個以上のレコードオブジェクトを
保持するイテレータオブジェクトが1インスタンスなのかなーって思う。でもそうすると、fuelphp
においては1レコードオブジェクトってのは1モデルインスタンスが保持するただの連想配列なのか
な?
このあたりは、PHPの他のフレームワーク勉強したり他の言語のフレームワーク勉強していくしか
ないかな。
2,FieldSetクラスという便利なものの中のcheckboxの名前の付け方
これは多分自分の学習が足りないだけなんだと思うけど、PHPでinputフォームのチェックボックス
を複数用意する時、name属性をname=”◯◯[]”とかにして受け取ったPHPで値を配列で扱うんだけ
ど、fuelphpのFieldSetクラスから生成したcheckboxがname属性をname=”◯◯[i]”って[]の中
に数字を入れてくるんです。受け取るPHP側では配列として受け取れるぽいんだけど、fuelphpの
Validationでこのチェックボックスグループらのどれか1つにはチェックしていること!みたいな
事が出来ない。あと、jQueryのvalidationプラグインが動かない。別のものとして扱ってしまう。
core/classes/foeldset/の中にあるファイルのcheckboxのフォームの名前属性を作る部分を直接
書き換えて(本当はappフォルダにコピーするべき)使っている。
3,FieldSetオブジェクトのフォームオブジェクトのラベル出力の時に出力されるラベル要素に
クラス(htmlのclass)を追加する手段が分からない。
こいつ、checkboxやradioのグループ出力する場合はタグ出力しないんだぜ。意味不明。 親要素のclassに装飾の指定しても無視されたりするし、ホンマむかちく(ただの勉強不足)。
やりたかったのは、必須入力のフォーム要素にはラベル名称を赤字にしたかったんだけど、css適用
されなくて、仕方なく、requiredの場合出力されるデフォルト「*」のやつを「(必須)」てかえて
それを赤字にした(requiredの時に出力される奴はlabel要素外)。
4,単にどこに何を書くかがまだ理解できていない。
controllerのactionメソッド内にloginチェックの詳細処理を書いてるんだけど、そこは外に
切り出すべきなんじゃないの?とかactionメソッド内でのみ使う提携処理&ちょっと複雑みたいな
のは外に切り出すべきなんだろうけど、それは別のcomponentクラスとかにクラスメソッドとして
jQueryで要素の高さを変える
まぁ、アレですよ。よかれと思って表示非表示をトグルする要素作ったら、
非表示にした分、開いたスペースだけ下にあるリスト(table)要素の高さ広げてよ
っていうオマケに品質求めちゃう的な要望があったわけですよ。
jQueryのtoggle()が勝手にon-offやってくれるのはいいんだけど、今要素をたたんでいるのか
広げてるのか分からないのでis(“:hidden”)なんてのを使って調べるわけですね。
だったらshow()とhide()使っても良くね?的な。
css 印刷のために
なんとかPHP側でPDF作成とかじゃなくてhtml&cssで楽したい。
そんな時のcss設定とか。
まず、対象レイアウトに印刷用css作っていきます。
cssの中で@media print とかやっておくと、印刷の時だけ適用されるので、css作ってる間は
その指定外しておいたほうが楽ね。
出来上がったら、htmlのheadでそのcssをmedia=”print”の指定付きで読み込む。
後はhtml内に印刷ボタン配置して印刷ボタン押したらbody要素のクラスに”print”を付与
javascriptで印刷→setTimeoutなんかで1秒後にbodyに付与したprintクラスを今度は
消してやれば、元通り!って寸法です。
ページ番号とかリンク?とか印刷日付とかはブラウザの仕様らしいので我慢。
それが嫌ならPDFで一から作ってください。難易度の落差が凄いな。
cssメモ ちょっとしたもの
cssでwindowサイズに応じてbodyのcss定義を変える。
まぁ、bootstrapで使っている上に固定のメニューリストみたいなのある時に
windowの横幅めっちゃ狭めるとアレですやん。その辺の細工。
共通の見た目にしたい用クラス作っとくと便利。というかそれが本来の使い方。
例えば初期状態は非表示にしたい要素用クラスとそのcss定義とかね。
cssメモ 配下の指定
cssで配下の指定勘違いしておかしな事やってたのでメモ
結論としては、きちんと継承させたい(関連を持たせたい)事が分かるように書かないと駄目。
最初
1,scrollさせたいdivの定義
2,position:absoluteを使ってtableのheaderを上に固定させつつbodyだけスクールするよう
定義
この時、1で基準となるdivとその配下のdiv(scrollの指定したdev)の定義をしていて
tableヘッダはscrollの定義をしたdivの子要素だからってそういう書き方してたら、
tableヘッダ要素が意図する位置に固定されたような感じになるんだけど目には見えない
状態になった。レイヤーの上下関係とかかな?とか思っていじくり回してたけど、違った。
tableヘッダ要素は基準になるdiv配下のtheadみたいな描き方しないと駄目でした。
div#base{
posision: relative;
}
div#scroll{
スクロールの設定(html上ではdiv#baseの子要素)
}
てやっている状態の時に
x div#scroll table thead ・・・これだとscroll定義されたdivの影響下(間違って無くね?)
◯ div#base table thead ・・・これだと基準divの位置を基準にして正しく表示される。
div#scrollは#baseの子要素なんだから問題無いだろうと思ってて、開発者ツールとかで確認すると
意図する位置にいるのに表示されない状態。cssからすると、htmlどう書かれているか知ったこっちゃない
ってことなんだろうね。css上でキチンとどこの配下の何の要素か書いてあげないといけんというこってす。
そうそう、tableのheaderとbodyを分けるとheaderとbodyでtdの幅が合わなくなる事がある(内容次第)ので
javascriptで無理やりbody側のtdの幅にheaderのthの幅をあわせるって事も必要です。固定幅じゃない場合。
最終的な見本を下に(htmlはめんどうなので載せてません)
なんとか再開したい
memo的な感じで再開したい。
でもその前にWordPressの勉強をしなおして、改良してから再開したい。
当面はメモはEvernoteにとどめておくしか無いかな。
Perlの動作環境?について
長らく更新してませんでしたが、その間にFlask試したり、最近なんかは
ちょっとだけVisual C++を初心者本見ながら動かしてました。
C++分かんない。
さて、PerlをVPS上で動かす&Mojolicious::Liteで作成中の簡単なFAQアプリの為、Perlを
どうやって動かすのか、簡単に試したのでまとめてみた。(まとまってないし解説にもなってない)
perlを使えるように設定する
1,Perlを入れましょう。既に入っている場合はバージョンを確認してできるだけ偶数ナンバーの最新版を入れましょう
※奇数番号のバージョンは実験要素が強いと聞いたことがありますのでperl-14.xが良いかと
※perl -v でバージョンの確認ができます。
2,Perlbrewを入れましょうバージョンを切り替えたりライブラリを追加したりが楽になるそうです。
3,ターミナルベースで動かす
ファイルの拡張子を「.pl」とかにして内容はprint “Hello,World\n”;とか書いて
ターミナルで「perl aaa.pl」とかやると起動して処理実行しますね。
厳密にはファイルエンコードはUTF-8にしましょうとか、ソースの行頭にお決まりの書き方をするとかありますけど
その内容については省略するので他で調べてください。
4,ApacheにCGIの設定して動かす
特になんの設定もせずPerlファイルをWeb公開領域に置いてもソースをそのまま画面に出力したり、
エラーになったりします。
・ApacheにCGIの設定を書いていない
・作成したPerlファイルに実行権限がついていない
などが主な理由です。権限についてはchmodコマンドで実行権限を付与してください。
Apacheの設定ファイル「httpd.conf」もしくはVirtual-Hostの設定をしているなら「httpd-vhost.conf」を
開いて設定を記述します。
———-
<Directory “/virtualhostdirectory/hoge”>
AddHandler cgi-script .cgi .pl .py .rb
Options All
AllowOverride All
Order allow,deny
Allow from all
———-
フレームワークちょいちょい
ここ最近はフレームワークを少し触ってる。
Perl:Mojolicious::Lite
→DBをFileMakerで簡単な検索をするものを作成。Liteの場合は?APPPATH/templates直下に
各ビューテンプレートファイルを置く。ベースとするレイアウトはAPPPATH/templates/
layouts直下にdefault.html.epて名前で配置する。静的ファイルはAPPPATH/public配下に配置する。
このあたりの説明でドンピシャ説明しているのが見つからなくて、なかなかつまづいた。
Ruby:Sinatra
→Hamlの書き方とか忘れてて大苦戦。あとなんかサーバー再起動しないと変更が摘要されない感じとか
ちょっと苦労。Mojolicious::Liteでやったのと同じ事をSinatraでも実践。という訳でDBはFileMaker。
これは前に一度やっているのでコードをちょっと変える程度だったのにとにかく上記の不可思議で苦戦。
PHP:FuelPHP
→最初はSilexで挑戦してたんだけど、意味不明過ぎて挫折。そんでシンプルそうなFuelに手を出す。
これもDBをFileMakerで簡単な一覧表示検索という上の2つと同じ事をやるものを作成。たいぽや
コンテキストでちょいちょい間違えて詰まったけど、割と簡単だった。FuelPHPの時は静的ファイルは
public/assetsて階層に配置するんですね。
PythonのFlaskに手を出す予定だったのに時間が足りなかったから来週はFlaskかな。
OS再インストールしたせいだと思うけど、前に作ったDjangoが動かなくなってた。モジュールがインポート
出来ないとかで……
Perl勉強してるメモ1
何故か最近Perlの勉強を始めた。
気になった箇所のまとめ、
■変数と型
・普通(単一)のデータはスカラー変数で扱う:$val = ‘Hello’;
・配列は「$」の代わりに「@」でも中の要素を扱う時は「$」でインデックスの指定は[]
:@array = (1,2,3,4,5); print $array[0] # 1
・ハッシュは「$」の代わりに「%」でも中の要素を扱う時は「$」で指定は{}
:%hash = (‘a’=>’1′,’b’=>’2’); print $hash{a} # 1
■変数スコープ
・{}ブロックでスコープは仕切られている。そのため変数はmyを使ってスコープを意識した変数宣言を
すると良いとされている。
・ファイルスコープは実は1ファイル1パッケージ的な扱いでパッケージスコープ。
・例えばファイル直下の位置で$cgi = CGI->new; とかやっておけば、subを呼ぶ時に毎回$cgiを
引数として渡す必要はない。
参考 Gist:https://gist.github.com/3855891
■リファレンス
・C言語で言うところのポインタ?配列やハッシュをサブルーチンに渡す際に変数のリファレンスを
渡す。そうしないと呼び出し先では1つの引数データに連結されてしまっているのでうまく復元できない。
・リファレンスで渡された値をsubスコープ内の新たな変数に入れてデリファレンスして編集すると、
元の変数の値が変わっている。デリファレンスした値を新たな変数に入れて編集した場合は影響しない。
参考Gist:https://gist.github.com/3850245
https://gist.github.com/3856617
■ファイルの扱いなど
・use IO=>’utf8′; としておくとUTF-8でファイルIOで扱う。
・ファイルハンドルはレキシカルスコープ変数を使うようにしましょう。
・またopen関数は3引数の形で使いましょう。
open(my $fh,’<‘,$file_path);
■モジュールについて
・use strict;と use warnings; はワンライナー(or実験)以外では必ずつけましょう。