启动自定义窗口小部件类

时间:2013-10-28 20:06:55

标签: php class oop

所以创建一个cms作为一种学习OOP的方式,并且有点卡住了。这是我的问题。 (下面粘贴的代码被剥离到极少)

我有一个名为ThemeFunctions的类,它具有以下代码来构成小部件功能:

require_once('cmsBase.php');
class ThemeFunctions extends CmsBase{
//All CMS template management related functions will be here.
var $templateName='default';
var $widgetPositions=array();

function show()
{       
    $this->themeOutput();
}
/*apps*/
function appOutput()
{
    $appname=(isset($_REQUEST['app']))?$_REQUEST['app']:'default';
    require_once('applications/'.$appname.'/'.$appname.'.php');
    $application=ucfirst($appname).'Application';
    $app=new $application();
    $app->run();
}


/*widjets*/
function widgetOutput($position='default')
{
    if(!empty($this->widgetPositions[$position]))
    {
        $widgets=$this->widgetPositions[$position];//gets all widgets in given position
        foreach($widgets as $widgetObject)//display each widget
        {
            $widgetName=$widgetObject->name;
            $widgetParameters=$widgetObject->parameters;

            if(file_exists($file = 'widgets/'.$widgetName.'/'.$widgetName.'.php'))
            {
                require_once($file);
                echo 'file loaded';
            } else {echo 'file doesn\'t exist';}

            $widgetclass=ucfirst($widgetName).'Widget';
            $widget=new $widgetclass();
            $widget->run($widgetName,$widgetParameters);
        }
    }
}
function setWidget($position,$widgetName,$params=array())
{
    $widget=new StdClass;
    $widget->name=$widgetName;
    $widget->parameters=$params;
    //if there is no widget in position then create a new array
    if(empty($this->widgetPositions[$position])) 
    {
        $this->widgetPositions[$position]=array($widget);
    }
    //if there is already a widget present in that position then just push new widget in array
    else
    {
        array_push($this->widgetPositions[$position],$widget);
    }        
}

并且在索引文件中实例化的类如下:

require_once('libraries/core/themeFunctions.php');
$tmpl=new ThemeFunctions();
$tmpl->show();

widjet有自己的基类,名为CmsWidjet,它具有以下代码

class CmsWidget extends CmsBase{
var $widgetPath='';
var $widgetName='';
var $parameters=array();

function setWidgetPath($widgetName)
{
    $this->widgetPath='widgets/'.$widgetName.'/';
    $this->widgetName=$widgetName;
}
function getWidgetPath()
{
    return $this->widgetPath;
}
function display()
{
    echo 'this will be default output of widget if this function is not overrided by derived class';
}
function run($widgetName,$params)// this function will be called by template function class to display widget
{
    $this->parameters=$params;
    $this->setWidgetPath($widgetName);
    $this->display();
}
}

和widjet本身的代码是:(即计算器widjet)

require_once('libraries/core/cmsWidget.php');
class CalculatorWidget extends CmsWidget{
function display()
{
  //if use_scientifc parameter is set and its value is true then output scientific calculator
  if(!empty($this->parameters['use_scientific']) and $this->parameters['use_scientific']==true)
  {
    require($this->getWidgetPath().'tmpl/scientific.php');
  }
  else
  {
    require($this->getWidgetPath().'tmpl/default.php');
  }
}
}

现在棘手的部分是ThemeFunctions类也被主题本身扩展。因此,当调用活动主题时,它的类被启动并且其函数被调用,这反过来调用各种(choped)html部分来创建页面。

所以最初,themeFunctions类没有被扩展,相反,它只用于调用主题index.php,而widjets就像这样启动:

*主题索引页

 $this->widgetOutput('sidebarPosition');

*主要cms索引页

 $tmpl->setWidget('sidebarPosition','calculator');

但是在扩展themeFunctions类后,上面的方法不起作用。任何帮助表示赞赏。

这也只是我学习OOP,所以请原谅代码中的错误,如果有必要,请指出正确的方向。

1 个答案:

答案 0 :(得分:1)

您的班级ThemeFunctions是班级层次结构的另一个分支。 你有:

CmsBase
|
|--> ThemeFunctions
|
|--> CmsWidget
     |
     |--> CalculatorWidget

要继承ThemeFunctions功能,您需要在课程ThemeFunctions中扩展CmsWidget。 所以你的结构如下:

CmsBase
|
|--> ThemeFunctions
     |
     |--> CmsWidget
          |
          |--> CalculatorWidget

在此结构中,您可以使用ThemeFunctions中声明的函数。

如果它破坏了关于类层次结构的计划,您可以查看Traits。 http://php.net/manual/en/language.oop5.traits.php