Study-Daily
Laravel4触り始めました
Laravel4がこれから流行るかなーって思ってちょっとチュートリアル(クイックスタート)なんかを触り始めました。
テンプレートエンジン用ファイル上でのコメントアウトの書き方を理解していなくて、変数見つからないエラーとか出しまくってた。
{{– コメントアウトしたいコード –}}って書かないといけない。ていうか、そもそもの外で変な書き方してたのが悪い。
あと、migrationの使い方全然理解していないのでそこで詰まった。
検索フォームの値を受け取ってモデルに検索処理投げてレコードオブジェクト(モデルイングタンス?)受け取る処理はコントローラーに書くの?それともViewファイル?
わかりません。。。
FuelPHPで文字化けーアップロードファイル名とメール添付ファイル名
FuelPHPをUbuntu上で作成してWindows環境(Win2003、IIS6)に納品した結果、
Windowsのクライアントからファイルアップロードするとアップロードされたファイル名が文字化けしている!
(PHPの内部エンコードがUTF-8だけどWinがShift-JISだから)
→アップロードは送信メールに添付したいがためにしているだけなので文字化け解消しなくても良かったのですが、後でアップロードフォルダ内の整理や確認等人力で行う場合に視認性が悪いので無理やり対応。
FuelPHPのUpload::save()を行う前に
ってやってアップロードファイル名をエンコードする。
弊害としては本来は内部エンコードのまま処理が進むはずだったので、同名ファイルが有る場合に枝番を付加する処理なんかが正常に動作しなくなる。
これでWindowsサーバーのフォルダに読める文字のファイル名でアップロードされる。
最初エンコードをSJISにしてたけど、CP932にしたら、①みたいなMS拡張の機種依存文字も大丈夫になった。
本当はもっとスマートな方法が欲しかったんだけど、ファイルを置くところの処理がCoreファイルで作られていて入り込む余地が無いように思えた。それとも
とかやったら良かったのかな?
文字化け状態でアップロードされたファイルをメールの添付に加えると添付ファイル名も文字化け!
(ま、そりゃそうですね)
→上記1の結果を受けてメール送信のメソッドに引数として添付ファイル名を渡す。その処理は何も加工しない。
メール送信用のメソッドの中で、引数で受け取った添付ファイル名をFuelPHPのmailに渡す処理を加工
それでも、メールヘッダがISO-2022-JPなので、機種依存文字の類はメールを受信した時に「?」とかになってるけど、それはしょうがないよね。
メールの件名が文字化けすることがある!
→犯人は半角カナ。使わないで!件名はFuelPHP側で送信時にISO-2022-JPに変換してるっぽいので、mb_convert_kana関数使って件名に含まれている半角カナを全角に変換して誤魔化す。
以上、うんこメモでした。
sshで、ぷごふぁ
WordPress勉強してます。テーマについてはだいたい分かったので、自作テーマとか作っていきたい。
ゆくゆくは案件事例的なぽーとふぉりおサイトを作ろうと、とりあえずさくらVPSを立てて、SSHの
設定をする。
契約だけしてながらく放置していたので、OS再インストールしてSSHで接続しようとしたらエラー出て
ぷごふぁ!ってなった。調べたら出てきました。
参照: http://qiita.com/wnoguchi/items/690f3f4651f8f11e4ed3
要は以前に接続した際のゴミが残っていて再インストールしたのでIPとポート同じなのに鍵あわないじゃん!
て言うことでした。やっぱりデータを消せばいいだけだったんだ。初期化するコマンドとかないんかな?
Qiitaは素人同然の自分には本当に助かる。
印刷用CSSでハマった
この間、印刷用CSSを回収していて「そんなん知らねーよ!」ってなった事。
問題のCSS: page-break-before
いやコレでね強制改ページできるんで特定のdivタグのところで改ページさせようと
していたんだけど、ChromeではなるのにIE(対応対象はVer 9)だと改ページしてくれない。
IEでも解釈されるはずなのになんで?ってなって諦めてたんだけど、調べてたら出てきた。
IEの場合はpage-break-beforeが適用される要素がページをまたぐような位置にいる場合は
無視されるそうです。で、ちゃんとは調べてないのですがpage-break-beforeの場合はその
要素がpage-break-afterの場合は次の要素が判定基準になるっぽぽぽぽいです。
対処方法としては改ページしたい場所にからのdivを入れてその要素に対して改ページ指定の
cssを適用させるって方法。Web素人には分からんよ。Web上でCSSリファレンスをさっと見ても
そのことについての記述なかったし。んもう!
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はめんどうなので載せてません)