おぼえがき

おぼえがき

fuelphpでAssetsを利用して画面特有のcss,jsなどを呼び込む

2013-03-17 | php
前回、fuelphpでpjaxを扱うである画面だけ、pjaxのjsライブラリが必要だった。

テンプレートのベースである、templateファイルにpjaxのライブラリのパスを
書いてしまうと、使ってない画面までこのライブラリが呼ばれて無駄。
かと言って、個別テンプレートでそのライブラリを呼ぶのもいけてない。

assetsを利用してこの問題が解決できる。


■コントローラー

class Controller_Welcome extends Controller_Template
{
 public function action_index()
 {
  Asset::css(array('bootstrap.min.css', 'bootstrap-responsive.min.css','bootswatch.css'), array(), 'add_css', false);
  $this->template->content = View::forge('welcome/index');
 }

※ここで、'add_css'っていうグループを登録しておく


■テンプレート

<!DOCTYPE html>
<html lang="ja">
 <head>
  <meta charset="utf-8">
  <?php echo Asset::css('全てのテンプレートで呼ぶ.css'); ?>
  <?php echo Asset::js('全てのテンプレートで呼ぶ.js'); ?>
  <!-- 画面固有のCSS -->
  <?php echo Asset::render('add_css');?>


これで、コントローラー側で、add_cssグループに、CSSファイルがアサイン
されているときだけ、画面固有のCSSが表示されるようになる。

ちなみに、
<?php echo Asset::render('add_css',true);?>
ってやると、外部ファイルを呼ぶのではなくて、外部ファイルがここに
展開される

なるほどね

fuelphpでpjaxを扱う

2013-03-17 | php
fuelphpでpjaxを扱う

前回、fuelphpでログ出力を調べたのもこの開発を
している際にテストが面倒くさかったため。


ブラウザ対応の問題とかもあるが、pjaxを使うと読込速度や
SEO等々も考えると、なかなかいいと思う。

実装する動きは、画面Aから画面Bに遷移。
メインのコンテンツのみを入れ替えることをやる。
画面の遷移は、github見たいな動きを出きるような感じに
アニメーションも入れてみた。

テンプレートのファイル構成
view/template.php
view/welcome/画面A.php
view/welcome/画面B.php

controllerは、controller_templateを利用しているので、
側は、template.phpがやってくれて、
中身を画面A.phpと画面B.phpがやる。



でコントローラーはこんな感じ

controller




これで、いけるはず。


fuelphpでログ出力のmonologをちゃんと眺めてみる

2013-03-09 | php

20130522追記
fuelphp1.6になりここの仕様に変更が入ってます。
FuelPHP releases v1.6

monologはcomposerから直接インストールするように変わりました。Logパッケージは廃止され、CoreにLogクラスが復活しました。実質的な変更は、Logパッケージを明示的にロードしなくてもよくなったことだけです
@kenji_sさん指摘ありがとうございます


■monolog
--------------------------------------
fuelphp1.5からログ出力は monologってパッケージを利用している
monologっていろいろできるみたいで、PythonのLogbookに強く影響を受けている模様

monologって、独言って意味なんだ


■普通に使うのはかんたん
--------------------------------------
Log::info('hoge');

こんな感じで書くと、
fuel/xxx/fuel/app/logs/YYYY/MM/DD.php
に出力される。

※書き込み権限は気をつけておくこと
Log::XXXX();のXXXXは
DEBUG, INFO, WARNING, ERROR, CRITICAL, ALERT
この辺が利用できるから、適宜使えばいいや。
この辺は、どうでもいい

■monologをちゃんと利用するようにするには、configを下記のように指定する。
--------------------------------------
return array(
 'always_load'=>array(
   'packages'=>array(
   'orm',
   'log'
  )
 )
);

■とりあえず使ってみる
--------------------------------------
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
class Controller_Welcome extends Controller_Base
{
 public function action_index()
 {
  $log = new Logger('name');
  $log->pushHandler(new StreamHandler('出力先のパス', Logger::INFO));
  $log->addInfo('Foo');
  $log->addWarning('Foo');
  $log->addError('Bar');
 }
}

これで出力されるのは、
[2013-MM-DD HH:II:SS] name.INFO: Foo [] []
[2013-MM-DD HH:II:SS] name.WARNING: Foo [] []
[2013-MM-DD HH:II:SS] name.ERROR: Bar [] []
こんな感じになる。
$log->pushHandler(new StreamHandler('出力先のパス', Logger::INFO));
こんなかんじで定義しているが、Logger::INFOとあるのは、エラーログレベルがINFO
以上のものを出力するという定義になっている。
ファイルの書き込みが必要な際は、
use Monolog\Handler\StreamHandler;
とやればいいんだけど、monologはHandlerが沢山ある。


■ハンドラの種類
--------------------------------------
StreamHandler: いま使ったやつ
RotatingFileHandler: Logs records to a file and creates one logfile per day. It will also delete files older than $maxFiles. You should use logrotate for high profile setups though, this is just meant as a quick and dirty solution.
FirePHPHandler: FireBugの中にある、FirePHPに出力するハンドラ
ChromePHPHandler: ChromePHPに出力
MongoDBHandler: MongoDBに出力
NativeMailHandler: メール配信
SwiftMailerHandler: Swift_Mailerを利用してメール配信
PushoverHandler: Pushover API(なんだろこれ)を利用して携帯にアラート送信
SyslogHandler: syslogに書き出すっぽい.
GelfHandler: Graylog2に書き出す。これ面白そう!!
SocketHandler: UNIX and TCP socketsで書き出し
AmqpHandler: ジョブキューに書き出しっぽいな
CubeHandler: なんだろうこれ
CouchDBHandler: CouchDBに書出し
DoctrineCouchDBHandler: Doctrine CouchDB ODMを利用してCouchDBに書出し
RavenHandler: ravenを利用して、Sentry serverに書出し

何かめっちゃある。


■試しにハンドラ使ってみる - NativeMailHandler
--------------------------------------

メール送信するハンドラ

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\NativeMailerHandler;
class Controller_Welcome extends Controller_Base
{
 public function action_index()
 {
  $log = new Logger('name');
  $log->pushHandler(new StreamHandler('出力先のパス', Logger::INFO));
  $log->pushHandler(new NativeMailerHandler("To","from","タイトル",Logger::INFO));
  $log->addInfo('Foo');
  $log->addWarning('Foo');
  $log->addError('Bar');
 }
}

これで出来上がり

これでログ出力とメール送信が同時にできるし、pushHandlerの出力レベルをそれぞれ変えれば、ヤバそうな時だけメール送信を行うとかできる。
これは結構便利な気がするな


■試しにハンドラ使ってみる - ChromePHPHandler
--------------------------------------
まずは、ChromePHPを持ってくる
で、
use Monolog\Handler\ChromePHPHandler;
$log->pushHandler(new ChromePHPHandler());
$log->addInfo('Foo');
ってやると、'Foo'がChromeのコンソールログに反映される


ってやると、'Foo'がChromeのコンソールログに反映される
chrome phpについて



■ハンドラの振り返り
--------------------------------------
結構簡単。
ただ、ヘルプが全然無いから、monolog/Handler/配下のソースを読まないと
使い方分かんないや。

■Processors
--------------------------------------
なにやら、
IntrospectionProcessor: Adds the line/file/class/method from which the log call originated.
WebProcessor: Adds the current request URI, request method and client IP to a log record.
MemoryUsageProcessor: Adds the current memory usage to a log record.
MemoryPeakUsageProcessor: Adds the peak memory usage to a log record.
何かおもしろそうなことが出来そうな雰囲気


■Processorsを試しに使ってみる
--------------------------------------
use Monolog\Processor\IntrospectionProcessor;
use Monolog\Processor\WebProcessor;
use Monolog\Processor\MemoryUsageProcessor;
use Monolog\Processor\MemoryPeakUsageProcessor;
class Controller_Welcome extends Controller_Base
{
public function action_index()
{
  $log = new Logger('name');
  $log->pushHandler(new StreamHandler('ファイルのパス', Logger::INFO));
  $log->pushHandler(new ChromePHPHandler());
  $log->pushProcessor(new IntrospectionProcessor());
  $log->pushProcessor(new WebProcessor());
  $log->pushProcessor(new MemoryUsageProcessor());
  $log->pushProcessor(new MemoryPeakUsageProcessor());
  $log->addInfo('XXXXXXXXXXXXXXX');
 }
}
もりだくさん。


結果は・・・(実際は1行)


[2013-MM-DD HH:II:SS]
name.INFO: XXXXXXXXXXXXXXX []
{
 "memory_peak_usage":"1.75 MB", <=== MemoryPeakUsageProcessorの結果
 "memory_usage":"1.75 MB",  <==== MemoryUsageProcessor
 "url":"/zemi/", <=== WebProcessorの結果
 "ip":"XX.XX.XX.XX", <=== WebProcessorの結果
 "http_method":"GET", <=== WebProcessorの結果
 "server":"XXX.XX.jp", <=== WebProcessorの結果
 "referrer":"NULL", <=== WebProcessorの結果
 "file":"/fuel/app/classes/controller/welcome.php", <==== IntrospectionProcessorの結果
 "line":25,"class":"Controller_Welcome", <==== IntrospectionProcessorの結果
 "function":"action_index" <==== IntrospectionProcessorの結果
}
ふーん。おもろい
あとは、ログフォーマットとかハンドラの拡張とかできそうだけどいいや。


fuelphpのORMを利用してwhere inを作る

2013-03-07 | php
それらしいヘルプが無かったからおぼえがき
fuelphpのormの使い方が正直難しい・・・

where で inを実現してみる

$data = Model_xxxx::find('all', array(
  'where' => array(
     array('id','in',
       array(
          $a,
          $b,
          $c,
     )),
  ),
);
Log::error(print_r($data, true));

こんなかんじ。