/** * 初期化 * * @return void */ public function onInit(array $args) { // Create our Application instance (replace this with your appId and secret). $facebook = BEAR::factory('App_Fb'); // We may or may not have this data based on a $_GET or $_COOKIE based session. // // If we get a session here, it means we found a correctly signed session using // the Application Secret only Facebook and the Application know. We dont know // if it is still valid until we make an API call using the session. A session // can become invalid if it has already expired (should not be getting the // session back in this case) or if the user logged out of Facebook. $session = $facebook->getSession(); $me = $uid = null; // Session based API call. if ($session) { $uid = $facebook->getUser(); $me = $facebook->api('/me'); } // login or logout url will be needed depending on current user state. $loginUrl = $logoutUrl = null; if ($me) { $logoutUrl = $facebook->getLogoutUrl(); } else { $loginUrl = $facebook->getLoginUrl(); } // This call will always work since we are fetching public data. $naitik = $facebook->api('/naitik'); $appId = $facebook->getAppId(); $encodedSession = json_encode($session); $this->set(compact('loginUrl', 'logoutUrl', 'appId', 'encodedSession', 'me', 'uid', 'naitik')); }
public function setUp() { restore_error_handler(); if (!BEAR::exists('BEAR_Session')) { BEAR::set('BEAR_Session', BEAR::factory('BEAR_Session', array('adapter' => 0, 'prefix' => ''))); } $this->_token = new BEAR_Form_Token(array()); $this->_token->onInject(); }
/** * 変数画面出力 * * @param array $values 値 * @param array $options オプション * * @return BEAR_Ro */ function outputPrint($values, array $options) { $body = print_a($values, 'return:1'); $headers = array('X-BEAR-Output: PRINT' => 'Content-Type: text/html; charset=utf-8'); $ro = BEAR::factory('BEAR_Ro'); $ro->setBody($body); $ro->setHeaders($headers); return $ro; }
/** * JSON出力 * * @param array $values 値 * @param array $options オプション * * @return BEAR_Ro */ function outputJson($values, array $options) { $body = json_encode($values); $headers = array('X-BEAR-Output: JSON' => 'Content-Type: text/javascript+json; charset=utf-8'); $ro = BEAR::factory('BEAR_Ro'); $ro->setBody($body); $ro->setHeaders($headers); return $ro; }
/** * PHPシリアライズ変数出力 * * @param array $values 値 * @param array $options オプション * * @return BEAR_Ro */ function outputPhp($values, array $options) { $body = serialize($values); $headers = array('X-BEAR-Output: PHP' => 'Content-Type: text/html; charset=utf-8'); $ro = BEAR::factory('BEAR_Ro'); $ro->setBody($body); $ro->setHeaders($headers); return $ro; }
/** * Db factorys * * @return array MDB2_Driver_Datatype_mysqli */ public function factory() { $options['default_table_type'] = 'INNODB'; $options['use_transactions'] = true; $config = array('dsn' => $this->_config['dsn']); $config['options'] = $options; $db = BEAR::factory('BEAR_Mdb2', $config); $db->setOption('quote_identifier', true); $db->loadModule('Extended'); return $db; }
/** * 全てのキャッシュをクリア * * @param bool $showMessage メッセージ表示? * * @return void */ public static function clearAllCache($showMessage = false) { $app = BEAR::get('app'); if ($app['core']['debug'] !== true) { return; } BEAR::factory('BEAR_Dev_Shell')->clearCache(); if ($showMessage) { Panda::message('Cache Clear', '全てのキャッシュファイルとキャッシュメモリをクリアしました'); } }
/** * キャッシュを取得 * * キーを基にキャッシュデータを取得します * * @param string $key キー * @param mixed $default デフォルト * * @return mixed */ public function get($key, $default = null) { $result = apc_fetch($this->_config['prefix'] . $key); if (!$result) { $result = $default; } if ($result instanceof BEAR_Ro_Container) { $ro = BEAR::factory('BEAR_Ro'); $ro->setCode($result->code)->setHeaders((array) $result->header)->setBody($result->body)->setLinks($result->links)->setHtml($result->html); $result = $ro; } if ($result) { $this->_log->log('Apc[R]', $key); } return $result; }
/** * 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; }
/** * キャッシュを取得 * * キーを基にキャッシュデータを取得します * * @param string $key キー * @param mixed $options オプション * * @return mixed */ public function get($key, $options = array('default' => null)) { $result = $this->_adapter->get($this->_config['prefix'] . $key); // 結果がなくてデフォルトが用意されていればデフォルト if ($result === false && $options['default']) { $result = $options['default']; } if ($result instanceof BEAR_Ro_Container) { $ro = BEAR::factory('BEAR_Ro'); $ro->setCode($result->code)->setHeaders((array) $result->header)->setBody($result->body)->setLinks($result->links)->setHtml($result->html); return $ro; } if ($result !== false) { $this->_log->log('Cache Lite[R]', $key); } return $result; }
/** * 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); } }
/** * 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; }
/** * リソースリクエスト実行 * * App/Ro下のROリソースのリクエストを行います。 * * @return mixed */ public function request() { // ROクラスDI $config = array('method' => $this->_config['method'], 'uri' => $this->_config['uri'], 'class' => $this->_config['class']); if (isset($this->_config['options']['config'])) { $roConfig = array_merge($this->_config, $this->_config['options']['config']); } else { $roConfig = $this->_config; } if (isset($this->_config['options']['injector'])) { $roOptions = array('injector' => $this->_config['options']['injector']); } else { // デフォルトインジェクト $roOptions = array(); } $this->_config['obj'] = BEAR::factory($this->_config['class'], $roConfig, $roOptions); // アノテーションクラスDI $config['method'] = 'on' . $this->_config['method']; $annotation = BEAR::factory('BEAR_Annotation', $config); // requireアノテーション (引数のチェック) $annotation->required($this->_config['values']); // aspectアノテーション (アドバイスの織り込み) $method = $annotation->aspect(); $result = $method->invoke($this->_config['obj'], $this->_config['values']); // 後処理 if (PEAR::isError($result)) { $this->_config['obj']->setCode(BEAR::CODE_ERROR); $this->_config['obj']->setHeader('_error', $result->toString()); } else { if ($result instanceof BEAR_Ro) { // return RO return $result; } else { $this->_config['obj']->setBody($result); } } return $this->_config['obj']; }
/** * インジェクタ * * <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); }
/** * XML出力 * * XMLを出力します。 * * @param array $values 値 * @param array $options オプション * * @return BEAR_Ro */ function outputXml($values, array $options) { $defaultOptions = array("mode" => "", "indent" => " ", "linebreak" => "\n", "indentAttributes" => true, "typeHints" => false, "scalarAsAttributes" => true, "addDecl" => true, "encoding" => "UTF-8", "rootName" => "rdf:RDF", "rootAttributes" => array("xmlns" => "http://purl.org/rss/1.0/", "xmlns:rdf" => "http://www.e3.org/1999/02/22-rdf-syntax-ns#", "xmlns:dc" => "http://purl.org/dc/elements/1.1/", "xmlns:sy" => "http://purl.org/rss/1.0/modules/syndication/", "xmlns:admin" => "http://webns.net/mvcb/", "xmlns:content" => "http://purl.org/rss/1.0/modules/content/", "xml:lang" => "ja"), "defaultTagName" => "item", "attributesArray" => "_attributes"); if (is_array($options)) { $options = $options + $defaultOptions; } else { $options = $defaultOptions; } $serializer = new XML_Serializer($options); $status = $serializer->serialize($values); // エラーチェック if (PEAR::isError($status)) { $xmlString = ''; } else { $xmlString = $serializer->getSerializedData(); } // return $body = $xmlString; $headers = array('X-BEAR-Output: XML' => 'Content-Type: application/xml'); $ro = BEAR::factory('BEAR_Ro'); $ro->setBody($body); $ro->setHeaders($headers); return $ro; }
/** * リソースリクエスト送信 * * @param string $method リクエストメソッド(CRUD) * @param string $uri URI(クエリー付き) * @param array $values 引数 * * @return mixed BEAR_Ro | array */ public function send($method, $uri, array $values = array()) { $socket = new Net_Socket(); // 接続を確立する $socket->connect($this->_ip, $this->_port, true, 30); $uriWithVal = self::_mergeQueryAndArray($uri, $values); // 改行を含むデータを送信する $request = "{$method} {$uriWithVal}"; $socket->writeLine($request); // 改行が現れるまでデータを受信する $code = $socket->readLine(); // アトリビュート $header = $socket->readLine(); while ($header) { $headers[] = $header; $header = $socket->readLine(); } $body = $socket->readLine(); if ($this->_returnVo && class_exists('BEAR_Ro', false)) { $ro = BEAR::factory('BEAR_Ro'); /* @var $ro BEAR_Ro */ $ro->setBody($body); $ro->setHeaders($headers); $ro->setCode($code); $result = $ro; } else { $result = array('code' => $code, 'headers' => $headers, 'body' => $body); } return $result; }
/** * リソースオブジェクトに変換 * * <pre> * $htmlを受け取りエージェント依存のヘッダーを付加してリソースオブジェクトにして返します。 * 返されたリソースオブジェクトはoutputHttp()メソッドでHTTP出力ができます。 * </pre> * * @param string $html HTML 文字列 * * @return BEAR_ro */ protected function _getRo($html) { // ヘッダーを出力 $header = isset($this->_config['agent_config']['header']) ? $this->_config['agent_config']['header'] : array(); // 絵文字&(&文字コード)フィルター if (isset($this->_config['agent_config']['agent_filter']) && $this->_config['agent_config']['agent_filter'] === true) { $html = $this->_agentFilter($html); } // ボディ出力 $ro = BEAR::factory('BEAR_Ro')->setHeaders(array($header))->setBody($html); return $ro; }
/** * Constructor * @param array $config */ public function __construct(array $config) { $this->_fb = BEAR::factory('App_Fb'); parent::__construct($config); }
/** * リソースリクエスト実行 * * リモートURLにアクセスしてRSSだったら配列に、 * そうでなかったらHTTP Body文字列をリソースとして扱います。 * * @return BEAR_Ro * @throws BEAR_Resource_Execute_Exception */ public function request() { $reqMethod = array(); $reqMethod[BEAR_Resource::METHOD_CREATE] = HTTP_Request2::METHOD_POST; $reqMethod[BEAR_Resource::METHOD_READ] = HTTP_Request2::METHOD_GET; $reqMethod[BEAR_Resource::METHOD_UPDATE] = HTTP_Request2::METHOD_PUT; $reqMethod[BEAR_Resource::METHOD_DELETE] = HTTP_Request2::METHOD_DELETE; assert(isset($reqMethod[$this->_config['method']])); try { // 引数以降省略可能 config で proxy とかも設定可能 $request = new HTTP_Request2($this->_config['uri'], $reqMethod[$this->_config['method']]); $request->setHeader("user-agent", 'BEAR/' . BEAR::VERSION); $request->setConfig("follow_redirects", true); if ($this->_config['method'] === BEAR_Resource::METHOD_CREATE || $this->_config['method'] === BEAR_Resource::METHOD_UPDATE) { foreach ($this->_config['values'] as $key => $value) { $request->addPostParameter($key, $value); } } $response = $request->send(); $code = $response->getStatus(); $headers = $response->getHeader(); if ($code == 200) { $body = $response->getBody(); } else { $info = array('code' => $code, 'headers' => $headers); throw $this->_exception($response->getBody(), $info); } } catch (HTTP_Request2_Exception $e) { throw $this->_exception($e->getMessage()); } catch (Exception $e) { throw $this->_exception($e->getMessage()); } $rss = new XML_RSS($body, 'utf-8', 'utf-8'); PEAR::setErrorHandling(PEAR_ERROR_RETURN); // @todo Panda::setPearErrorHandling(仮称)に変更しエラーを画面化しないようにする $rss->parse(); $items = $rss->getItems(); if (is_array($items) && count($items) > 0) { $body = $items; $headers = $rss->getChannelInfo(); $headers['type'] = 'rss'; } else { $headers['type'] = 'string'; $body = array($body); } // UTF-8に $encode = mb_convert_variables('UTF-8', 'auto', $body); $ro = BEAR::factory('BEAR_Ro')->setBody($body)->setHeaders($headers); /* @var $ro BEAR_Ro */ PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array('Panda', 'onPearError')); return $ro; }
/** * onInitコール * * @param array $args ページ引数 * * @return void * @throws Panda_Exception */ protected function _runInit(array $args) { $config['class'] = get_class($this->_page); $config['method'] = 'onInit'; $annotation = BEAR::factory('BEAR_Annotation', $config); try { $annotation->required($args); } catch (BEAR_Annotation_Exception $e) { if (method_exists($this->_page, 'onException')) { $this->_page->onException($e); } else { throw new Panda_Exception('Bad Request', 400, array('info' => $e->getInfo())); } } $this->_page->onInit($args); }
/** * ローカルリソースの実行 * * ローカルリソースファイル(Ro, Function, スタティックファイル等)を実行します。 * * @param string $uri * * @return stdClass * @throws BEAR_Resource_Exception */ private function _localResourceExecute($uri) { $file = _BEAR_APP_HOME . '/App/Ro/' . $uri . '.php'; if (file_exists($file)) { include_once $file; $resourcePathName = 'App_Ro_' . str_replace('/', '_', $uri); switch (true) { case class_exists($resourcePathName, false): $this->_config['class'] = $resourcePathName; $format = 'Ro'; break; case function_exists($resourcePathName): // @deprecated $this->_config['function'] = $resourcePathName; $format = 'Function'; break; default: $msg = 'Mismatch resource class/function error.(ファイル名とクラス/関数名がミスマッチです。)'; $info = array('resource name' => $resourcePathName, 'resource file' => $file); throw $this->_exception($msg, array('code' => BEAR::CODE_BAD_REQUEST, 'info' => $info)); $format = 'Mock'; } } else { $file = _BEAR_APP_HOME . '/App/Ro/' . $uri; if (file_exists($file)) { $this->_config['file'] = $file; $format = self::FORMAT_FILE; } else { throw $this->_exception("Resource file[{$file}] is not exists.", array('info' => array('uri' => $uri, 'file' => $file))); $format = 'Null'; } } $obj = BEAR::factory('BEAR_Resource_Execute_' . $format, $this->_config); return $obj; }
/** * キャッシュクリア * * @return void */ public function clearCache() { clearstatcache(); BEAR::factory('BEAR_Cache')->deleteAll(); BEAR_Util::unlinkRecursive(_BEAR_APP_HOME . '/tmp/session/'); BEAR_Util::unlinkRecursive(_BEAR_APP_HOME . '/tmp/cache_lite/'); BEAR_Util::unlinkRecursive(_BEAR_APP_HOME . '/tmp/smarty_cache/'); BEAR_Util::unlinkRecursive(_BEAR_APP_HOME . '/tmp/smarty_templates_c/'); BEAR_Util::unlinkRecursive(_BEAR_APP_HOME . '/tmp/misc/'); if (function_exists('apc_clear_cache')) { apc_clear_cache('user'); apc_clear_cache(); } }
/** * retruningアドバイスの実行 * * @param object $obj * @param array $values * @param string $adviceType * @param mixed $inteface * * @return mixed */ public function invokeRetruning($obj, array $values, $adviceType, $inteface) { //returnアドバイス $adviceClass = isset($this->_config['aspects'][self::ADVICE_AFTER_RETURNING][0]) ? $this->_config['aspects'][self::ADVICE_AFTER_RETURNING][0] : null; if (isset($adviceClass)) { $this->_adviceValidation($adviceClass, 'BEAR_Aspect_Returning_Interface'); $advice = BEAR::factory($adviceClass, $this->_config); $result = $advice->returning($result, $joinPoint); } return $result; }
/** * リンクリソースを再帰で変更 * * @param array &$linked * @param string $linkFrom * @param string $linkTo * * @return void */ private static function _changeRecursive(&$linked, $linkFrom, $linkTo) { $isLink = array_key_exists('_link', $linked); $isSet = isset($linked['_link'][$linkFrom]); if ($isLink && $isSet) { $valeus = $linked['_link'][$linkFrom]['values']; $class = $linked['_link'][$linkFrom]['class']; $onLinks = call_user_func(array($class, 'onLink'), $valeus); // $params = $onLinks[$linkTo]; $config = self::_makeRequestConfig($onLinks, $linkTo); $ro = BEAR::factory('BEAR_Resource_Request', $config)->request(); // $ro = BEAR::dependency('BEAR_Resource')->read($params)->getRo(); $body = $ro->getBody(); if (is_array($body)) { $refBody =& $body; self::_makeCollectionChain($refBody, $linkTo, $ro); } $linked[$linkTo] = $body; } else { foreach ($linked as &$val) { if (is_array($val)) { self::_changeRecursive($val, $linkFrom, $linkTo); } } } }
/** * Viewアダプター * * <pre> * Viewにページバリューをアサインして、Viewを返します。 * 受け取ったクラインとではfetchかdisplayが利用可能です。 * UAスニッフィングがtrueならエージェント * </pre> * * @return BEAR_View_Adapter */ protected function _viewAdapter() { $config = $this->_config; if (isset($this->_config['enable_ua_sniffing']) && $this->_config['enable_ua_sniffing'] === true) { $adapter = BEAR::dependency('BEAR_Agent_Adapter_' . $this->_config['ua'], array('ua' => $this->_config['ua'])); $agentConfig = $adapter->getConfig(); $config['agent_config'] = $agentConfig; $config['enable_ua_sniffing'] = true; } else { $config = array(); $config['enable_ua_sniffing'] = false; $config['ua'] = 'Default'; } $config['values'] = $this->_values; $config['ro'] = $this->_ro; $config['resource_id'] = $this->_config['resource_id']; $this->_view = BEAR::factory('BEAR_View', $config); return $this->_view; }
/** * 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; }
/** * アスペクトアノテーション * * @return BEAR_Aspect_Weaver */ public function aspect() { $match = array(); $result = preg_match_all("/@aspect\\s+(\\w+)\\s+(\\w+)/is", $this->_config['doc']['method'], $match); $aspects = array(); // <アドバイスタイプ> => <アドバイスクラス>の連想配列 $max = count($match[0]); for ($i = 0; $i < $max; $i++) { $type = $match[1][$i]; $class = $match[2][$i]; $aspects[$type][] = $class; } if (!$aspects) { $method = new ReflectionMethod($this->_config['class'], $this->_config['method']); return $method; } $this->_config['aspects'] = $aspects; // weaver $weaver = BEAR::factory('BEAR_Aspect_Weaver', $this->_config); return $weaver; }
/** * リソース後処理 * * <pre> * リソース取得の結果に対しての後処理を行います。 * 後処理にはコールバック関数の適用や、DBページャーの * 結果取り出しなどがあります。 * </pre> * * @param BEAR_Ro &$ro BEAR_Roオブジェクト * * @return mixed * * @throws BEAR_Resource_Execute_Exception */ private function _actionPostProcess(BEAR_Ro &$ro) { $body = $ro->getBody(); $Info = array(); $info['totalItems'] = count($body); $options = $this->_config['options']; // ページャーリザルト処理 if (PEAR::isError($body) || !$body) { return; } // ページャーオプション if (isset($options[BEAR_Resource::OPTION_PAGER])) { $pager = BEAR::factory('BEAR_Pager'); $pagerOptions['perPage'] = $options[BEAR_Resource::OPTION_PAGER]; $pager->setOptions($pagerOptions); $pager->makePager($body); $body = $pager->getResult(); $info['page_numbers'] = array('current' => $pager->pager->getCurrentPageID(), 'total' => $pager->pager->numPages()); list($info['from'], $info['to']) = $pager->pager->getOffsetByPageId(); $links = $pager->getLinks(); $ro->setLink(BEAR_Resource::LINK_PAGER, $links); $ro->setHeaders($info); $info['page_numbers'] = array('current' => $pager->pager->getCurrentPageID(), 'total' => $pager->pager->numPages()); list($info['from'], $info['to']) = $pager->pager->getOffsetByPageId(); $info['limit'] = $info['to'] - $info['from'] + 1; $pager->setPagerLinks($links, $info); } // コールバックオプション 1 if (isset($options['callback'])) { if (is_callable($options['callback'])) { call_user_func($options['callback'], $body); } else { $msg = 'BEAR_Resource callback failed.'; $info = array('callback' => $options['callback']); throw $this->_exception($msg, array('info' => $info)); } } // コールバックオプション rec if (isset($options['callbackr'])) { if (is_callable($options['callbackr'])) { array_walk_recursive($body, $options['callbackr']); } else { $msg = 'BEAR_Resource callback_r failed.'; $info = array('callbackr' => $options['callback_r']); throw $this->_exception($msg, array('info' => $info)); } } $ro->setBody($body); }
/** * リソースリクエスト実行 * * @return void */ protected function _doRequest() { $this->_ro = BEAR::factory('BEAR_Resource_Request', $this->_config['request'])->request(); }
/** * リソース操作 * * リソースの操作情報を保持するオブジェクト(BEAR_Ro_Prototype)を取得します。 * 同クラスのcreate(), read(), update(), delete()から呼ばれるリソース操作クラスです。 * * <pre> * Example 1.リソース読み込み * </pre> * <code> * $params['uri'] = 'user/profile'; * $params['values'] = array('id'=>1); * $resource = BEAR::dependency('BEAR_Resource'); * $profileObject = $resource->read($params)->getRo(); * $profileValues = $resource->read($params)->getBody(); * // objectとしてテンプレートにset * $profileObject = $resource->read($params)->set('profile', 'object'); * </code> * * @param string $method メソッド(create | read | update | delete) * @param string $uri URI * @param array $values 引数 * @param array $options オプション * * @return BEAR_Ro_Prototype */ public function request($method, $uri, array $values = array(), array $options = array()) { $config = compact('method', 'uri', 'values', 'options'); $ro = BEAR::factory('BEAR_Ro_Prototype', array('request' => $config, 'path' => $this->_config['path'])); return $ro; }