登录 注册

登录

问题 关于JTable里面的load()函数,请老白或其他高人指点

更多
2008年10月08日 08:35 #1 作者: h2mao
研究Joomla两周,越来越感觉到其架构的强大和可扩展

在尝试自己写componet,并进行Edit类型的操作时,遇到问题如下:

一般Edit都会根据一个Key(通常是int型的ID)来定位相对应的那条数据
$row =& JTable::getInstance('YourDataTable', 'Table');
$row->load( $id );

在key为int的数据表测试成功


但是,当key是其他类型(比如字符型),却会出错
Fatal error: Call to a member function load() on a non-object in /www/joomla/administrator/components\com_videos/controllers/video.php on line 146

Google了半天,只找到JTable的简单说明,没有Load()的详细释义


不知道该如何解决此问题,是否需要重构JTable?或者其他方式

登录 或者   注册一个会员帐号 来参与讨论

更多
2008年10月08日 09:56 #2 作者: huayicai
这样就可以了
$row =& JTable::getInstance('YourDataTable', 'Table');
$row->load( (int)$id );

登录 或者   注册一个会员帐号 来参与讨论

更多
2008年10月08日 12:25 #3 作者: h2mao
因为这个key是一串字符串(领导做的结构,应该由他的道理,我们暂不考虑更换结构)

举个具体的值作为例子更容易理解

比如某记录中id的值是:28C006F7-188B-BFC9-09D85C954F7AA3A8

强制转换的结果是28


应该不是这种解决方案


Anyway,很感谢huayicai

继续请教

登录 或者   注册一个会员帐号 来参与讨论

更多
2008年10月08日 12:55 #4 作者: huayicai

因为这个key是一串字符串(领导做的结构,应该由他的道理,我们暂不考虑更换结构)

举个具体的值作为例子更容易理解

比如某记录中id的值是:28C006F7-188B-BFC9-09D85C954F7AA3A8

强制转换的结果是28


应该不是这种解决方案


Anyway,很感谢huayicai

继续请教


Joomla 支持的是 id 为 auto_increment 的字段,如果要使用你那种方式,自己做扩展是一个方法

登录 或者   注册一个会员帐号 来参与讨论

更多
2008年10月08日 13:03 #5 作者: h2mao
我对OOP不是很熟悉

应该如何将Tables重构和具体应用,能否指点一二?

我对比banner的components,看到\administrator\components\com_banners\tables下面有个banner.php

定义了class TableBanner extends JTable

但是具体怎么应用,没有看明白

还望指点





另外,刚才查阅了joomla的官方手册
dev.joomla.org/component/option,com_jd-wiki/Itemid,/id,references:joomla.framework:table:jtable-load/

里面这样说的:
load

Loads a row from the database and binds the fields to the object properties.

This method will retrieve the specified record from the database and copy those values into the object properties using the bind() method. If no $oid parameter is supplied, the method will attempt to load a record using the current value of the primary key field.

Syntax

boolean load ( $oid )
关于load的函数和变量说明
$oid mixed(混合型,说明字符串是可以的
is a variable containing the primary key value of the record to load. This parameter is optional and if omitted defaults to the current key.

登录 或者   注册一个会员帐号 来参与讨论

更多
2008年10月08日 13:24 #6 作者: huayicai
JTable 中的load 方法最后实现的query的代码:

$query = 'SELECT *'
. ' FROM '.$this->_tbl
. ' WHERE '.$this->_tbl_key.' = '.$db->Quote($oid);
$db->setQuery( $query );

所以如果你要使用字符串类型的话,我建议你继承 JTable 类,重载 load 或者 最好就是增加自己的方法实现。然后使用你自己继承的类来操作,思路是这样,实现你可能要花点时间看看代码了。

登录 或者   注册一个会员帐号 来参与讨论

更多
2008年10月08日 13:40 #7 作者: h2mao
可能需要使用继承类

不过我现在不太明白joomla的规范是怎样的


我检查banner的目录,发现如下子目录
|----controllers
|----elements
|----helpers
|----tables
|----views

我能看到views里面的文件是被某些文件require_once的

而tables里面的文件在admin.banners.php里面有这样一个定义(我用工具查了整个banners目录,只有此文件提及tables里面的文件),语句如下:
JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_banners'.DS.'tables');

是否tables目录中名字为banner.php所包含的重构或其他函数定义,就自动成为JTable重构的默认文件?

登录 或者   注册一个会员帐号 来参与讨论

更多
2008年10月08日 13:46 #8 作者: huayicai
JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_banners'.DS.'tables');

这句只是把你写的表映射类都包含进来而已,以便你以后使用。

你继承后的自己的table类,在使用的时候包含进来就可以了,就可以直接像这样使用:

$row =& JTable(替换为你继承后的类名)::getInstance('YourDataTable', 'Table');
$row->load( $id );

登录 或者   注册一个会员帐号 来参与讨论

更多
2008年10月09日 09:12 - 2008年10月09日 12:49 #9 作者: h2mao
我仅仅只是定义了一下administrator\components\com_videos\tables\video.php

居然过了


代码如下,省略其他雷同的内容
<?php

class TableVideo extends JTable {
var $id=null;
var $otherdata=null;
        ......

function __construct( &$database ) {
    parent::__construct( '#__video', 'id', $database );

}
}


完全不理解,因为我并没有定义$id有什么特殊
对比Joomla内置的component
在tables路径下的xxx.php定义中
id也是同样的代码,只是申明了一下,没有任何特殊处理?!




接下来的问题是

点击edit可以继续,并且显示出正确的数据信息

但apply和save两个button没有任何反应

继续查看submitform( pressbutton )

不知道能否找出原因
最后修改: 2008年10月09日 12:49 由 wuya51.

登录 或者   注册一个会员帐号 来参与讨论

更多
2008年10月09日 12:45 #10 作者: h2mao
问题解决,是javascript里面存在多余变量检测

至此,大部分问题已经解决


但是。。。。还是不理解
为何JTable重构的时候,定义一下数据库就ok了?!
我什么也没有做啊?!



??? ???

登录 或者   注册一个会员帐号 来参与讨论

更多
2008年11月24日 11:54 #11 作者: bogardan
我也在摸索他的这段内容,实在不行,就自己重写过。

登录 或者   注册一个会员帐号 来参与讨论