教程:教程:如何更新表格以遵循XOOPS的新命名方案?

发布者: MambaOn 2013/3/5 4:20:00 6457次阅读
如您可能已知道,我们现在致力于标准化模块开发——从使用相同的模块Admin GUI结构,到使用跨所有模块相同的图标,从为每个表格使用相同的分页结构,到以一致的方式命名表和字段(参见此帖)。本教程将向您展示如何修改您的模块,使其在用户更新模块时能够在用户网站上重命名表。这将遵循由alain01提出的方案新的表命名方案是:mod_AAA_BBBB,其中AAA是模块名称,BBB是表名。例如,在我们的新闻模块中有一个名为"topics"的表,在新闻的新更新版本中,它将变为:mod_news_topics以下是一些步骤,这最近在名为"animal"的谱系模块中使用:1) 新版本必须在SQL文件中正确定义表,以便新的安装能够立即安装正确的表。2) 在现有的安装中,用户通常复制文件,然后在管理员中运行"更新"。因此,我们需要添加一个包含更新的文件,我们将其称为"update_function.php",并将其放置在"include"文件夹中。3) 为了让XOOPS调用此文件,我们将在xoops_version.php文件中添加以下内容:
$modversion['onUpdate'] = 'include/update_function.php';
4) 在该文件中,我们首先添加一个函数来检查我们想要重命名的表是否实际存在。这是通过使用Hervet创建的函数实现的
函数 tableExists($tablename)
{
    global 
$xoopsDB;
    
$result=$xoopsDB->queryF("SHOW TABLES LIKE '$tablename'");
    return(
$xoopsDB->getRowsNum($result) > 0);
}
5) 然后,我们添加一个函数,该函数将在我们点击更新按钮时执行
函数 xoops_module_update_animal()
{
    global 
$xoopsDB;

    if (
tableExists($xoopsDB->prefix('eigenaar'))) {
        
$sql    sprintf(
            
'ALTER TABLE ' $xoopsDB->prefix('eigenaar') . ' RENAME ' $xoopsDB->prefix('mod_pedigree_owner')
        );
        
$result $xoopsDB->queryF($sql);
        if (!
$result) {
            echo 
'_AM_PED_UPGRADEFAILED ' ' _AM_PED_UPGRADEFAILED2;
            
$errors++;
        }
    }
    return 
TRUE;
}
在上面的代码中,我们正在检查“eigenaar”是否存在,如果存在,则将其重命名为“mod_pedigree_owner”。当然,这是针对我们要重命名的每个表执行的。6)我们还需要将代码中所有的表名都进行重命名。a)作为第一步,我们可以使用搜索并替换,将“prefiix”作为搜索的一部分,所以在我们这个例子中,我们将:prefix("eigenaar") 替换为:prefix("mod_pedigree_owner")。这是对于按照传统方式调用表的情况。b)但人们都很富有创造力,可能存在不同的情况,因此没有任何方法可以拯救我们,我们必须进行测试,并最终在所有文件中搜索“eigenaar”这个词,并作出判断如果是表名则需要重命名。新的命名方案将使得以下两点更容易:- 在phpMyAdmin(或任何其他数据库工具)中,所有模块中的表将分组在一起显示。- 核心表将与之区分。- 在代码中,只需搜索“mod_MODULENAME”就能轻松找到表。在不久的将来,我们还将汇总我们模块中典型字段的名称和特性,并提供指南。当你查看我们的模块时,相同的字段在不同的模块中可能有不同的名称。以“组ID”为例,它可能是:gid、g_id、group_id、gr_id等。如果你试图维护别人的模块,我们会浪费很多时间试图弄清楚特定字段的实际用途。如果你对此教程有改进意见,请告诉我们。最重要的是:- 如果你可以帮助我们精简和标准化模块开发,我们将非常感激。- 如果你喜欢某个特定模块的某个功能,并认为其他模块也应该这样做,请告诉我们。- 如果你看到其他开源项目中有一些酷的功能,认为XOOPS会从中受益,也请告诉我们。请在这里跟帖