/** * appinfo * * <pre> * appinfo(app.ymlの['core']['info'])の値を出力します。テンプレート生成時のみ動作します。 * </pre> * * @category BEAR * @package BEAR_Smarty * @subpackage Plugin * @author Akihito Koriyama <*****@*****.**> * @copyright 2008-2011 Akihito Koriyama All rights reserved. * @license http://opensource.org/licenses/bsd-license.php BSD * @version SVN: Release: @package_version@ $Id:$ * @link http://www.bear-project.net/ * * @param string $tagArg * @param Smarty &$smarty Smarty object * * @return string */ function smarty_compiler_appinfo($tagArg, &$smarty) { static $app = array(); if (!$app) { $app = BEAR::get('app'); } return 'echo \'' . "{$app['core']['info'][$tagArg]}" . '\';'; }
/** * Constructor * * @param array $config * * @see http://jp.php.net/manual/ja/function.Apc-addserver.php * @throws BEAR_Cache_Exception */ public function __construct(array $config) { parent::__construct($config); $app = BEAR::get('app'); $this->_config['info'] = $config['info']; if (!extension_loaded('apc') || !ini_get('apc.enabled') || !function_exists('apc_sma_info')) { throw new BEAR_Cache_Exception('APC extention is not loaded'); } else { if ($this->_config['debug']) { $apcSmaInfo = apc_sma_info(); BEAR::dependency('BEAR_Log')->log('APC', $apcSmaInfo); } } }
public static function onAutoload($class) { static $growlApp; BEAR::onAutoload($class); $ref = new ReflectionClass($class); $file = $ref->getFileName(); if (!$growlApp) { $growlApp = new Net_Growl_Application(__CLASS__, array("Growl_Notify")); } $growl = Net_Growl::singleton($growlApp, null, null); $growl->setNotificationLimit(16); if (BEAR::exists($class)) { $config = BEAR::get($class)->getConfig(); } $growl->notify("Growl_Notify", $class, $class); }
/** * Pullリソース * * <pre> * * Example * </pre> * <code> * {resource uri='Entry' params=$entryParams tepmplate="resource/entry"} * </code> * * @category BEAR * @package BEAR_Smarty * @subpackage Plugin * @author Akihito Koriyama <*****@*****.**> * @copyright 2008-2011 Akihito Koriyama All rights reserved. * @license http://opensource.org/licenses/bsd-license.php BSD * @version SVN: Release: @package_version@ $Id:$ * @link http://www.bear-project.net/ * * @param mixed $params * @param Smarty &$smarty * * @return mixed $resource */ function smarty_function_resource($params, &$smarty) { $config = (array) BEAR::loadValues($params['params']) + array('method' => 'read', 'uri' => $params['uri'], 'values' => array(), 'options' => array()); if (isset($params['template'])) { $config['options']['template'] = $params['template']; } if (isset($params['cache_life'])) { $config['options']['cache']['life'] = $params['cache_life']; } if (isset($params['cache_key'])) { $config['options']['cache']['key'] = $params['cache_key']; } $app = BEAR::get('app'); $string = BEAR::factory('BEAR_Ro_Prototype', array('request' => $config, 'path' => $app['BEAR_View']['path']))->request()->toString(); return $string; }
/** * Inject * * 操作によってDBオブジェクトを変更します * read操作はdsnをslaveに、DBページャーを利用可能に。 * その他操作はdsnをdefaultに、トランザクション可能にしExtendedモジュール読み込みます * * @return void */ public function onInject() { $app = BEAR::get('app'); $options['default_table_type'] = 'INNODB'; if ($this->_config['method'] === 'read') { $dsn = $app['App_Db']['dsn']['slave']; $config = array('dsn' => $dsn, 'options' => $options); $this->_db = BEAR::factory('BEAR_Mdb2', $config); $this->_queryConfig = array('db' => $this->_db, 'ro' => $this, 'table' => $this->_table, 'pager' => 0, 'options' => array('accesskey' => true)); } else { $dsn = $app['App_Db']['dsn']['default']; $options['use_transactions'] = true; $config = array('dsn' => $dsn, 'options' => $options); $this->_db = BEAR::factory('BEAR_Mdb2', $config); $this->_db->loadModule('Extended'); $this->_queryConfig = array('db' => $this->_db, 'ro' => $this, 'table' => $this->_table); } }
/** * プロファイリングストップ * * プロファイラーリンクの表示します * * @return void */ public static function stop() { static $done = false; if ($done !== false) { return; } $done = true; $xhprofData = xhprof_disable(); $app = BEAR::get('app'); $appName = $app['core']['info']['id']; // アプリ名とか識別する名前 include_once _BEAR_BEAR_HOME . '/BEAR/vendors/xhprof_lib/utils/xhprof_lib.php'; include_once _BEAR_BEAR_HOME . '/BEAR/vendors/xhprof_lib/utils/xhprof_runs.php'; $xhprofRuns = new XHProfRuns_Default(); $runId = $xhprofRuns->save_run($xhprofData, $appName); $href = "/__bear/prof/index.php?run={$runId}&source={$appName}"; echo '<a style="padding: 3px; background-color: red; color: white; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: bold; font-size: 8pt; " name="" target="_blank"' . $appName . '" href="' . $href . '"">PROFILE</a>'; }
/** * JSON出力 * * @param array $values 値 * @param array $options オプション * * @return BEAR_Ro */ function outputAjax($values, array $options) { $ajax = BEAR::get('BEAR_Page_Ajax'); $values = $ajax->getAjaxValues(); // $body = json_encode($values); // Services_JSONの方が信頼性が高いため採用 $json = new Services_JSON(); $body = $json->encode($values); $log = BEAR::dependency('BEAR_Log'); /* @var $log BEAR_Log */ $log->log('AJAX', $values); $headers = array('X-BEAR-Output: AJAX' => 'Content-Type: text/javascript+json; charset=utf-8'); $ro = BEAR::factory('BEAR_Ro'); /* @var $ro BEAR_Ro */ $ro->setBody($body); $ro->setHeaders($headers); return $ro; }
/** * サブミット処理 * * エージェントの設定に応じてサブミットされた$_POSTまたは$_GETの文字列を * 絵文字エンティティや文字コード変換をします。 * * @return void * @internal グローバル変数を直接変更してるのはそれに依存してるHTML_Quickformなどのライブラリのためです */ public function submit() { static $done = false; $hasSubmit = isset($_POST['_token']) || isset($_GET['_token']) ? true : false; if (!$hasSubmit && $done) { return; } if (isset($_POST['_token'])) { $input =& $_POST; } elseif (isset($_GET['_token'])) { $input =& $_GET; } else { return; } $done = true; $app = BEAR::get('app'); $emojiSubmit = isset($app['BEAR_Emoji']['submit']) ? $app['BEAR_Emoji']['submit'] : 'pass'; switch ($emojiSubmit) { // 何もしない case 'pass': break; case 'entity': // 絵文字をエンティティに変換 // 3GCsエンコード変換必須 if ($this->_config['is_mobile']) { array_walk_recursive($input, array('BEAR_Emoji', 'onEntityEmoji'), BEAR::dependency('BEAR_Emoji')); } break; // 絵文字除去 // 絵文字除去 case 'remove': array_walk_recursive($input, array('BEAR_Emoji', 'removeEmoji'), BEAR::dependency('BEAR_Emoji')); break; default: trigger_error('Illigal $this->_config[\'agent\'] error', E_USER_WARNING); break; } // UTF8に文字コード変換 if (isset($this->_config['input_encode'])) { array_walk_recursive($input, array(__CLASS__, 'onUTF8'), $this->_config['input_encode']); } }
/** * 初期化 * * @return void */ public function onInit(array $args) { $q = $args['q']; $argv = explode(' ', $q); switch (true) { case $q == 'help': $help = <<<END Commands: clear clear screen config show application configulation. info show server info. bear bear command, type bear -h for more info. END; $this->_ajax->addAjax('js', array('shell' => "<pre>{$help}</pre>")); break; case $q == 'clear': $this->_ajax->addAjax('js', array('clear' => '')); break; case $q == 'config': $app = BEAR::get('app'); $info = '<strong>app<strong><br />' . print_a($app, 'return:1'); $this->_ajax->addAjax('js', array('shell' => $info)); break; case $q == 'info': $info = '<strong>$_SERVER<strong><br />'; $info .= print_a($_SERVER, 'return:1'); $info .= '<strong>$_ENV<strong><br />'; $info .= print_a($_ENV, 'return:1'); $info .= '<strong>$_COOKIE<strong><br />'; $info .= print_a($_COOKIE, 'return:1'); $this->_ajax->addAjax('js', array('shell' => $info)); break; case isset($argv[0]) && $argv[0] === 'bear': //bearコマンド $this->_shell($argv); break; default: $this->_ajax->addAjax('js', array('shell' => "BEAR: {$argv[0]}: Command not found<br/>")); break; } }
/** * プロファイリングストップ * * プロファイラーリンクの表示します * * @param int $type 0:xhprof 1:xh gui * * @return void */ public static function stop($type = 0) { $xhprof_data = xhprof_disable(); $isAjax = BEAR::dependency('BEAR_Page_Ajax')->isAjaxRequest(); if ($isAjax === true || PHP_SAPI === 'cli') { return; } $xhprofRuns = new XHProfRuns_Default(); if (BEAR::exists('app')) { $app = BEAR::get('app'); $appName = $app['core']['info']['id']; } else { $appName = 'bear.app'; } $baseHref = self::$_profilerInfo[$type]['href']; $runId = $xhprofRuns->save_run($xhprof_data, $appName); $href = "{$baseHref}/index.php?run={$runId}&source={$appName}"; $link = '<br><a style="padding: 3px; background-color: red; color: white; font-family:'; $link .= 'Verdana; font-style: normal; font-variant: normal; font-weight: bold; font-size: 8pt;'; $link .= ' " name="" target="_blank" href="' . $href . '"">' . self::$_profilerInfo[$type]['label'] . '</a>'; echo $link; }
/** * インジェクタ * * <pre> * 操作によってDBオブジェクトを変更します * * read操作はdsnをslaveに、DBページャーを利用可能に。 * その他操作はdsnをdefaultに、トランザクション可能にしExtendedモジュール読み込みます * </pre> */ public function onInject() { $app = BEAR::get('app'); assert(is_string($app['App_Db']['dsn']['default'])); assert(is_string($app['App_Db']['dsn']['slave'])); assert(isset($this->_config['method'])); $options['default_table_type'] = 'INNODB'; if ($this->_config['method'] === 'read') { $dsn = $app['App_Db']['dsn']['slave']; $config = array('dsn' => $dsn, 'options' => $options); $this->_db = BEAR::factory('BEAR_Mdb2', $config); $this->_queryConfig = array('db' => &$this->_db, 'ro' => &$this, 'table' => $this->_table, 'pager' => 0, 'perPage' => 10, 'options' => array('accesskey' => true)); } else { $dsn = $app['App_Db']['dsn']['default']; $options['use_transactions'] = true; $config = array('dsn' => $dsn, 'options' => $options); $this->_db = BEAR::factory('BEAR_Mdb2', $config); $this->_db->loadModule('Extended'); $this->_queryConfig = array('db' => &$this->_db, 'ro' => &$this, 'table' => $this->_table); } // すべてのフィールド識別子が SQL 文中で自動的にクォート $this->_db->setOption('quote_identifier', true); }
/** * リソーステンプレートをRoにセット * * リクエストにテンプレートオプションが指定されているとHTML等文字列化してRoに保持します。 * * @return void * @todo リソースボディのキャッシュはUA共通に */ protected function _setHtml($isLinked) { // キャッシュ? $isLinkCache = isset($this->_config['request']['options']['cache']['link']) && $this->_config['request']['options']['cache']['link']; if ($isLinked && $isLinkCache === true) { $life = $this->_config['request']['options']['cache']['life']; } elseif (!$isLinked && isset($this->_config['request']['options']['cache']['life']) && isset($this->_config['request']['options']['template'])) { $life = $this->_config['request']['options']['cache']['life']; } else { $life = false; } if ($life !== false) { // キャッシュ読み込み $cache = BEAR::dependency('BEAR_Cache')->setLife($life); $pagerKey = isset($_GET['_start']) ? $_GET['_start'] : ''; $ua = BEAR::get('page')->getConfig('ua'); $cacheKey = $ua . md5(serialize($this->_config['request']) . "-{$pagerKey}"); $saved = $cache->get($cacheKey); if ($saved) { $this->_ro = $saved; return; } else { $useCache = true; } } //実リクエスト $body = $isLinked !== true ? $this->_ro->getBody() : $this->getLinkedBody(); $this->_ro->setBody($body); if ($isLinked === true) { $this->_ro->setHeader('_linked', $this->_chainLink); } // テンプレート適用 $html = isset($this->_config['request']['options']['template']) ? $this->_getHtml($body) : false; if ($html !== false) { $this->_ro->setHtml($html); } // キャッシュ書き込み if (isset($useCache)) { $roContainer = new BEAR_Ro_Container($this->_ro); $cache->set($cacheKey, $roContainer); } }
/** * ステータスを表示 * * @param string $msg メッセージ * @param string $color カラー * * @return void */ public static function printStatus($msg, $color = '#dddddd"') { $app = BEAR::get('app'); if ($app['core']['debug'] !== true) { return; } static $y = 0; echo '<div name="name!" style="font-size: 9px; position: absolute;'; echo " top: {$y}px; left: 0px; text-align: left padding:"; echo '5px 3px 3px 3px;background-color:orange;color:white;'; echo "border: 1px solid {$color}\">{$msg}</div>"; $y += 20; }
/** * Constructor * * @param array $config */ public function __construct(array $config) { $app = BEAR::get('app'); $class = get_class($this); if (isset($app[$class])) { $config = array_merge($app[$class], $config); } $this->_config = (array) $config; }
/** * セッションスタート * * @return void */ protected function _sessionStart() { $app = BEAR::get('app'); // セッションスタート if ($this->_config['enable_ua_sniffing'] === true) { $adapterConfig = $this->_agent->adapter->getConfig(); if ($adapterConfig['enable_session'] && $app['BEAR_Session']['adapter'] != 0) { BEAR::dependency('BEAR_Session')->start(); } } elseif ($app['BEAR_Session']['adapter'] != 0) { BEAR::dependency('BEAR_Session')->start(); } }
/** * HTML表示 * * onInit()でセットされたリソース結果をHTML出力します。 * * @param string $tplName テンプレート名 * @param array $options オプション * * @return void * @internal $this->_config['mode']がself::CONFIG_MODE_HTMLでないときはunit test用にHTTP出力されません。 */ public function display($tplName = null, array $options = array()) { if (BEAR::exists('pager')) { $pager = (array) BEAR::get('pager'); $this->set('pager', $pager); } $this->_pageRo = $this->_viewAdapter()->display($tplName, $options); // add page BEAR_Page_Hedaers header $pageHeaders = (array) BEAR::dependency('BEAR_Page_Header')->getHeaders(); $roHeaders = $this->_pageRo->getHeaders(); $headers = array_merge($roHeaders, $pageHeaders); $this->_pageRo->setHeaders($headers); $this->_outputHttp($this->_pageRo); }
/** * リソースリクエスト * * @return BEAR_Ro * @throws Exception Ro内部で発生した例外 */ public function request() { $uri = $this->_config['uri']; $values = $this->_config['values']; $options = $this->_config['options']; // URIのクエリーと$valuesをmerge $parse = parse_url($uri); if (!isset($parse['scheme'])) { $this->_mergeQuery($uri, $values); } $isNotRead = $this->_config['method'] !== BEAR_Resource::METHOD_READ; if (!$isNotRead) { $hasCsrfOption = false; } elseif (isset($options[BEAR_Resource::OPTION_CSRF]) && $options[BEAR_Resource::OPTION_CSRF] === true) { // リソースリクエストオプション $hasCsrfOption = true; } elseif ($this->_config[BEAR_Resource::OPTION_CSRF] === true) { // yaml $hasCsrfOption = true; } else { $hasCsrfOption = false; } if (!$isNotRead) { $hasPoeOption = false; } elseif (isset($options[BEAR_Resource::OPTION_POE]) && $options[BEAR_Resource::OPTION_POE] === true) { // リソースリクエストオプション $hasPoeOption = true; } elseif ($this->_config[BEAR_Resource::OPTION_POE] === true) { // yaml $hasPoeOption = true; } else { $hasPoeOption = false; } if ($hasCsrfOption || $hasPoeOption) { $formToken = BEAR::dependency('BEAR_Form_Token'); /* @var $formToken BEAR_Form_Token */ $isTokenCsrfValid = $hasCsrfOption ? $formToken->isTokenCsrfValid() : true; if ($isTokenCsrfValid !== true) { throw $this->_exception('CSRF'); } $isTokenPoeValid = $hasPoeOption ? $formToken->isTokenPoeValid() : true; if ($isTokenPoeValid !== true) { $headers = array('request config' => $this->_config, 'msg' => 'invalid token'); $code = BEAR::CODE_BAD_REQUEST; $config = compact('headers', 'code'); $ro = BEAR::factory('BEAR_Ro', $config); $ro->setConfig('uri', $uri); $ro->setConfig('values', $values); $ro->setConfig('options', $options); return $ro; } else { $formToken->newSessionToken(); } } $config = $this->_config; $config['uri'] = $uri; $config['values'] = $values; $resourceRequestCache = BEAR::factory('BEAR_Resource_Request_Cache', $config); try { $ro = $resourceRequestCache->request(); // 中で例外が発生しなかったらPOEオプションで使ったトークンを使用済みにマークする // @todo staticコールを廃止 // BEAR_Form::finishTokens(); /* @todo 下のifブロックを置き換える $isOkRo = ($ro instanceof BEAR_Ro && $ro->getCode() === BEAR::CODE_OK); $isNotRo = ($ro instanceof BEAR_Ro === false); if (!$isOkRo && $isNotRo) { $body = $ro; $ro = BEAR::factory('BEAR_Ro'); $ro->setBody($body); } */ if ($ro instanceof BEAR_Ro && $ro->getCode() === BEAR::CODE_OK) { // $options ポストプロセスクラス } elseif ($ro instanceof BEAR_Ro === false) { $body = $ro; $ro = BEAR::factory('BEAR_Ro'); $ro->setBody($body); } $request = "{$this->_config['method']} {$uri}" . ($values ? '?' . http_build_query($values) : ''); self::_actionPostProcess($ro); } catch (Exception $e) { if (get_class($e) === 'Panda_Exception') { // HTTPエラー画面 Panda::onException($e); throw $e; } if (BEAR::exists('page')) { $page = BEAR::get('page'); if (method_exists($page, 'onException')) { $page->onException($e); } } if ($this->_config['debug']) { $info = method_exists($e, 'getInfo') ? $e->getInfo() : ''; Panda::error(get_class($e), $e->getCode() . ' ' . $e->getMessage(), $info); } //エラー (400=bad requset, or 500=server error $trace = $e->getTrace(); $refTrace =& $trace; $trace = array_shift($refTrace); if (isset($trace['args'])) { $args = $trace['args']; } else { $args = ''; } $headers = array(); $exception = array('class' => get_class($e), 'msg' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()); $headers['_exception'] = $exception; if (method_exists($e, 'getInfo')) { $headers['_info'] = $e->getInfo(); } $ro = BEAR::factory('BEAR_Ro'); $ro->setHeaders($headers)->setCode($e->getCode()); } if ($this->_config['debug']) { BEAR::dependency('BEAR_Ro_Debug', $this->_config)->debugShowResource($ro); } return $ro; }
/** * BEARバッジ表示 * * <pre> * エラー状態を表し、__bearページにリンクするデバック時に * 画面右上に現れる「BEARバッジ」を表示します。 * * ページの状態によって色が変わります。 * </pre> * <ur> * <li>赤 Fatal, PEARエラーなど</li> * <li>黄 Warningレベルのエラーはあり</li> * <li>青 noticeは出てる</li> * <li>緑 noticeも出てない</li> * </url> * * @return string */ public static function onOutpuHtmlDebug($html) { $ua = BEAR::dependency('BEAR_Agent')->getUa(); $hasResource = BEAR::factory('BEAR_Ro_Debug')->hasResourceDebug(); $app = BEAR::get('app'); if (!$app['core']['debug']) { return; } // エラー統計 $errorFgColor = "white"; $errors = Panda::getAllErrors(); $errorStat = Panda::getErrorStat(); $errorMsg = implode("\n", $errors); if ($errorStat & E_ERROR || $errorStat & E_USER_ERROR || $errorStat & E_RECOVERABLE_ERROR) { $errorBgColor = "red"; $errorMsg = "Fatal Error: {$errorMsg}"; $bear = "BEAR - Error"; } elseif ($errorStat & E_WARNING || $errorStat & E_USER_WARNING) { $errorBgColor = "yellow"; $errorFgColor = "black"; $errorMsg = "WARNING: {$errorMsg}"; $bear = "BEAR - Warning"; } elseif ($errorStat & E_NOTICE || $errorStat & E_USER_NOTICE) { $errorBgColor = "#2D41D7"; $errorMsg = "NOTICE: {$errorMsg}"; $bear = "BEAR"; } else { $errorBgColor = "green"; $errorMsg = "{$errorMsg}"; $bear = "BEAR"; } // デバック情報表示HTML // bear.jsを使用する場合はbear_debuggingがtrueになる if (file_exists(_BEAR_APP_HOME . '/htdocs/__edit')) { $editHtml = '<a href="/__edit/?id=@@@log_id@@@"'; $editHtml .= ' class="bear_page_edit" style="padding:5px 3px 3px 3px;background-color: gray'; $editHtml .= ';color:white; font:bold 8pt Verdana;'; $editHtml .= 'border: 1px solid #dddddd">EDIT</a>'; } else { $editHtml = ''; } // リソースBoxリンク $color = "blue"; $res = array(); if (!isset($_GET['_resource'])) { $mode = 'box'; $title = "Resource Box"; $color = "grey"; } elseif ($_GET['_resource'] == 'box') { $mode = 'body'; $title = "Resource Body"; } elseif ($_GET['_resource'] == 'body') { $mode = 'html'; $title = "Resource HTML"; } else { $mode = false; $title = "No Resource Box"; } $currentMode = isset($_GET['_resource']) ? $_GET['_resource'] : 'none'; $res = $mode ? array('_resource' => $mode) : array(); unset($_GET['_resource']); $resourceBoxUrl = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) . '?' . http_build_query(array_merge($_GET, $res)); $budgeHtml = '<div id="bear_badge">'; $budgeHtml .= $editHtml; if ($hasResource === true) { $budgeHtml .= '<a href="' . $resourceBoxUrl . '" class="bear_resource_' . $currentMode . '" title="' . $title . '">RES</a>'; } $budgeHtml .= '<a href="/__bear/?id=@@@log_id@@@" class="bear_badge" title="'; $budgeHtml .= $errorMsg . '" style="background-color:' . $errorBgColor; $budgeHtml .= ';color:' . $errorFgColor . ';'; $budgeHtml .= '">' . $bear . '</a><a href="?_bearinfo" class="bear_info">i</a></div>'; $budgeHtml = str_replace('</body>', "{$budgeHtml}" . '<link rel="stylesheet" href="/__bear/css/debug.css" type="text/css">' . "</body>", $html); return $budgeHtml; }
/** * フォームレンダリング * * @param Smarty &$smarty Smartyオブジェクト * @param string $ua UAコード * @param bool $enableJs JS有効? * * @return string */ public static function renderForms(Smarty &$smarty, $ua, $enableJs = false) { static $result = false; static $done = false; if ($done === true) { return $result; } $removeJs = !$enableJs; $done = true; $result = array(); foreach (self::$formNames as $formName) { $renderConfig = self::$_renderConfig[$formName]; $adapter = isset($renderConfig['adapter']) ? $renderConfig['adapter'] : self::RENDERER_APP; $form = BEAR::get('BEAR_Form_' . $formName); $formErrors = false; $callback = isset($renderConfig['callback']) && is_callable($renderConfig['callback'], false) ? $renderConfig['callback'] : false; switch ($adapter) { case self::RENDERER_APP: // DHTMLRulesTablelessレンダラ // 単数フォーム(App_Form_Renderer_優先) try { $renderer = BEAR::dependency('App_Form_Renderer_' . $ua); } catch (BEAR_Exception $e) { $renderer = BEAR::dependency('BEAR_Form_Renderer_' . $ua); } catch (Excption $e) { throw $e; } assert(is_object($renderer)); if ($callback) { call_user_func($callback, $renderer); } $form->accept($renderer); // 完全なXHTML1.1に $form->removeAttribute('name'); $formValue = $renderer->toHtml(); $formErrors = $form->_errors; break; case self::RENDERER_DHTML_TABLELESS: // DHTMLRulesTablelessレンダラ // 単数フォーム $renderer = new HTML_QuickForm_Renderer_Tableless($form); // onblur有効 $form->getValidationScript(); $form->accept($renderer); // 完全なXHTML1.1に $form->removeAttribute('name'); if ($callback) { call_user_func($callback, $renderer); } $formValue = $renderer->toHtml(); $formErrors = $form->_errors; break; case self::RENDERER_SMARTY_ARRAY: default: // HTML_QuickForm_Renderer_ArraySmartyレンダラ // フォーム描画 $renderer = new HTML_QuickForm_Renderer_ArraySmarty($smarty); $renderer->setRequiredTemplate(self::$requireTemplate); $renderer->setErrorTemplate(self::$errorTemplate); if ($callback) { call_user_func($callback, $renderer); } $form->accept($renderer); $formValue = $renderer->toArray(); break; } // エラーサマリー if (is_array($formErrors) && $formErrors && isset(self::$_renderConfig[$formName]['errors']) && self::$_renderConfig[$formName]['errors']) { $errorSummary = '<div class="form-errors"><ul><li>' . implode('</li><li>', $formErrors) . '</li></ul></div>'; $smarty->assign(self::$_renderConfig[$formName]['errors'], $errorSummary); } // remove Javascript code if Docomo or AU if (is_array($formValue) && isset($formValue['javascript']) && $removeJs) { unset($formValue['javascript']); } $smarty->assign($formName, $formValue); $result[$formName] = $formValue; } return $result; }
/** * Inject * * @return void */ public function onInject() { $app = BEAR::get('app'); $this->_config['path'] = $app['BEAR_View']['path']; }
<?php if (!ereg("Firefox", getenv("HTTP_USER_AGENT"))) { // tweak for safari or ... echo '<html><head><script type="text/javascript" src="/__bear/bearshell/refresh.js"></script></head><body></body></html>'; } require_once 'App.php'; $_SERVER['__bear'] = 1; $app = BEAR::get('app'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>BEAR Shell</title> <link rel="stylesheet" href="/__bear/css/bearshell.css" type="text/css" media="screen"> <script type="text/javascript" src="/__bear/js/jquery.bear.min.js.php"></script> <script type="text/javascript" src="/__bear/js/app.js"></script> <script type="text/javascript" src="/__bear/bearshell/page.js"></script> </head> <body> <div id="msg"></div> <div id="output">BEAR Version <?php echo BEAR::VERSION . ' ' . date('r'); ?> <br /><br /> <div class="info">type 'help' for help</div> <div class="example">ex) bear read http://www.excite.co.jp/News/xml/rss_excite_news_odd_index_utf_8.dcg</div> <br /> </div> <div id="input"> <form class='cmdline' action="/__bear/bearshell/shell.php" method="post" name="form" id="form">
/** * リダイレクト * * <pre> * Locationヘッダーを用いてページの移動を行います。 * クッキーが対応してないエージェントの場合はクエリーに * セッションIDを付加します。 * * $uriは絶対URIを指定しますが、ホスト名を付加しないで指定した場合内部で付加します。 * * .(dot)を指定すると同一ページのリフレッシュになります。 * ページが完全に移動した場合は$config['permanent']をtrueにすると * 301ヘッダーを付加してリダイレクトしボットなどに移転を知らせます。 * * ----------------------------------------- * * Example 1. リダイレクト * </pre> * <code> * $header->redirect('http://www.example.co.jp/'); * </code> * <pre> * Example 2. リダイレクト(301 パーマネント * </pre< * <code> * $header->redirect('/', array('permanent' => true)); * </code> * <pre> * Example 3. 値を渡してリロード * </pre> * <code> * // onInit($args)の$argsに渡されます * $header->redirect('.', array('click' => 'delete', 'val' => $values); * </code> * * <b>$options</b> * * 'val' string セッション利用して値を次ページのonInit($args)に変数を渡す値 * 'click' string コールするonClickハンドラ * 'permanent' bool 301ヘッダー(パーマネントムーブ)を出力するか * * @param string $uri URL * @param array $options オプション * * @return void */ public function redirect($uri, array $options = array('val' => null, 'click' => null, 'permanent' => false)) { // .なら現在のファイルでページキャッシュもクリアする if ($uri == '.' || $uri == './') { $uri = $_SERVER['PHP_SELF']; $page = BEAR::get('page'); $page->clearPageCache(); } // ホストがないならホストを付加 $remoteAddr = $_SERVER["HTTP_HOST"]; if (strpos($uri, "http") === false) { if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') { $uri = "https://{$remoteAddr}{$uri}"; } else { $uri = "http://{$remoteAddr}{$uri}"; } } // 携帯の場合などクッキーが使用できない環境ではセッションクエリーをURLに付加 $sessionName = session_name(); $sessionId = session_id(); if (!isset($_COOKIE[$sessionName]) && $sessionId && isset($options['session']) && $options['session']) { // セッションクエリーが付いてれば消去 // $uri = preg_replace("/&*{$sessionName}=[^&]+/is", '', $uri); $uri = preg_replace("/([&\\?]){$sessionName}=[^&]?/is", '$1', $uri); $con = strpos($uri, "?") ? '&' : '?'; $uri .= "{$con}{$sessionName}={$sessionId}"; if (strlen($sessionId) != 32) { trigger_error('session key error' . $uri, E_USER_WARNING); } } //argsオプション if (isset($options['val'])) { $query = array('_cv' => $options['val']); } else { $query = ''; } if (isset($options['click'])) { $click = array(BEAR_Page::KEY_CLICK_NAME => $options['click']); if (is_array($query)) { $query = array_merge($query, $click); } else { $query = array_merge(array('_sc' => $query), $click); } } if ($query) { $uri = $uri . '?' . http_build_query($query); } if (isset($options['sval'])) { $session = BEAR::dependency('BEAR_Session', 'session'); /* @var $session BEAR_Session */ $session->set('val', $options['sval']); } if (isset($options['permanent']) && $options['permanent']) { $this->setHeader("HTTP/1.1 301 Moved Permanently"); } // ロケーションヘッダー出力 $this->setHeader("Location: {$uri}"); $this->_log->log('redirect', $uri); $this->flushHeader(); exit; }
/** * AJAXコマンドを追加 * * * <code> * // リソースをアサイン * $this->addAjax('resource', array('div_person1' => 'person'), array('effect' => 'slideup')); * // 生のデータをアサイン * $this->addAjax('html', array('msg' => '使用できます!'), array('effect' => 'splash')); * // フォームの値を変更 * $this->addAjax('form', array('post' => '123', 'post2' => '4567')); * // JSをコール * $this->addAjax('js', array('callback1' => $_SERVER, 'callback2' => $_COOKIE)); * // 出力 * $this->output('ajax'); * </code> * * @param string $ajaxCommand AJAXコマンド 'html' | 'resource' |'form' | 'js' * @param array $data AJAXコマンド引数 * @param array $options AJAXコマンドオプション * * @return void */ public function addAjax($ajaxCommand, array $data, array $options = array()) { switch ($ajaxCommand) { case 'resource': case 'init': foreach ($data as $div => $initValueKey) { $page = BEAR::get('page'); $init = $page->get(); $ajaxDivBody[$div] = $init[$initValueKey]; } $htmlData = array('body' => $ajaxDivBody, 'options' => $options); $this->_ajax['html'][] = $htmlData; break; case 'html': $htmlData = array('body' => $data, 'options' => $options); $this->_ajax['html'][] = $htmlData; break; default: $this->_ajax[$ajaxCommand][] = $data; break; } }