openrat-cms

OpenRat Content Management System
git clone http://git.code.weiherhei.de/openrat-cms.git
Log | Files | Refs | README

Action.class.php (9223B)


      1 <?php
      2 
      3 namespace cms\action;
      4 
      5 use cms\base\Configuration;
      6 use cms\base\Language as L;
      7 use cms\model\ModelBase;
      8 use cms\model\User;
      9 use logger\Logger;
     10 use util\Cookie;
     11 use util\ClassUtils;
     12 use util\Session;
     13 
     14 
     15 /**
     16  * Eltern-Klasse fuer alle Actions.
     17  *
     18  * Diese Klasse stellt grundlegende action-uebergreifende Methoden
     19  * bereit.
     20  * Dient als Ueberklasse fuer alle abgeleiteten Action-Klassen in
     21  * diesem Package bzw. Verzeichnis.
     22  *
     23  * @author Jan Dankert
     24  * @package openrat.actions
     25  * @abstract
     26  */
     27 class Action
     28 {
     29 	const SECURITY_GUEST = 1; // Jeder (auch nicht angemeldete) dürfen diese Aktion ausführen
     30 	const SECURITY_USER  = 2; // Angemeldete Benutzer dürfen diese Aktion ausführen
     31 	const SECURITY_ADMIN = 3; // Nur Administratoren dürfen diese Aktion ausführen
     32 
     33 	const NOTICE_OK    = 'ok';
     34 	const NOTICE_INFO  = 'info';
     35 	const NOTICE_WARN  = 'warning';
     36 	const NOTICE_ERROR = 'error';
     37 
     38 	public $security = self::SECURITY_USER; // Default.
     39 
     40 	protected $templateVars = [
     41 		'errors'  => [],
     42 		'notices' => [],
     43 		'output'  => []
     44 	];
     45 
     46 	/**
     47 	 * Current user.
     48 	 *
     49 	 * @var User User
     50 	 */
     51 	public $currentUser;
     52 
     53 	/**
     54 	 * Request
     55 	 *
     56 	 * @var RequestParams
     57 	 */
     58 	public $request;
     59 
     60 
     61 	/**
     62 	 * Will be called by the Dispatcher right after the conStruction of this class instance.
     63 	 */
     64 	public function init()
     65 	{
     66 
     67 	}
     68 
     69 
     70 	public function __construct()
     71 	{
     72 		$this->currentUser = Session::getUser();
     73 	}
     74 
     75 
     76 
     77 	/**
     78 	 * Setzt eine Variable f�r die Oberfl�che.
     79 	 *
     80 	 * @param String $varName Schl�ssel
     81 	 * @param Mixed $value
     82 	 */
     83 	protected function setTemplateVar($varName, $value)
     84 	{
     85 		$this->templateVars['output'][$varName] = $value;
     86 	}
     87 
     88 
     89 	/**
     90 	 * Setzt eine Liste von Variablen f�r die Oberfl�che.
     91 	 *
     92 	 * @param array $varList Assoziatives Array
     93 	 */
     94 	protected function setTemplateVars($varList)
     95 	{
     96 		foreach ($varList as $name => $value) {
     97 			$this->setTemplateVar($name, $value);
     98 		}
     99 	}
    100 
    101 
    102 	/**
    103 	 * F�gt einen Validierungsfehler hinzu.
    104 	 *
    105 	 * @param String $name Name des validierten Eingabefeldes
    106 	 * @param String Textschl�ssel der Fehlermeldung (optional)
    107 	 */
    108 	public function addValidationError($name, $message = "COMMON_VALIDATION_ERROR", $vars = array(), $log = array())
    109 	{
    110 		if (!empty($message))
    111 			$this->addNotice('', 0, '', $message, Action::NOTICE_ERROR, $vars, $log);
    112 
    113 		$this->templateVars['errors'][] = $name;
    114 	}
    115 
    116 
    117 	/**
    118 	 * @param $baseObject ModelBase
    119 	 * @param $key String
    120 	 * @param array $vars
    121 	 * @param string|array $message
    122 	 */
    123 	protected function addNoticeFor($baseObject,$key,$vars = array(), $message='') {
    124 		$this->addNoticeInternal($baseObject, $key, Action::NOTICE_OK, $vars, $message);
    125 	}
    126 
    127 	/**
    128 	 * @param $baseObject ModelBase
    129 	 * @param $key String
    130 	 * @param array $vars
    131 	 * @param string $message
    132 	 */
    133 	protected function addInfoFor($baseObject,$key,$vars = array(), $message='') {
    134 		$this->addNoticeInternal($baseObject, $key, Action::NOTICE_INFO, $vars, $message);
    135 	}
    136 
    137 	/**
    138 	 * @param $baseObject ModelBase
    139 	 * @param $key String
    140 	 * @param array $vars
    141 	 * @param string $message
    142 	 */
    143 	protected function addWarningFor($baseObject,$key,$vars = array(), $message='') {
    144 		$this->addNoticeInternal($baseObject, $key, Action::NOTICE_WARN, $vars, $message);
    145 	}
    146 
    147 	/**
    148 	 * @param $baseObject ModelBase
    149 	 * @param $key String
    150 	 * @param array $vars
    151 	 * @param string $message
    152 	 */
    153 	protected function addErrorFor($baseObject,$key,$vars = array(), $message='') {
    154 
    155 		$this->addNoticeInternal( $baseObject, $key, Action::NOTICE_ERROR, $vars, $message);
    156 	}
    157 
    158 
    159 
    160 	private function addNoticeInternal($baseObject,$key,$noticeType,$vars, $message) {
    161 
    162 		if	( is_object($baseObject) ) {
    163 			$type = strtolower(ClassUtils::getSimpleClassName($baseObject));
    164 			$id   = $baseObject->getId();
    165 			$name = $baseObject->getName();
    166 		} else {
    167 			$type = '';
    168 			$id   = '';
    169 			$name = '';
    170 		}
    171 
    172 		$this->addNotice($type,$id,$name, $key, $noticeType, $vars, $message);
    173 	}
    174 
    175 
    176 	/**
    177 	 * F�gt ein Meldung hinzu.
    178 	 *
    179 	 * @param String $type Typ des Objektes, zu dem diese Meldung geh�rt.
    180 	 * @param $id
    181 	 * @param String $name Name des Objektes, zu dem diese Meldung geh�rt.
    182 	 * @param String $text Textschl�ssel der Fehlermeldung (optional)
    183 	 * @param String $status Einer der Werte Action::NOTICE_(OK|WARN|ERROR)
    184 	 * @param array $vars Variablen f�r den Textschl�ssel
    185 	 * @param string|array $log Weitere Hinweistexte f�r diese Meldung.
    186 	 */
    187 	private function addNotice($type, $id, $name, $text, $status = Action::NOTICE_OK, $vars = array(), $log = array())
    188 	{
    189 		if ($status === true)
    190 			$status = Action::NOTICE_OK;
    191 		elseif ($status === false)
    192 			$status = Action::NOTICE_ERROR;
    193 
    194 		$this->templateVars['notice_status'] = $status;
    195 		$this->templateVars['status'] = $status;
    196 		$this->templateVars['success'] = ($status == Action::NOTICE_ERROR ? 'false' : 'true');
    197 
    198 		if ( is_array($log) )
    199 			$log = implode("\n",$log);
    200 
    201 		if (!is_array($vars))
    202 			$vars = array($vars);
    203 
    204 		$this->templateVars['notices'][] = [
    205 			'type'   => $type,
    206 			'id'     => $id  ,
    207 			'name'   => $name,
    208 			'key'    => $text,
    209 			'vars'   => $vars,
    210 			'text'   => L::lang($text, $vars),
    211 			'log'    => $log ,
    212 			'status' => $status];
    213 	}
    214 
    215 
    216 	/**
    217 	 * Getting the output data.
    218 	 *
    219 	 * @return array[]
    220 	 */
    221 	public function getOutputData()
    222 	{
    223 		return $this->templateVars;
    224 	}
    225 
    226 
    227 	/**
    228 	 * Has the current user administration rights?
    229 	 *
    230 	 * @return boolean true, if current user is an administrator
    231 	 */
    232 	protected function userIsAdmin()
    233 	{
    234 		$user = $this->getUserFromSession();
    235 
    236 		return is_object($user) && $user->isAdmin;
    237 	}
    238 
    239 
    240 	/**
    241 	 * Ermitteln des Benutzerobjektes aus der Session
    242 	 * @return User
    243 	 */
    244 	protected function getUserFromSession()
    245 	{
    246 		return Session::getUser();
    247 	}
    248 
    249 
    250 	/**
    251 	 * Using the HTTP-Caching, the "Conditional GET".
    252 	 *
    253 	 * The HTTP-header "Last-Modified" is set.
    254 	 *
    255 	 * Ist der Inhalt der Seite nicht neuer, so wird der Inhalt
    256 	 * der Seite nicht ausgegeben, sondern nur HTTP-Status 304
    257 	 * ("304 not modified") gesetzt.
    258 	 * Der Rest der Seite muss dann nicht mehr erzeugt werden,
    259 	 * wodurch die Performance stark erhoeht werden kann.
    260 	 *
    261 	 * Credits: Thanks to Charles Miller
    262 	 * @see http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers
    263 	 *
    264 	 * Found here:
    265 	 * @see http://simon.incutio.com/archive/2003/04/23/conditionalGet
    266 	 *
    267 	 * @param $time int Last modification timestamp of this resource
    268 	 * @param $expirationDuration int Gültigkeitsdauer
    269 	 */
    270 	protected function lastModified($time, $expirationDuration = 0)
    271 	{
    272 		if   ( DEVELOPMENT )
    273 			return;
    274 
    275 		// Is HTTP-Cache enabled by config?
    276 		if ( ! Configuration::subset('cache')->is('conditional_get',true) )
    277 			return;
    278 
    279 		$expires      = substr(date('r', time() + $expirationDuration - date('Z')), 0, -5) . 'GMT';
    280 		$lastModified = substr(date('r', $time - date('Z')), 0, -5) . 'GMT';
    281 		$etag         = '"' . base_convert($time, 10, 36) . '"'; // a short representation of the unix timestamp.
    282 
    283 		// Header senden
    284 		header('Expires: '       . $expires);
    285 		header('Last-Modified: ' . $lastModified);
    286 		header('ETag: '          . $etag);
    287 
    288 		// Die vom Interpreter sonst automatisch gesetzten
    289 		// Header uebersteuern
    290 		header('Cache-Control: must-revalidate');
    291 		header('Pragma:');
    292 
    293 		// See if the client has provided the required headers
    294 		$if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : false;
    295 		$if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : false;
    296 
    297 		// Bug in Apache 2.2, mod_deflat adds '-gzip' to E-Tag
    298 		if (substr($if_none_match, -6) == '-gzip"')
    299 			$if_none_match = substr($if_none_match, 0, -6) . '"';
    300 
    301 		// At least one of the headers is there - check them
    302 		if ($if_none_match && $if_none_match != $etag)
    303 			return; // etag is there but doesn't match
    304 
    305 		if ($if_modified_since && $if_modified_since != $lastModified)
    306 			return; // if-modified-since is there but doesn't match
    307 
    308 		if (!$if_modified_since && !$if_none_match)
    309 			return;
    310 
    311 		// Der entfernte Browser bzw. Proxy holt die Seite nun aus seinem Cache
    312 		header('HTTP/1.0 304 Not Modified');
    313 		exit;  // Sofortiges Skript-Ende
    314 	}
    315 
    316 
    317 	/**
    318 	 * @param $max int max Anzahl der Sekunden, die die Seite im Browsercache bleiben darf
    319 	 */
    320 	protected function maxAge($max = 3600)
    321 	{
    322 		// Die Header "Last-Modified" und "ETag" wurden bereits in der
    323 		// Methode "lastModified()" gesetzt.
    324 
    325 		header('Expires: ' . substr(date('r', time() - date('Z') + $max), 0, -5) . 'GMT');
    326 		header('Pragma: '); // 'Pragma' ist Bullshit und
    327 		// wird von den meisten Browsern ignoriert.
    328 		header('Cache-Control: public, max-age=' . $max . ", s-maxage=" . $max);
    329 	}
    330 
    331 
    332 	/**
    333 	 * Language ISO code.
    334 	 */
    335 	const COOKIE_LANGUAGE = 'or_language';
    336 
    337 	/**
    338 	 * Last used username.
    339 	 */
    340 	const COOKIE_USERNAME = 'or_username';
    341 	/**
    342 	 * Login token.
    343 	 */
    344 	const COOKIE_TOKEN    = 'or_token';
    345 
    346 	/**
    347 	 * Database id.
    348 	 */
    349 	const COOKIE_DB_ID    = 'or_dbid';
    350 
    351 	/**
    352 	 * Timezone offset
    353 	 */
    354 	const COOKIE_TIMEZONE_OFFSET = 'or_timezone_offset';
    355 
    356 
    357 	/**
    358 	 * Sets a cookie.
    359 	 *
    360 	 * @param $name string cookie name
    361 	 * @param $value string cookie value, null or empty to delete
    362 	 */
    363 	protected function setCookie($name, $value = '' ) {
    364 
    365 		Cookie::set( $name, $value );
    366 	}
    367 }