tableGateway = $tableGateway;
}
public function select()
{
$select = $this->tableGateway->getSql()->select();
$select->where->like('col1', '%foo%');
}
...
でも。。
LIKE用のエスケープが無い。。。。
2時間探しても見つけられない。。。
そんな事は無いだろう。。。 でも無い。。。
そこは自作って事なのか。。
2013年9月19日木曜日
ZendFramework2 LIKE句の指定が可能になった
以前は対応していなかったLIKE検索がついに対応してくれてる~~。
2013年9月12日木曜日
ZendFramework2 Form の isValid でエラーメッセージは無いが false となる現象でハマる。。
まずは下記のような感じで書いてました。
$authは認証機能のmodelです。
$form = new LoginForm();
$form->setInputFilter($auth->getInputFilter());
if ($form->isValid()) {
var_dump('OK');
} else {
var_dump($form->getMessages());
}
症状は $form->isValid() の返り値はずっと false を返して、 $form->getMessages() は空っぽという何故。。 という状態でした。
で、LoginForm ファイルばっかり気にしてたんですが、原因は $auth->getInputFilter() でした。。
途中で消したElementがあったんですが、それが $auth->getInputFilter() の方では残っていましたので、これが原因でしたとさ。。
ZendFramework2 Validateのエラー文言を日本語化
今回はモジュール別ではなく全体で一先ずは日本語化したかったので、Application の onBootstrap で setDefaultTranslator を指定しました。
/module/Application/Module.php
下記は追記分だけを記載しています。上書きという意味では無いです。。 onBootstrap にデフォルト何が記載されていたのかを忘れたので。。class Module
{
public function onBootstrap(MvcEvent $e)
{
$sm = $e->getApplication()->getServiceManager();
\Zend\Validator\AbstractValidator::setDefaultTranslator($sm->get('translator'));
}
}
/module/Application/config/module.config.php
下記は追記分だけを記載しています。上書きという意味では無いです。。 onBootstrap にデフォルト何が記載されていたのかを忘れたので。。return array(
'translator' => array(
'locale' => 'ja_JP',
'translation_file_patterns' => array(
array(
'type' => 'gettext',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s.mo',
),
),
),
);
上記を下記のように追記
return array(
'translator' => array(
'locale' => 'ja_JP',
'translation_file_patterns' => array(
array(
'type' => 'gettext',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s.mo',
),
),
'translation_files' => array(
array(
'type' => 'phpArray',
'filename' => 'resources/languages/ja/Zend_Validate.php',
'locale' => 'ja_JP',
),
),
),
);
もしかして
'resources/languages/ja/Zend_Validate.php' が無い人は恐らくcomposer を利用してセットアップしていないせいかなと思いますので。 無ければ /vendor/zendframework/zendframework/resources を直接参照するかパスが通るようにコピーしたらOKです。2013年8月28日水曜日
ZendFramework2 モジュール毎の共通処理を追加
以前からモジュール毎のレイアウト指定については
http://developer.unlax.com/2012/11/modulelayout.html
などで、ちょこちょこ調べてたんですが、
今回もモジュール単位の共通処理を追加したくてちょっと調べました。
具体的にやりたかった事は
とりあえずはこんなところでした。
まずどのタイミングで指定するかなんですが、これは MvcEvent クラスの定数を確認。
すると、下記の7つがありました。
次に順番を確認すると
EVENT_BOOTSTRAP は今回 Module.onBoot() 内で確認したので、取れませんでした。
で、結局どうしたかと言うと1分の画面で違うレイアウトを指定はやっぱり
$this->layout('layout/layout2');
※詳しくは下記などを参考に
http://web-terminal.blogspot.jp/2013/03/layoutpluginzendframework2zf2.html
のよう指定できるようにはしておきたいので、
「基本レイアウト指定」については MvcEvent::EVENT_ROUTE でやりました。
MvcEvent::EVENT_DISPATCH でやってるサンプルも見ましたが、それだと上記の指定時にちょっと処理入れないとダメなので。。
で、「404エラー時のレイアウト指定」については MvcEvent::EVENT_DISPATCH_ERROR でステータスコードをチェックしてやりました。
http://developer.unlax.com/2012/11/modulelayout.html
などで、ちょこちょこ調べてたんですが、
今回もモジュール単位の共通処理を追加したくてちょっと調べました。
具体的にやりたかった事は
- 基本レイアウト指定
- 404エラー時のレイアウト指定
とりあえずはこんなところでした。
まずどのタイミングで指定するかなんですが、これは MvcEvent クラスの定数を確認。
すると、下記の7つがありました。
- MvcEvent::EVENT_BOOTSTRAP
- MvcEvent::EVENT_DISPATCH
- MvcEvent::EVENT_DISPATCH_ERROR
- MvcEvent::EVENT_FINISH
- MvcEvent::EVENT_RENDER
- MvcEvent::EVENT_RENDER_ERROR
- MvcEvent::EVENT_ROUTE
通常の時
- route
- dispatch
- render
- finish
エラー(404)の時
- dispatch.error
- render
- finish
EVENT_BOOTSTRAP は今回 Module.onBoot() 内で確認したので、取れませんでした。
で、結局どうしたかと言うと1分の画面で違うレイアウトを指定はやっぱり
$this->layout('layout/layout2');
※詳しくは下記などを参考に
http://web-terminal.blogspot.jp/2013/03/layoutpluginzendframework2zf2.html
のよう指定できるようにはしておきたいので、
「基本レイアウト指定」については MvcEvent::EVENT_ROUTE でやりました。
MvcEvent::EVENT_DISPATCH でやってるサンプルも見ましたが、それだと上記の指定時にちょっと処理入れないとダメなので。。
で、「404エラー時のレイアウト指定」については MvcEvent::EVENT_DISPATCH_ERROR でステータスコードをチェックしてやりました。
サンプル
Module.php
<?php
namespace Application;
use Zend\Mvc\MvcEvent;
class Module
{
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
$eventManager->attach(MvcEvent::EVENT_ROUTE, array($this, 'setLayout'));
$eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'setErrorLayout'));
}
public function setLayout($e)
{
$matches = $e->getRouteMatch();
$controller = $matches->getParam('controller');
if (0 !== strpos($controller, __NAMESPACE__ .'\\')) {
return;
}
$e->getViewModel()->setTemplate(strtolower(__NAMESPACE__) . '/layout/layout');
}
public function setErrorLayout($e)
{
$response = $e->getResponse();
if ($response->getStatusCode() == 404) {
$e->getViewModel()->setTemplate(strtolower(__NAMESPACE__) . '/error/404');
return;
}
}
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
}
Application/config/module.config.php
上記修正により 'layout/layout' では通らなくなったので、'application/layout/layout' に変更。 'view_manager' => array(
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => array(
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
),
'template_path_stack' => array(
__DIR__ . '/../view',
),
),
↓↓↓↓↓↓↓
'view_manager' => array(
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => array(
'application/layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
'application/error/404' => __DIR__ . '/../view/error/404.phtml',
'application/error/index' => __DIR__ . '/../view/error/index.phtml',
),
'template_path_stack' => array(
__DIR__ . '/../view',
),
),
Mod2/config/module.config.php
mod2/layout/layout ファイル名はモジュール毎に用意デフォルトを用意するという事で、 mod2 の module.config.php を編集しました。 'view_manager' => array(
'template_map' => array(
'mod2/layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
'mod2/error/404' => __DIR__ . '/../view/error/404.phtml',
),
'template_path_stack' => array(
'admin' => __DIR__ . '/../view',
),
),
2013-08-24 追記
上記の方法ダメでした。。
ちょっと各モジュール毎のModule.phpの動きを勘違いしていました。。
という事で config には上記の用に 'mod2/layout/layout' を追記しておきsetTemplateはコントローラー毎に onDispatch を上書きする事にしました。
モジュール毎に共通化するなら継承用のクラスを用意してそこに onDispatch を記述するかですかね。。
ついでに謎になったのが、アクションが無いってエラーとその他の404系は違う扱いなんですね。。
というかアクセスした Module.php だけ読み込んでくれたらいいのにな。。
以下サンプル。
return parent::onDispatch($e);
内でアクション内の処理が実行されるので、それより前に書いておけばアクション内で指定するもので上書きされるので、
一部だけレイアウト指定した時に意識する必要は無いです。
IndexController.php
public function onDispatch(MvcEvent $e)
{
$e->getViewModel()->setTemplate('mod2/layout/layout');
return parent::onDispatch($e);
}
2013年7月24日水曜日
Word Press に公開期限機能を追加
まずは「Simple expires」を追加してみたが、期限設定する事がデフォルトになっていたので、別のを探してみたで、「Post Expirator」を入れてみた。
どうやらこちらの方が知名度は高い様子。
でも9時間の時差が発生してしまうなどの問題があるという記載も見たけど、これはPHPのタイムゾーンが設定されてない事が原因なようで、
http://mekemoke.jp/2012/09/63.html
を見るとfunction.phpに追記して解決する様子。
※今回の環境では対応の必要は無しでした。
「Post Expirator」の方が高機能でもちろんデフォルトは期限無しなので、良い感じでした。
日本語ではなかったですが、これも
http://mekemoke.jp/2012/09/63.html
どうやらこちらの方が知名度は高い様子。
でも9時間の時差が発生してしまうなどの問題があるという記載も見たけど、これはPHPのタイムゾーンが設定されてない事が原因なようで、
http://mekemoke.jp/2012/09/63.html
を見るとfunction.phpに追記して解決する様子。
※今回の環境では対応の必要は無しでした。
「Post Expirator」の方が高機能でもちろんデフォルトは期限無しなので、良い感じでした。
日本語ではなかったですが、これも
http://mekemoke.jp/2012/09/63.html
で辞書ファイルが提供されていたので、一先ずはこれで十分。
登録:
投稿 (Atom)