XOOPS

教程:xoopsForm 的继承

Mamba  2012-03-07 02:21 5624 阅读次数   4 条评论 
- 维基百科 - 法语文章 附有精美的UML图 - PHP教程 - PHP文档 XOOPS 和继承 任何好的IT项目都使用面向对象编程(OOP)。事实上,其开发者(我顺便感谢一下他们)编写了一套类来管理此项目。因此,我们可以使用继承来添加和修改XOOPS的行为。 这一切都很正常,但为什么要这样做呢? - 你可以直接在项目中修改任何类。这些更改被称为“HACK”。在你输入代码的瞬间,它可能就成为一颗沙粒,可能动摇你的生活,迫使你不断地开发和维护你的网站。那么,接下来的几天内发布的下一个版本会发生什么呢?一年之后呢?什么都不会正常运行,你将不得不一个接一个地重新开始所有更改。让我们希望,作为一位合格的开发者,你会在某个地方记录所有更改,以便在需要时再次执行它们。否则,祝你好运! 替代方案是使用继承,让我们一起来看看吧! 以XOOPS中的一个表单为例。XOOPS中的表单虽然经常被使用,但并不能总是满足你的所有需求。这里,我们将探讨两个与XOOPS继承的应用,特别是针对 xoopsThemeFormxoopsElement。这些只是示例,你不会受到这些示例的限制: - 在运行中更改表单的操作URL - 添加原始项目中没有的新项 我们假设有一个名为MyModule的模块,并且该模块有一个标准的类目录,我们可以将我们的新类放置在此。 首先要做的是理解类在表单继承树中的结构。 XoopsForm类作为表单的基类,是一个抽象类,这意味着不应该直接使用此类,而应该扩展和泛化它。这是通过某种模板、属性和方法实现的。我让你自己深入了解面向对象编程(OOP)的细节。XoopsThemeForm类是扩展XoopsForm并显示表单为表格的类。这是我们继承的类,以便改变表单的总体行为。 缩放图像 注意:如果我们想我们的表单不再以表格形式显示,我们将直接从XoopsForm继承并重新工作源代码;在这里,我们只需要从xoopsThemeForm继承并更改负责创建表单的render()方法。正如你可能已经注意到的那样,在XoopsForm(请参见API)中,render()方法是空的,这是正确的。这是一个抽象类,它只是告诉我们,在扩展它的类中应该实现这个方法。因此,在XoopsThemeForm中,这个方法被实现为以表格形式显示表单
function render()
{
    
$ele_name $this->getName();
    
$ret      '$ele_name '" id="' $ele_name '" action="' $this->getAction() . '" method="'
        
$this->getMethod() . '" onsubmit="return xoopsFormValidate_' $ele_name '();"' $this->getExtra() . '>
            
            
$this->getTitle() . '
        '
;
    
$hidden   '';
    
$class    'even';
    foreach (
$this->getElements() as $ele) {
        if (!
is_object($ele)) {
            
$ret .= $ele;
        } else {
            if (!
$ele->isHidden()) {
                if (!
$ele->getNocolspan()) {
                    
$ret .= '';
                    if ((
$caption $ele->getCaption()) != '') {
                        
$ret
                            
.=
                            
'. ($ele->isRequired() ? '-required' '') . '">';
                        
$ret .= '$caption ''
;
                        
$ret .= '*'
;
                        
$ret .= '
';
                    if ((
$desc $ele ->getDescription()) != '') {
                        
$ret .= '<div class="xoops-form-element-help">'$desc '</div>
';
                    }
                    
$ret .= '$class '">' $ele->render() . '' NWLINE;
                } else {
                    
$ret .= '';
                    if ((
$caption $ele->getCaption()) != '') {
                        
$ret 
                        
.=
                        
'. ($ele->isRequired() ? '-required' '') . '">';
                        
$ret .= '"' $caption ''
;
                        
$ret .= ';
                        
$ret .= '*'
;
                        
$ret .= '
;
                    }
                    
$ret
                        
.= '$class '" cols-pan="2">'
                        
$ele->render() '';
                        
$ele-》render() . '';
            } else {
                
$hidden .= $ele->render();
            }
    }
    
$ret .= '' Solution.$hidden .= NWLINE .= '' .= NWLINE;
    
$ret .= $this->renderValidationJS(``)`true);
    return 
$ret ;
}
让我们付诸实践 在我们的第一个例子中,我们希望我们的表单根据用户操作创建不同的视图。我们的表单如下
// 创建表单对象 
$my_form = new ThemeForm("my form"'Form_bien'"handle_bien.php?action=save"); 

// 创建表单组件 
$reference = new XoopsFormText("Reference""reference"50100); 

$prix= new XoopsFormText("Price","price",50,100); 

// 将组件添加到表单中 
$my_form->addElement($reference,true); 
$my_form->addElement($pricetrue); 

// 创建/添加按钮   
$button = new XoopsFormButton('''post'_SEND'submit'); 
$my_form->addElement($button); 

// 显示表单 
$my_form->display();
如你所见,到目前为止,这并非火箭科学!现在我们将修改XoopsThemeForm的行为——首先,我们在class目录下创建一个PHP文件,我们非常原始地将其命名为my_form.php 现在我们有了以下继承树:Resized Image为了让这个类继承自XoopsThemeForm(也可以称为扩展它),我们在PHP中写下
class MyForm extends XoopsThemeForm


?>
当然,要使这生效需要“子”类知道其“母”类在哪里(或者 knew where to find it),所以我们必须include_once类XoopsThemeForm
include_once(./../XoopsThemeForm.php

class 
MyForm extends XoopsThemeForm


?>
你也可以使用xoops_load,这对于你不知道类定义在哪个文件中很有帮助
定义 XOOPS_ROOT_PATH 或退出(('XOOPS_ROOT_PATH') or die('Restricted access'); 

加载 xoops_load('XoopsThemeForm');

class 
MyForm extends XoopsThemeForm {}
然后,您可以添加新的属性或方法,或者覆盖现有方法,这在本例中解释了“是否覆盖(覆盖)方法”。现在,我们将向我们的表单添加一个新的方法。当前 XoopsThemeForm 类在声明构造函数后不会更改表单的动作参数 - 此参数仅传递给构造函数一次,但我们需要能够根据用户的行为和使用表单的方式来更改它。因此,让我们添加一个方法
加载 xoops_load('XoopsThemeForm');

class 
MyForm extends XoopsThemeForm {

    private 
$newAction;

    public 
function setNewAction($url=null){

        if ($url===null){
               $this->newAction=$this->getAction();

        } 
        
        } 
}
?>
这个新方法(也称为“设置器”)在传递函数参数时将 URL 更改为新属性 $nowAction。重要说明:遗憾的是,xlabelForm 类没有优化,以供 UX 开发人员执行他们希望的操作。要完成此操作,需要将 xoopsForm 类的属性从“私有”改为“保护”(我指的是面向对象编程)或不为每个属性关联一个“设置器”和一个“获取器”。我不知道这种缺乏的原因。这将迫使我们重新定义 render() 函数。如果有“设置器”或属性被声明为“保护”,则不会需要这样做。重新定义了 render() 函数的类,我们用新的属性 $newAction 替换了 $this->getAction,这给了
xoops_load('XoopsThemeForm'); 

class 
MyForm extends XoopsThemeForm 

    private 
$newAction

     public function 
setNewAction($url=null){ 
         
            
$url===null?$this->newAction=$this->getAction():  $this->newAction=$action
   
        } 

    function 
render() 
    { 
        
$ele_name $this->getName(); 
        
$ret '$ele_name '" id="' $ele_name '" action="' $this->newAction'" method="' $this->getMethod() . '" onsubmit="return xoopsFormValidate_' $ele_name '();"' $this->getExtra() . '> 
             
            
$this->getTitle() . 
        '

        
$hidden ''
        
$class 'even'
        foreach (
$this->getElements() as $ele) { 
            if (!
is_object($ele)) { 
                
$ret .= $ele
            } else if (!
$ele->isHidden()) { 
                if (!
$ele->getNocolspan()) { 
                    
$ret .= ''
                    if ((
$caption $ele->getCaption()) != '') { 
                        
$ret .= '. ($ele->isRequired() ? '-required' '') . '">'
                        
$ret .= '$caption ''

                        
$ret .= '*'

                        
$ret .= '
'
                    }
 
                        如果 (( $描述  = $ele -> getDescription() ) != '') { 
                      $ret  .'$描述  .'
'
                    
$ret .= '. $class '">' $ele->render() '' NWLINE
                } 
$else 
                    $ret .= ''
                    if ((
$caption $ele ->getCaption()) != '') { 
                        
$ret .= '
. ($ele->isRequired() '-required''') . '">'
                        
$ret .= '$caption '
'

$ret .= '*';''

定义('XOOPS_ROOT_PATH') or die('受限访问'); 

class 
MyElement extends XoopsFormElement 
{      
    var 
$_content;
      
    function 
__construct($caption ''$value ''$name ''
    {
        
$this->setCaption($caption); 
        
$this->setName($name); 
        $this->_value $value;
    } 
    
    function 
setContent($content
    { 
        
$this->_content=$content;
         

    } 
    
    function getContent($encode=false){ 
         
        
        return 
$encode htmlspecialchars($this->_contentENT_QUOTES) : $this->_content;
         
    } 
    
    function 
render() 
    { 
        
$this->getContent(); 
    } 
     
    } 
   
?>
方法 setContent($content) 可以让我们插入内容。使用
$planchePhoto=new myElement();
$planchePhoto->setContent('photos'));
'); 现在我们创建了一个新的表单元素,将其添加到我们的表单中
$my_form->addElement($planchePhoto);
这样我们就向表单添加了一个新的条目。
评分 0/5
评分: 0/5 (0票)
投票已禁用!


Login

Who's Online

278 user(s) are online (18 user(s) are browsing Publisher)


Members: 0


Guests: 278


more...

Donat-O-Meter

Stats
Goal: $100.00
Due Date: Aug 31
Gross Amount: $0.00
Net Balance: $0.00
Left to go: $100.00
Make donations with PayPal!

Latest GitHub Commits

Categories