0

OOPを学習する方法としてcmsを作成していて、ちょっと行き詰まっています。これが私の問題です。(以下に貼り付けられたコードは、最小限に抑えられています)

ウィジェット機能用の次のコードを持つ 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();

ウィジェットには、次のコードを持つ 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();
}
}

ウィジェット自体のコードは次のとおりです: (つまり、計算機ウィジェット)

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 クラスもテーマ自体によって拡張されることです。したがって、アクティブなテーマを呼び出すと、そのクラスが開始され、その関数が呼び出され、さまざまな (チョップされた) html パーツが呼び出されてページが作成されます。

最初は、themeFunctions クラスは拡張されていませんでした。代わりに、テーマの index.php を呼び出すだけで、widjets は次のように開始されました。

*テーマ索引ページ

 $this->widgetOutput('sidebarPosition');

*メインのCMSインデックスページ

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

しかし、themeFunctions クラスを拡張した後、上記は機能しません。どんな助けでも大歓迎です。

また、これは私が OOP を学習しているだけなので、コードのエラーを許し、必要に応じて正しい方向に向けてください。

4

1 に答える 1