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 を学習しているだけなので、コードのエラーを許し、必要に応じて正しい方向に向けてください。