Example #1
0
 /**
  * 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;
 }
Example #2
0
 /**
  * @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;
 }
Example #3
0
 /**
  * @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;
 }
Example #4
0
 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;
 }
Example #5
0
 /**
  * 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;
 }
Example #6
0
 /**
  * @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);
     }
 }
Example #7
0
 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;
 }
Example #8
0
 /**
  * Immediately (no redirect required) logs the user out, destroying the cookie if it was set. 
  * @return void
  */
 public static function logout()
 {
     PicoraEvent::notify('PicoraUser.beforeLogout');
     session_unregister(self::SESSION_KEY);
     self::eatCookie();
     self::$record = false;
     self::$user_id = false;
     self::$is_admin = false;
     self::$group_list = array();
     PicoraEvent::notify('PicoraUser.afterLogout');
 }
Example #9
0
 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.');
 }