很多童鞋要开始自己尝试写一个新的module了,但是发现所有的module都是从这个module类上面扩展的,这里就给大家讲解一下class/module.php这个module的基类

这个类是一个基类,自己不能被初始化,必须被扩展

abstract class Module

ORM的理论,一个类就是一个当前module对象,有自己的id等参数,也有自己的install、uninstall等方法

public $id = NULL;
...

构造函数,有一个参数就是本module的名字,这个函数功能就是初始化,把一个名字变成一个真正的对象

public function __construct()

仅仅是数据库操作而已,童鞋在写新module的时候,可以在这里面调用添加数据库等语句完成个性的安装和卸载操作

public function install()
public function uninstall()

hook在哪里?也仅仅是数据库操作而已,这些一般不在自定义module中使用

public function registerHook($hook_name)
public function unregisterHook($hook_id)

表单上的小旗,为了多语言准备的

public function displayFlags

这是错误信息,就像要求你输入paypal或者google的帐号的那种,显示在modules首页的那个,这些一般不在自定义module中使用

public function unregisterExceptions($hook_id)
public function registerExceptions($id_hook, $excepts)
public function editExceptions($id_hook, $excepts)
public function displayError($error)//这个和displayConfirmation是格式化配置里面返回的信息的,比如设置成功之类的
public function displayConfirmation($string)
public function getExceptions($id_hook)

设计模式中的单例模式,返回一个单例

static public function getInstanceByName($moduleName)
static public function getInstanceById($id_module)

这是显示后台那个列表的

public static function getModulesOnDisk()
public static function getModulesDirOnDisk()
public static function getModulesInstalled($position = 0)

在前台经常可以看到这个,执行hook在某部份的所有module,其实就是从数据库里读取一下然后执行而已

public static function hookExec($hook_name, $hookArgs = array(), $id_module = NULL)

支付的执行,支付虽然也是modules的一部分,但是是比较特殊的一部分

public static function hookExecPayment()

翻译,我会单独写一篇关于prestashop翻译过程的文章

public function l($string, $specific = false)

hook中的排序

public function updatePosition($id_hook, $way, $position = NULL)
public function cleanPositions($id_hook)
public function getPosition($id_hook)

显示,自定义的module中经常要扩展的

public static function display($file, $template)

验证是否是一个module

public static function isInstalled($moduleName)

下面,我做一个module的示例,这个示例的名字叫examplemodule,这个module可以在页面指定位置显示一些静态文字

新建一个examplemodule文件夹在modules目录下面,这个文件中要包含examplemodule.php,examplemodule.tpl(如果需要输出),logo.gif

打开examplemodule.php,写

<?php
class ExampleModule extends Module
{
    private $_html;//有的模块有配置的页面,那个页面的html都在这个变量里面
 
    public function __construct()
    {
        $this->name = 'examplemodule';//名字必须和文件夹名一样
        $this->tab = 'Blocks';//属于Blocks分类下面的
        $this->version = 1.1;//版本,随便写
 
        parent::__construct();//这个一定要有,而且必须在上面那些的下面,__construct里面的内容顺序不能改
 
        $this->displayName = $this->l('我是新的示例模块');//名字,显示在外面的
        $this->description = $this->l('这个module可以在页面指定位置显示一些静态文字');//说明
    }
 
    function install()
    {
        if (!parent::install())
            return false;
        return $this->registerHook('LeftColumn');
    }
 
    function getContent()//有这个,就有配置那个链接
    {
        $this->_html = '<h2>'.$this->displayName.'</h2>';
 
        if (isset($_POST['content'])){
            Configuration::updateValue('EXAMPLE_MODULE', $_POST['content']);
            $this->_html .= $this->displayConfirmation('成功保存');
        }
 
        $this->_displayForm();
        return $this->_html;
    }
 
    private function _displayForm()//表单
    {
        global $cookie;
 
        $this->_html .=
        '<form action="'.$_SERVER['REQUEST_URI'].'" method="post">
            <fieldset>
            <legend>配置</legend>
                <p>内容:<input type="text" name="content" value="'.Configuration::get('EXAMPLE_MODULE').'"></p>
                <p><input type="submit" name="btnSubmit" class="button" value="'.$this->l('确定').'"></p>
            </fieldset>
        </form>';
 
    }
 
    function hookLeftColumn($params)//hook在左边
    {
        global $smarty;
        $smarty->assign('html', Configuration::get('EXAMPLE_MODULE'));
        return $this->display(__FILE__, 'examplemodule.tpl');
    }
 
    function hookRightColumn($params)//hook在右边,和左边一样,直接执行左边的内容
    {
        return $this->hookLeftColumn($params);
    }
}//注意这里没有php的结束符?>,是因为安全性。这样怎么就安全了呢?想不明白来信问我把,哈哈

打开examplemodule.php,写

<p>{$html}</p>

最后,别忘了保存成utf8的编码