# MultiPrefixPhpViewResolver.class.php

Go to the documentation of this file.

    00001 <?php
    00002 /***************************************************************************
    00003  *   Copyright (C) 2007-2009 by Anton E. Lebedevich                        *
    00004  *                                                                         *
    00005  *   This program is free software; you can redistribute it and/or modify  *
    00006  *   it under the terms of the GNU Lesser General Public License as        *
    00007  *   published by the Free Software Foundation; either version 3 of the    *
    00008  *   License, or (at your option) any later version.                       *
    00009  *                                                                         *
    00010  ***************************************************************************/
    00011
    00020     class MultiPrefixPhpViewResolver implements ViewResolver
    00021     {
    00022         private $prefixes   = array();
    00023         private $lastAlias  = null;
    00024
    00025         private $disabled   = array();
    00026
    00027         private $postfix    = EXT_TPL;
    00028         private $viewClassName  = 'SimplePhpView';
    00029
    00033         public static function create()
    00034         {
    00035             return new self;
    00036         }
    00037
    00041         public function addFirstPrefix($prefix)
    00042         {
    00043             array_unshift($this->prefixes, $prefix);
    00044
    00045             return $this;
    00046         }
    00047
    00051         public function addPrefix($prefix, $alias = null)
    00052         {
    00053             if (!$alias)
    00054                 $alias = $this->getAutoAlias($prefix);
    00055
    00056             Assert::isFalse(
    00057                 isset($this->prefixes[$alias]),
    00058                 'alias already exists'
    00059             );
    00060
    00061             $this->prefixes[$alias] = $prefix;
    00062
    00063             $this->lastAlias = $alias;
    00064
    00065             return $this;
    00066         }
    00067
    00068         public function getPrefixes()
    00069         {
    00070             return $this->prefixes;
    00071         }
    00072
    00076         public function dropPrefixes()
    00077         {
    00078             $this->prefixes = array();
    00079             return $this;
    00080         }
    00081
    00082         public function isPrefixDisabled($alias)
    00083         {
    00084             Assert::isIndexExists(
    00085                 $this->prefixes,
    00086                 $alias,
    00087                 'no such alias: '.$alias
    00088             );
    00089
    00090             return !empty($this->disabled[$alias]);
    00091         }
    00092
    00096         public function disablePrefix($alias = null, $disabled = true)
    00097         {
    00098             if (!$alias)
    00099                 $alias = $this->lastAlias;
    00100
    00101             Assert::isNotNull($alias, 'nothing to disable');
    00102             Assert::isIndexExists(
    00103                 $this->prefixes,
    00104                 $alias,
    00105                 'no such alias: '.$alias
    00106             );
    00107
    00108             $this->disabled[$alias] = $disabled;
    00109
    00110             return $this;
    00111         }
    00112
    00113         public function enablePrefix($alias)
    00114         {
    00115             return $this->disablePrefix($alias, false);
    00116         }
    00117
    00118         public function getPostfix()
    00119         {
    00120             return $this->postfix;
    00121         }
    00122
    00126         public function setPostfix($postfix)
    00127         {
    00128             $this->postfix = $postfix;
    00129             return $this;
    00130         }
    00131
    00135         public function resolveViewName($viewName)
    00136         {
    00137             Assert::isFalse(
    00138                 ($this->prefixes === array()),
    00139                 'specify at least one prefix'
    00140             );
    00141
    00142             if ($prefix = $this->findPrefix($viewName))
    00143                 return $this->makeView($prefix, $viewName);
    00144
    00145             if (!$this->findPrefix($viewName, false))
    00146                 throw new WrongArgumentException(
    00147                     'can not resolve view: '.$viewName
    00148                 );
    00149
    00150             return EmptyView::create();
    00151         }
    00152
    00153         public function viewExists($viewName)
    00154         {
    00155             return ($this->findPrefix($viewName) !== null);
    00156         }
    00157
    00161         public function setViewClassName($viewClassName)
    00162         {
    00163             $this->viewClassName = $viewClassName;
    00164
    00165             return $this;
    00166         }
    00167
    00168         public function getViewClassName()
    00169         {
    00170             return $this->viewClassName;
    00171         }
    00172
    00173         protected function findPrefix($viewName, $checkDisabled = true)
    00174         {
    00175             foreach ($this->prefixes as $alias => $prefix) {
    00176                 if (
    00177                     $checkDisabled
    00178                     && isset($this->disabled[$alias])
    00179                     && $this->disabled[$alias]
    00180                 )
    00181                     continue;
    00182
    00183                 if (file_exists($prefix.$viewName.$this->postfix))
    00184                     return $prefix;
    00185             }
    00186
    00187             return null;
    00188         }
    00189
    00193         protected function makeView($prefix, $viewName)
    00194         {
    00195             return new $this->viewClassName(
    00196                 $prefix.$viewName.$this->postfix,
    00197                 $this
    00198             );
    00199         }
    00200
    00201         private function getAutoAlias($prefix)
    00202         {
    00203             return md5($prefix);
    00204         }
    00205     }
    00206 ?>