A Qcodo based CMS/ecommerce framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

241 lines
8.7 KiB

<?php
/**
* This is the MenuItemView class for the display functionality
* of the MenuItem class. It determines the type of menu to create
* based on flags in MenuItem, creating local soft hrefs (href#target)
* or external links. The rendering is based on <li> for CSS styling
* when there are lists or optionally a simple div with an anchor. The label
* may be text or an img src (CSS images are prefered). A div may be
* used for stand alone links that are not part of a menu
*
* The CSS Id is the Name column in the menu_item table, class may
* be set in the administration as well - each class will be added, a default
* class of Menu or MenuItem will be applied in any case.
*
* The constructor may be passed either a MenuItem or a MenuView -
* for MenuView GetControlHtml will make a li or a div in which to create
* the children of the menu (NOTE: this is unimplemented ..)
*
*@todo
* - implement Menu child items
* - check permissions for the item ..
* - (maybe) add js actions to simply change the CenterPanel of a PageView
* without a total reload of the page. Ie. pass a callback that can hide/show
* areas.
*
*@author Erik Winn <erikwinnmail@yahoo.com>
*
*
* $Id: MenuItemView.class.php 426 2008-12-14 04:18:10Z 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 Views
*
*/
class MenuItemView extends QControl
{
/**
* Local reference to the Parent object: MenuItem or a Menu normally
* @var QPanel objParentObject
*/
protected $objControlBlock;
protected $mixMenuItem;
private $_objMenuItem = null;
private $_objMenu = null;
// The presented item - may contain text or an image
protected $strLabel = '';
protected $strHref = '';
protected $strImgSrc = null;
// This MenuItem's CSS
protected $strCssId = '';
protected $strCssclass = '';
// State flags
protected $intLevel = 1;
protected $blnEnabled = true;
protected $blnUseDivs = false;
protected $blnUseSpans = false;
protected $blnUseImgSrc = false;
protected $isLocal = true;
public function ParsePostData() {}
public function Validate() {return true;}
/**
* MenuItemView constructor
* This constructor will accept any QPanel as the control block, this is normally a MenuView.
* The second parameter may be either a Menu or a MenuItem.
*
*@param QPanel objControlBlock - the DOM parent, should be a ContentBlockView or a MenuView
*@param QPanel mixMenuItem - the item to display, a Menu or a MenuItem
*/
public function __construct($objControlBlock, $mixMenuItem)
{
//Parent should always be a ContentBlockView or a MenuView
$this->objControlBlock = $objControlBlock;
$this->strCssId = preg_replace('/\s/', '',$mixMenuItem->Name);
try {
parent::__construct($this->objControlBlock, $this->strCssId);
} catch (QCallerException $objExc) {
$objExc->IncrementOffset();
throw $objExc;
}
if( $mixMenuItem instanceof MenuItem )
{
$this->_objMenuItem = $mixMenuItem;
if('/'. $this->MenuItem->Uri == Quasi::$PathInfo)
$this->AddCssClass("currentlink");
}
elseif ( $mixMenuItem instanceof Menu )
{
$this->AddCssClass("Menu");
$this->_objMenu = $mixMenuItem;
}
if($mixMenuItem->CssClass)
$this->AddCssClass($mixMenuItem->CssClass);
$this->AddCssClass($mixMenuItem->Type);
$this->strHref = $this->CreateHref();
}
/**
* Creates the HTML for this MenuItem - returns address to be wrapped
* @todo
* - be more intelligent here, perhaps support odd number ports, possibly
* omit http* and servername for local items.
* - There is also an odd behaviour in QCodo - it gets confused when switching
* between ssl and plain connections .. fixme.
* - Possibly allow for document.location if js is available
*
* @return string
*/
public function CreateHref()
{
//we are a menu .. return.
if($this->Menu )
return '';
if($this->MenuItem->IsSsl)
$strReturn = 'https://';
else
$strReturn = 'http://';
if($this->MenuItem->IsLocal)
$strReturn .= Quasi::$ServerName . __QUASI_SUBDIRECTORY__ . '/index.php/';
$strReturn .= $this->MenuItem->Uri;
return $strReturn;
}
/**
* Get the HTML for this MenuItem - returns the anchor wrapped in li or div
* @return string
*/
public function GetControlHtml()
{
if($this->Menu)
$object = $this->Menu;
else
$object = $this->MenuItem;
$strAttributes = $this->GetAttributes();
$strStyle = $this->GetStyleAttributes();
if ( '' != $strStyle)
$strStyle = 'style="' . $strStyle . '"';
if($object instanceof Menu)
return sprintf(' %s', 'Submenus TBD-FIXME' );
/* if($this->blnUseDivs)
return sprintf('<div id="%s" %s%s><a href="%s"> %s</a></div>',
$this->strCssId, $strAttributes, $strStyle, $this->Href, $object->Label);
/* return sprintf('<li id="%s" %s%s><a href="%s"> %s</a></li>',
$this->strCssId, $strAttributes, $strStyle, $this->Href, $object->Label);*/
return sprintf('<a %s %s href="%s"> %s</a>',
$strAttributes, $strStyle, $this->Href, $object->Label);
}
public function __get($strName)
{
switch ($strName)
{
case 'UseDivs':
return $this->blnUseDivs ;
case 'CssId':
return $this->strCssId ;
case 'Cssclass':
return $this->strCssclass ;
case 'Href':
return $this->strHref ;
case 'Level':
return $this->intLevel ;
case 'Menu':
return $this->_objMenu;
case 'MenuItem':
return $this->_objMenuItem;
case 'Label':
case 'Title':
if($this->mixMenuItem instanceof Menu )
return $this->_objMenu->Title ;
else
return $this->_objMenuItem->Label ;
default:
try {
return parent::__get($strName);
} catch (QCallerException $objExc) {
$objExc->IncrementOffset();
throw $objExc;
}
}
}
public function __set($strName, $mixValue)
{
switch ($strName)
{
case 'Level':
try {
return ($this->intLevel = QType::Cast($mixValue, QType::Integer));
} catch (QInvalidCastException $objExc) {
$objExc->IncrementOffset();
throw $objExc;
}
default:
try {
return (parent::__set($strName, $mixValue));
} catch (QCallerException $objExc) {
$objExc->IncrementOffset();
throw $objExc;
}
}
}
}
?>