* * * $Id: index.php 513 2009-03-12 22:03:03Z erikwinn $ *@version 0.1 * *@copyright (C) 2008 by Erik Winn *@license GPL v.2 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA * *@package Quasi *@subpackage Classes */ class IndexPage extends QForm { /** * @var boolean blnAjaxOk - if true we use AJAX, if not we issue server calls */ public static $blnAjaxOk = false; /** * MainWindow provides a point of reference for Quasi Modules to access Control arrays in the * managing QForm. (currently unused .. may be removed) * @var MainWindow MainWindow - the global reference to the index QForm object */ public static $MainWindow; /** * NOTE: any account always has a single shopping cart, it will retain any items in it * until they either check out or remove them. * @var ShoppingCart objShoppingCart - self explanatory .. */ public static $objShoppingCart; /** * @var Account objAccount - the currently logged in account, null if not logged in */ public static $objAccount; /** * @var string strPageRequest - the name of the current page, Page object is loaded from the database */ public static $strPageRequest; /** * This string contains parameters that may be parsed by modules on the Page, eg. after "Products" * we might have nothing (""), activating the product list module or "234" activating the product view for that * product Id. The original request was http://www.mysite.com/index.php/Products/234 - "Products" is stored * in PageRequest, 234 is stored here in PageParameters. * @var string strPageParameters - everything after the Page name, ie parameters for the Page */ public static $strPageParameters; /** * @var array aryStyleSheets - an array of CSS stylesheets to be inserted into the HEAD for the PageView */ protected $aryStyleSheets; /** * @var array aryJavaScripts - an array of JavaScript files to be inserted into the HEAD for the PageView */ protected $aryJavaScripts; /** * @var string strPreferedStyleSheet - CSS stylesheet to be flagged as prefered into the HEAD for the PageView */ protected $strPreferedStyleSheet; /** * @var array aryCssDirectories - relative paths to the possible directories containing stylesheets */ protected $aryCssDirectories = array( __QUASI_CORE_CSS__, __QUASI_CONTRIB_CSS__, __QUASI_LOCAL_CSS__, ); /** * @var array aryJavaScriptDirectories - absolute paths to the possible directories containing javascript files */ protected $aryJavaScriptDirectories = array( __QUASI_LOCAL_JS__, __QUASI_CONTRIB_JS__, __QUASI_CORE_JS__, ); /** * @var array aryModuleDirectories - absolute paths to the possible directories containing modules */ protected $aryModuleDirectories = array( __QUASI_LOCAL_MODULES__, __QUASI_CONTRIB_MODULES__, __QUASI_CORE_MODULES__, ); /** * @var string defaultStyleSheet - default CSS stylesheet */ protected $defaultStyleSheet = 'quasi.css'; /** * @var Page objPage - the Page object from the database for this request */ protected $objPage; /** * @var PageView objPageView - the PageView display object, renders ContentBlocks */ protected $objPageView; /** * This array is initilized by the module loader in ContentBlockView * @todo - figure out how to make this work. (Note: i suspect a clone in QForm may be breaking this ..) *@var array ActiveModules - an array of references to modules which have been loaded. */ public $ActiveModules; //experimental thinking - ignore at will .. protected function __construct() { parent::__construct(); self::$MainWindow = $this; } /** * This function runs on all requests - full POST, URL links, or Ajax requests, ie. always. * Form_Create below runs only on page loads - ie. not for Ajax calls. * Thus, we set the important global data up here: request string, login state, shopping cart. * This ensures that these are set when an action returns the form state. */ protected function Form_Run() { //Ok, figure out what page we are $aryRequest = explode('/', Quasi::$PathInfo); //remove scriptname (index.php) array_shift($aryRequest); //store page name self::$strPageRequest = array_shift($aryRequest); //store extra parameters self::$strPageParameters = implode( '/', $aryRequest); //Then check / set login status if( ! isset($_SESSION['AccountLogin']) ) { //timed out .. redirect home (avoid qcodo exception) if(self::$objAccount instanceof Account) { self::$objAccount = null; Quasi::Redirect(__QUASI_SUBDIRECTORY__ . '/index.php/Home'); } self::$objAccount = null; } else { self::$objAccount = unserialize( $_SESSION['AccountLogin'] ); if( ! self::$objAccount instanceof Account ) { unset($_SESSION['AccountLogin']); self::$objAccount = null; Quasi::Redirect(__QUASI_SUBDIRECTORY__ . '/index.php/Home'); } } ///@todo - only set up Shopping cart if ecommerce is enabled .. // set up the user's Shopping cart if the user is logged in if(self::$objAccount instanceof Account && ! self::$objShoppingCart instanceof ShoppingCart) { $objShoppingCart = ShoppingCart::LoadByAccountId(self::$objAccount->Id); // still no cart? ok, they have just signed up, make a new cart for them if(!$objShoppingCart) { $objShoppingCart = new ShoppingCart(); $objShoppingCart->AccountId = self::$objAccount->Id; $objShoppingCart->Save(); } self::$objShoppingCart = $objShoppingCart; } // turn off AJAX for known problem browsers .. if( Quasi::IsBrowser( QBrowserType::InternetExplorer_6_0 ) || Quasi::IsBrowser( QBrowserType::Safari ) || Quasi::IsBrowser( QBrowserType::Opera )) self::$blnAjaxOk = false; else self::$blnAjaxOk = true; } protected function Form_Create() { //redirect to include index.php and start out with our url scheme if( empty(Quasi::$ScriptName ) ) Quasi::Redirect(__QUASI_SUBDIRECTORY__ . '/index.php/Home'); elseif( empty(self::$strPageRequest) ) self::$strPageRequest = "Home"; // Now get the Page row from the database .. $this->objPage = Page::LoadByName(self::$strPageRequest); // @todo implement 404 page not found .. for now, we just go home. if(!$this->objPage ) { self::$strPageRequest = "Home"; $this->objPage = Page::LoadByName(self::$strPageRequest); } if( $this->objPage) { // $this->loadModules(); $this->objPageView = new PageView( $this, $this->objPage ); $this->aryStyleSheets = StyleSheet::LoadArrayByPage( $this->objPage->Id ); $this->strPreferedStyleSheet = $this->aryStyleSheets[0]; } else $this->strPreferedStyleSheet = $this->defaultStyleSheet; /** * Find stylesheets - we look first in core assets, then contrib and * finally cascade to local. If none is found we fly naked just to be obvious .. */ if(is_array($this->aryStyleSheets) ) foreach($this->aryStyleSheets as $filename) { foreach( $this->aryCssDirectories as $basedir ) { $strUrl = $basedir . '/' . $filename; if(file_exists(__WWWROOT__ . $strUrl)) $this->aryStyleSheets[] = $strUrl; } } $this->aryJavaScripts = JavaScript::LoadArrayByPage( $this->objPage->Id ); if(is_array($this->aryJavaScripts) ) foreach($this->aryJavaScripts as $objJavaScript) { foreach( $this->aryJavaScriptDirectories as $basedir ) { $strUrl = $basedir . '/' . $objJavaScript->Filename; if(file_exists(__WWWROOT__ . $strUrl)) { $this->aryJavaScripts[] = $strUrl; break; } } } $this->objDefaultWaitIcon = new QWaitIcon($this); } /** * This Form_Validate event handler allows you to specify any custom Form Validation rules. * It will also Blink() on all invalid controls, as well as Focus() on the top-most invalid control. * NOTE: Currently disabled to avoid conflicts with validation in modules * @todo work out what to do about this, since the whole CMS is essentially one form we * need a more coherant system for event and signal handling .. */ protected function Form_Validate() { // By default, we report that Custom Validations passed $blnToReturn = true; /* $blnFocused = false; foreach ($this->GetErrorControls() as $objControl) { // Set Focus to the top-most invalid control if (!$blnFocused) { $objControl->Focus(); $blnFocused = true; } // Blink on ALL invalid controls $objControl->Blink(); } */ return $blnToReturn; } protected function handleUrl() { $aryRequest = explode('/', self::$strPageRequest); self::$strPageRequest = array_shift($aryRequest); self::$strPageParameters = implode( '/', $aryRequest); } /** * This function returns a reference to an active module if it is in the list. Otherwise, it returns null * You must pass the name of the module to return. * WARNING: BROKEN - do not use. * @todo - figure out how to make this work. (Note: i suspect a clone in QForm may be breaking this ..) * *@param string strModuleName * @return object SomeModule or null */ public function GetActiveModule($strModuleName) { if( is_array($this->ActiveModules)) foreach( $this->ActiveModules as $objModuleView ) { $strTestName = get_class( $objModuleView ); if( $strTestName == $strModuleName ) return $objModuleView; } return null; } public function AddActiveModule($objModule) { $this->ActiveModules[] = $objModule; } /** * Loads any modules associated with content blocks on the requested page. * Note that the order of loading is local, then contrib, then core. This only runs * on the first form access (including redirects to ourself ) - might speed things * up a bit, otherwise Quasi::Autoload will take care of loading. * @todo test to see which is faster - currently unused. */ protected function loadModules() { $aryContentBlocks = $this->objPage->GetContentBlockArray(); foreach($aryContentBlocks as $objContentBlock) { $aryModules = $objContentBlock->GetModuleArray(); foreach($aryModules as $objModule) { $strClassFileName = $objModule->ClassName . '.class.php'; foreach( $this->aryModuleDirectories as $strDir ) { $strIncludeUri = $strDir . '/' . $strClassFileName; if( file_exists($strIncludeUri) ) { require_once($strIncludeUri); break; } } } } } //Note - these are unused currently, but left as a reminder for possible future // architectural change - essentially we could make almost anything a panel // (anywhere?) with ajax/server calls for display management... public function HidePanel(QPanel $objPanel) { if( true === $objPanel->Visible) $objPanel->Visible = false; } public function ShowPanel(QPanel $objPanel = null) { if ($objPanel) { $objPanel->SetParentControl($this); if( false === $objPanel->Visible) $objPanel->Visible = true; } } public function __get($strName) { switch ($strName) { case 'PageTitle': return $this->objPage->Title; case 'StyleSheetPath': return $this->strStyleSheetPath; case 'PreferedStyleSheet': return $this->strPreferedStyleSheet; case 'PageRequest': return self::$strPageRequest ; default: try { return parent::__get($strName); } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } } } public function __set($strName, $mixValue) { switch ($strName) { case 'PreferedStyleSheet': try { return ($this->strPreferedStyleSheet = QType::Cast($mixValue, QType::String)); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } default: try { return (parent::__set($strName, $mixValue)); } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } } } } IndexPage::Run('IndexPage', "index.tpl.php"); ?>