[Cakephp2]CakeShellの俺氏用テンプレ

クーロンジョブに登録して一括メール送信とかに使うパティーンのコード

app/Console/Command/SampleShell.php とかで保存

<?php
//テキトーに書いたので動きません。
//こんな感じってのをつかむ用のコード
App::uses('CakeEmail', 'Network/Email');
class SampleShell extends AppShell {
	// tables
	public $uses = array('Order');
	public function main() {
 
		$data = $this->Order->find('all', 'conditions' => array(/* コンディション書いちゃいなよ */));
		foreach($data as $one) {
			$Email = new CakeEmail('default');
			$Email->template('reminder', 'default');
			$Email->subject('さむしんぐらいく るーてぃーん');
			$Email->to($one['User']['email']);
			$Email->viewVars(array(
				'name' => $one['User']['name'],
				'product' => $one['Product']['name']));
			$Email->send();
		}
 
		$this->out('Fin.');
	}
}

参考

Console and Shells
Running Shells as cronjobs

PhantomJS で サーバーサイドHTMLキャプチャー(ブラウザサイズ指定、オフセット指定、レクタングルサイズ指定、ズーム指定)

PhantomJS

サーバーサイドはコマンド実行できれば何の言語でも問題ないです。

たとえばPHPで

php

<?php
 $imageName = exec("/usr/local/bin/phantomjs ./js/capture.js $target $filename $browser_width $browser_height $offset_x $offset_y $rectangle_x $rectangle_y $zoom $is_all");
 echo "<img src='{$imageName}' />";

capture.js

var system = require('system');
var page = require('webpage').create();
 
var filename = 'output/' + system.args[2];
 
page.viewportSize = { width: system.args[3], height: system.args[4] };
if (system.args[10] != 'true') {
 // setting : capture offset, rectangle size
 page.clipRect = { top: system.args[6], left: system.args[5], width: system.args[7], height: system.args[8] };
}
// setting zoom
page.zoomFactor = (system.args[9] / 100);
 
page.open(system.args[1], function() {
  page.render(filename);
  console.log(filename);
  phantom.exit();
});

パラメーターは想像してください。

[Cakephp2]APCから見るCakePHP 2.4.3で毎回参照される33のファイル

当然、設定にもよりますが、現在開発中の環境では以下の通り

lib上の主要なファイル&ユーザ領域にあるけどcoreなファイルといった印象。
bootstrap.phpが二つあったりするのはその関係です。

暇があったらソースを眺めても良いなと思った次第。

  • *hidden*/bootstrap.php
  • *hidden*/basics.php
  • *hidden*/String.php
  • *hidden*/ObjectCollection.php
  • *hidden*/Inflector.php
  • *hidden*/Hash.php
  • *hidden*/Debugger.php
  • *hidden*/CacheDispatcher.php
  • *hidden*/AssetDispatcher.php
  • *hidden*/DispatcherFilter.php
  • *hidden*/Dispatcher.php
  • *hidden*/CakeResponse.php
  • *hidden*/CakeRequest.php
  • *hidden*/LogEngineCollection.php
  • *hidden*/FileLog.php
  • *hidden*/BaseLog.php
  • *hidden*/CakeLogInterface.php
  • *hidden*/CakeLog.php
  • *hidden*/CakeEventManager.php
  • *hidden*/CakeEventListener.php
  • *hidden*/CakeEvent.php
  • *hidden*/exceptions.php
  • *hidden*/ErrorHandler.php
  • *hidden*/Configure.php
  • *hidden*/CakePlugin.php
  • *hidden*/App.php
  • *hidden*/FileEngine.php
  • *hidden*/ApcEngine.php
  • *hidden*/CacheEngine.php
  • *hidden*/Cache.php
  • *hidden*/index.php
  • *hidden*/core.php
  • *hidden*/bootstrap.php

[CakePHP2]hasManyの子の取得条件を適宜設定する方法

よくある話だと思いますが、
日時が絡むなどで、クエリーの度に取得条件が変化する場合の対応

find投げる前にモデルオプジェクトのhasmany設定を書き換えればよい

$start_day = '2013-12-04';
$end_day = '2014-01-04';
$this->Reserve->Option->hasMany['Reserve']['conditions'] = array('end_day >' => $start, 'start_day <=' => $end, 'deleted' => null);
$options = $this->Reserve->Option->find('all', array('fields' => array('Option.*', 'OptionGroup.name'), 'order' => array('option_group_id', 'id')));

hasManyはクエリーが分けて投げられるため、ベースのfindに条件を入れてもエラーとなります。
なので、ベースのモデルのhasManyのconditionsに設定しましょうというお話です。

CakePHPの理解を深めるには、
オブジェクトの生成タイミングと動作パラメータの設定タイミングを理解したら良いという事に気付いた昨今でした。

1 2 3 4 5 6 12