cakePHPでsmartyviewを使うとsetFlash時に1が出力される理由は

追跡

  • htmlソースを見るとゴミが出てる
<div id="flashMessage" class="message">.....</div>1
smartyviewを使わないとゴミは出ない
smartyコンパイルはこうなってる
<?php echo $this->_tpl_vars['session']->flash(); ?>
cake/libs/view/helpers/session.php#130あたり
	function flash($key = 'flash') {
		if ($this->__active === true && $this->__start()) {
			if (parent::check('Message.' . $key)) {
				$flash = parent::read('Message.' . $key);

				if ($flash['layout'] == 'default') {
					if (!empty($flash['params']['class'])) {
						$class = $flash['params']['class'];
					} else {
						$class = 'message';
					}
					$out = '<div id="' . $key . 'Message" class="' . $class . '">' . $flash['message'] . '</div>';
				} elseif ($flash['layout'] == '' || $flash['layout'] == null) {
					$out = $flash['message'];
				} else {
					$view =& ClassRegistry::getObject('view');
					list($tmpLayout, $tmpVars, $tmpTitle) = array($view->layout, $view->viewVars, $view->pageTitle);
					list($view->layout, $view->viewVars, $view->pageTitle) = array($flash['layout'], $flash['params'], '');
					$out = $view->renderLayout($flash['message']);
					list($view->layout, $view->viewVars, $view->pageTitle) = array($tmpLayout, $tmpVars, $tmpTitle);
				}
				echo($out);
				parent::del('Message.' . $key);
				return true;
			}
		}
		return false;
	}
  • return true;をコメントすると1が出なくなる
  • return 'aaa'と書けばaaaが出力された

原因

対策

  • return true;をコメントアウトするか、echoをコメントしてreturn $out;とする
  • このメソッドをオーバーライドしたほうがよい
    • やりかたが分からなかった
  • 他の動作に影響を与えないと思われるがテストしてないからわからん

今回の対処

  • cake/libs/view/helpers/session.phpをapp/view/helpers/session.phpにコピー
  • 以下に修正
				//echo($out);
				parent::del('Message.' . $key);
				return $out;