/** * self::render('views/blog/post.php',array('post'=>$post)); * @param string $file Path to the file to render. Path will be relative to the file that handles the request. * @param mixed $local_variables Key => value pairs to pass to the View object that is rendered. */ public static final function render($file, $local_variables = false) { $view_instance = new PicoraView($file, $local_variables); foreach (PicoraEvent::getObserverList('PicoraController.afterRender') as $callback) { call_user_func($callback, $view_instance); } return $view_instance; }
/** * @param string $text Markdown formatted text. * @return string HTML */ public static function format($text) { static $markdown; if (!isset($markdown)) { $markdown = new Markdown_Parser(); } foreach (PicoraEvent::getObserverList('PicoraTextile.beforeFormat') as $callback) { call_user_func($callback, $text); } $output = $markdown->transform($text); foreach (PicoraEvent::getObserverList('PicoraTextile.afterFormat') as $callback) { call_user_func($callback, $output); } return $output; }
/** * @param string $text Textile formatted text. * @return string HTML */ public static function format($text) { static $textile; if (!isset($textile)) { $textile = new Textile(); } foreach (PicoraEvent::getObserverList('PicoraTextile.beforeFormat') as $callback) { call_user_func($callback, $text); } $output = $textile->process($text); foreach (PicoraEvent::getObserverList('PicoraTextile.afterFormat') as $callback) { call_user_func($callback, $output); } return $output; }
public static function load($class_name) { foreach (self::$files as $name => $file) { if ($class_name == $name) { require_once $file; return true; } } foreach (self::$folders as $folder) { if (substr(0, -1) != DIRECTORY_SEPARATOR) { $folder .= DIRECTORY_SEPARATOR; } if (file_exists($folder . $class_name . '.php')) { require_once $folder . $class_name . '.php'; return true; } } foreach (PicoraEvent::getObserverList('PicoraAutoLoader.load') as $callback) { if (call_user_func($callback, $class_name) === true) { return true; } } return false; }
/** * Renders the current template, returning the result as a string. * @return string */ public function display() { foreach (PicoraEvent::getObserverList('PicoraView.beforeDisplay') as $callback) { call_user_func($callback, $this); } //extract and unserialize all flash values and extract content blocks if (isset($_SESSION[PicoraController::FLASH_SESSION_KEY_NAME])) { foreach ($_SESSION[PicoraController::FLASH_SESSION_KEY_NAME]['values'] as $__key__ => $__value__) { ${$__key__} = unserialize($__value__); } } //bring controller instance variables, content blocks, and view instance variables into scope extract(array_merge(PicoraDispatcher::getCurrentController() ? array_merge(PicoraDispatcher::getCurrentController()->params, get_object_vars(PicoraDispatcher::getCurrentController())) : array(), self::$__sections__, get_object_vars($this)), EXTR_REFS); //include file and return output ob_start(); if ($this->__is_string__) { eval(' ?>' . $this->__file__ . '<?php '); } else { include $this->__file__; } $output = ob_get_clean(); foreach (PicoraEvent::getObserverList('PicoraView.afterDisplay') as $callback) { call_user_func($callback, $output); } return $output; }
/** * @param string $dispatcher_dir The directory that the application is running in. * @param string $base_url The base url that the application is running at. * @param string $requested_url The url that is being requested relative to the base url. * @return string Returns the response from a Controller that responded to the requested url. */ public static function dispatch($dispatcher_dir, $base_url, $requested_url, $try_with_trailing_slash = true) { if ($try_with_trailing_slash) { self::load(); } PicoraEvent::notify('PicoraDispatcher.beforeDispatch', $requested_url); self::$status['current_parameters'] = array_merge($_POST, $_GET); unset(self::$status['current_parameters'][self::DEFAULT_ROUTE_PARAMETER_NAME]); self::$status['dispatcher_dir'] = $dispatcher_dir . '/'; self::$status['base_url'] = $base_url; self::$status['request_url'] = $requested_url; self::$status['flash_values'] =& $_SESSION[PicoraController::FLASH_SESSION_KEY_NAME]['values']; foreach (self::$routes as $route => $class_and_method) { if ($requested_url == $route && ($response = self::tryRoute($route, $class_and_method)) !== false) { return self::generateResponse($response); } if (preg_replace('{([^/]+)}', '*', $route) == preg_replace('{([^/]+)}', '*', $requested_url)) { preg_match_all('{([^/]+)?}', $route, $route_components); preg_match_all('{([^/]+)?}', $requested_url, $requested_url_components); $arguments = array(); foreach ($requested_url_components[0] as $key => $requested_url_component) { if ($requested_url_component == '') { continue; } elseif (strpos($route_components[0][$key], ':') !== false) { $arguments[substr($route_components[0][$key], 1)] = $requested_url_component; } elseif ($route_components[0][$key] != $requested_url_component) { continue 2; } } if (($response = self::tryRoute($route, $class_and_method, $arguments)) !== false) { return self::generateResponse($response); } } } if ($try_with_trailing_slash && strlen($requested_url) > 1 && substr($requested_url, 0, -1) != '/' && self::dispatch($dispatcher_dir, $base_url, $requested_url . '/', false)) { header('HTTP/1.1 301 Moved Permanently'); PicoraController::redirect('http' . ($_SERVER['SERVER_PORT'] == 443 ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '/'); } if ($try_with_trailing_slash) { header('HTTP/1.1 404 Not Found'); $response = self::call(self::$error_handler, array(), array()); foreach (PicoraEvent::getObserverList('PicoraDispatcher.afterDispatch') as $callback) { call_user_func($callback, $response); } return self::generateResponse($response); } }
public function display() { foreach (PicoraEvent::getObserverList('PicoraInput.beforeDisplay') as $callback) { call_user_func($callback, $this); } $output = ''; switch ($this->params['type']) { case 'text': case 'hidden': case 'button': case 'file': case 'image': case 'password': case 'reset': case 'submit': $output = PicoraView::tag('input', array_merge($this->params, array('value' => htmlspecialchars($this->params['value'], ENT_COMPAT, 'utf-8')))); break; case 'textarea': $output = '<textarea' . self::htmlAttributes($this->params, array('type', 'value')) . '>' . htmlspecialchars($this->params['value'], ENT_COMPAT, 'utf-8') . '</textarea>'; break; case 'radio': $output = '<input type="radio"' . self::htmlAttributes($this->params, array('checked', 'type')) . (isset($this->params['checked']) && ($this->params['checked'] == true || $this->params['checked'] == 1 || $this->params['checked'] == 'true') ? ' checked="checked"' : '') . '/>'; break; case 'checkbox': $output = '<input type="hidden" name="' . $this->params['name'] . '" value="0"/><input type="checkbox" value="1"' . self::htmlAttributes($this->params, array('checked', 'value')) . (isset($this->params['checked']) && ($this->params['checked'] == true || $this->params['checked'] == 1 || $this->params['checked'] == 'true') ? ' checked="checked"' : '') . '/>'; break; case 'select': $output = '<select'; $output .= self::htmlAttributes($this->params, array('options', 'selected', 'value')) . '>'; if (isset($this->params['options']) && is_array($this->params['options'])) { foreach ($this->params['options'] as $value => $name) { $outut .= '<option value="' . htmlspecialchars($value, ENT_COMPAT, 'utf-8') . '"'; if (isset($this->params['selected']) && (is_array($this->params['selected']) && in_array($value, $this->params['selected']) || !is_array($this->params['selected']) && $this->params['selected'] == $value)) { $output .= ' selected="selected"'; } $output .= '>' . htmlspecialchars($name, ENT_COMPAT, 'utf-8') . '</option>'; } } $output .= '</select>'; break; } foreach (PicoraEvent::getObserverList('PicoraInput.afterDisplay') as $callback) { call_user_func($callback, $outut); } return $output; }
/** * Immediately (no redirect required) logs the user in. * @param string $name * @param string $password * @param bool $set_cookie * @return bool */ public static function login($name, $password, $set_cookie = false) { foreach (PicoraEvent::getObserverList('PicoraUser.beforeLogin') as $callback) { if (call_user_func($callback, $name, $password, $set_cookie) === false) { return false; } } self::logout(); $user = PicoraActiveRecord::find('PicoraUser', array('where' => self::ALLOW_LOGIN_WITH_EMAIL ? self::NAME_KEY . ' = "' . PicoraActiveRecord::escape($name) . '" OR ' . self::EMAIL_KEY . ' = "' . PicoraActiveRecord::escape($name) . '" AND ' . self::PASSWORD_KEY . ' = "' . PicoraActiveRecord::escape($password) . '"' : array(self::NAME_KEY => $name, self::PASSWORD_KEY => $password))); if (!$user) { if (self::DELAY_ON_INVALID_LOGIN) { if (!isset($_SESSION[self::SESSION_KEY . '.invalid_logins'])) { $_SESSION[self::SESSION_KEY . '.invalid_logins'] = 1; } else { ++$_SESSION[self::SESSION_KEY . '.invalid_logins']; } sleep(max(0, min($_SESSION[self::SESSION_KEY . '.invalid_logins'], ini_get('max_execution_time') - 1))); } PicoraEvent::notify('PicoraUser.afterLogin', false); return false; } else { if (isset($user->last_login)) { $user->updateAttribute(self::LAST_LOGIN_KEY, date('Y-m-d H:i:s', time())); } if ($set_cookie) { $time = time() + self::COOKIE_LIFE; $bool = setcookie(self::COOKIE_KEY, self::bakeUserCookie($time, $user->id, $user->name), $time, '/', null, isset($_ENV['SERVER_PROTOCOL']) && (strpos($_ENV['SERVER_PROTOCOL'], 'https') || strpos($_ENV['SERVER_PROTOCOL'], 'HTTPS'))); } self::setLoggedInStateFromRecord($user); PicoraEvent::notify('PicoraUser.afterLogin', true); return true; } }
public function __call($method, $arguments) { foreach (self::getRelationshipList($this->__class_name__) as $relationship) { $relationship_type = $relationship[0]; $related_class_name = $relationship[1]; $foreign_key = isset($relationship[2]) ? $relationship[2] : PicoraSupport::singularize($related_class_name) . '_id'; switch ($relationship_type) { case 'has_one': switch ($method) { case 'get' . $related_class_name: return self::find($related_class_name, $this->{$foreign_key}); case 'build' . $related_class_name: return self::build($related_class_name, isset($arguments[0]) ? $arguments[0] : array()); case 'create' . $related_class_name: $record = self::create($related_class_name, isset($arguments[0]) ? $arguments[0] : array()); if ($this->id) { $this->updateAttribute($foreign_key, $record->id); } return $record; } break; case 'has_many': switch ($method) { case 'delete' . $related_class_name: $record = self::find($related_class_name, $arguments[0] instanceof PicoraActiveRecord ? $arguments[0]->{self::primaryKeyNameFromClassName(get_class($arguments[0]))} : $arguments[0]); return !$record ? false : (bool) $record->delete(); case 'get' . $related_class_name . 'List': case 'get' . $related_class_name . 'Count': $params = isset($arguments[0]) ? $arguments[0] : array(); $params['where'] = (isset($params['where']) ? PicoraSupport::formatPropertyString($params['where'], $this) . ' AND ' : '') . $foreign_key . ' = ' . self::escape($this->{self::primaryKeyNameFromClassName($this->__class_name__)}); if ('get' . $related_class_name . 'Count' == $method) { return self::count($related_class_name, array('where' => $params['where'])); } if (isset($relationship['order']) && !isset($params['order'])) { $params['order'] = $relationship['order']; } $list = self::findAll($related_class_name, $params); if ('get' . $related_class_name . 'List' == $method) { return $list; } foreach ($list as $item) { if (!isset($arguments[0]) || isset($arguments[0]) && $arguments[0] == $item->{self::primaryKeyNameFromClassName(get_class($item))}) { $item->delete(); } } break; case 'create' . $related_class_name: return self::create($related_class_name, array_merge(isset($arguments[0]) ? $arguments[0] : array(), array($foreign_key => $this->{self::primaryKeyNameFromClassName($this->__class_name__)}))); case 'build' . $related_class_name: return self::build($related_class_name, array_merge(isset($arguments[0]) ? $arguments[0] : array(), array($foreign_key => $this->{self::primaryKeyNameFromClassName($this->__class_name__)}))); } break; case 'belongs_to': switch ($method) { case 'get' . $related_class_name: return self::find($related_class_name, $this->{$foreign_key}); case 'build' . $related_class_name == $method: case 'create' . $related_class_name == $method: $record = self::build($related_class_name, isset($arguments[0]) ? $arguments[0] : array()); if (isset($relationship['counter'])) { $record->{$relationship['counter']} = 1; } if ('build' . $related_class_name == $method) { return $record; } if ($record->save() && $this->{self::primaryKeyNameFromClassName($this->__class_name__)}) { $this->updateAttribute($foreign_key, $record->{self::primaryKeyNameFromClassName(get_class($record))}); } return $record; } break; case 'has_and_belongs_to_many': $source_class_name = $this->__class_name__; $source_table_name = self::tableNameFromClassName($this->__class_name__); $target_class_name = $related_class_name; $target_table_name = self::tableNameFromClassName($related_class_name); $link_class_name = $relationship[2]; $link_table_name = self::tableNameFromClassName($relationship[2]); $source_key = $relationship[3]; $target_key = $relationship[4]; $params = isset($arguments[0]) ? $arguments[0] : array(); switch ($method) { case 'set' . $related_class_name . 'List': $links = array(); self::executeQuery('DELETE FROM ' . $link_table_name . ' WHERE ' . $source_key . ' = ' . self::escape($this->id)); foreach (isset($arguments[0]) ? $arguments[0] : array() as $id) { $links[] = self::create($link_class_name, array($source_key => $this->{self::primaryKeyNameFromClassName($this->__class_name__)}, $target_key => $id instanceof PicoraActiveRecord ? $id->{self::primaryKeyNameFromClassName(get_class($id))} : $id)); } return $links; case 'add' . $related_class_name: return self::create($link_class_name, array($source_key => $this->{self::primaryKeyNameFromClassName($this->__class_name__)}, $target_key => $arguments[0] instanceof PicoraActiveRecord ? $arguments[0]->{self::primaryKeyNameFromClassName(get_class($arguments[0]))} : $arguments[0])); case 'remove' . $related_class_name: self::executeQuery('DELETE FROM ' . $link_table_name . ' WHERE ' . $source_key . ' = ' . self::escape($this->{self::primaryKeyNameFromClassName($this->__class_name__)}) . ' AND ' . $target_key . ' = ' . self::escape($arguments[0] instanceof PicoraActiveRecord ? $arguments[0]->{self::primaryKeyNameFromClassName(get_class($argument[0]))} : $arguments[0])); break; case 'has' . $related_class_name: return (bool) self::find($link_class_name, array('where' => array($source_key => $this->id, $target_key => $arguments[0] instanceof PicoraActiveRecord ? $arguments[0]->{self::primaryKeyNameFromClassName(get_class($arguments[0]))} : $arguments[0]))); case 'get' . $related_class_name . 'List': case 'get' . $related_class_name . 'Count': $params['tables'] = $link_table_name; $params['join'] = 'LEFT JOIN ' . $target_table_name . ' ON (' . $link_table_name . '.' . $target_key . ' = ' . $target_table_name . '.' . self::primaryKeyNameFromClassName($target_class_name) . ')'; $condition = $link_table_name . '.' . $source_key . ' = ' . $this->{self::primaryKeyNameFromClassName($this->__class_name__)}; $params['where'] = (isset($params['where']) ? $params['where'] . ' AND ' : '') . (isset($relationship['where']) ? $relationship['where'] . ' AND ' . $condition : $condition); if (isset($relationship['order']) && !isset($params['order'])) { $params['order'] = $relationship['order']; } if ('get' . $related_class_name . 'Count' == $method) { return self::count($target_class_name, array('where' => $params['where'], 'join' => $params['join'])); } $instance_list = self::findAll($target_class_name, $params); foreach ($instance_list as $instance) { unset($instance->{$target_key}, $instance->{$source_key}); } if ('get' . $related_class_name . 'List' == $method) { return $instance_list; } break; } break; } } foreach (PicoraEvent::getObserverList('PicoraActiveRecord.call') as $callback) { $response = call_user_func($callback, $this, $method, $arguments); if (!is_null($response)) { return $response; } } throw new Exception('Method "' . $method . '" of "' . $this->__class_name__ . '" does not exist.'); }