http://localhost/mediawiki/index.php/Special:Upload
在每执行如上所示的url时:
入口: index.php
在require_once( "$preIP/includes/WebStart.php" )时,
执行require_once( "$IP/includes/Setup.php" )
在Setup.php文件里, 初使化$wgRequest, $wgTitle等全局变量对象
$mediaWiki = new MediaWiki(); 生成 mediawiki 对象, 可以理解是 整个网页.
Index.php里执行初使化.
$mediaWiki->initialize( $wgTitle, $wgArticle, $wgOut, $wgUser, $wgRequest );
在initialize中调用 initializeSpecialCases()
在initializeSpecialCases()中有代码如下:(我这里是 223行开始)
else if( NS_SPECIAL == $title->getNamespace() ) {
/* actions that need to be made when we have a special pages */
SpecialPage::executePath( $title );
}
此时的 $title 的namespace 为 NS_SPECIAL($title已根据url生成)
执行 SpecialPage::executePath( $title );这个函数在 SpecialPage.php中
* SpecialPage: handling special pages and lists thereof.
这个函数又调用 $page->execute( $par ); 也是在 SpecialPage.php文件里.
在这个函数里, 注意有一个 call_user_func( $func, $par, $this ); 他调用 $func指定的 函数. call_user_func函数可参考php手册.
能过 dubugger可发现, 此时, 这个 $func正是: wfSpecialUpload
通过这种方式, 就转到 SpecialUpload.php这个文件上里了.
在分析wfSpecialUpload()这个函数:
function wfSpecialUpload() {
global $wgRequest;
$form = new UploadForm( $wgRequest );
$form->execute();
}
他根据$wgRequest生成一个新 form类, 这个form类就是 实际 显示的那个 表单类.
追踪$form->execute();这个函数:
这倒数几行: 有代码:
else if( 'submit' == $this->mAction || $this->mUploadClicked ) {
$this->processUpload();
} else {
$this->mainUploadForm();
}
第一个if里面, 有个submit 显然这是 执行 上传文件.
而第二个 mainUploadForm(), 进入这个函数, 可以发现 里面都是 addHtml函数. 也就是 翱翔 修改过的, 在里面 加入 <input…> 等.
简单的说: processUpload() 执行upload过程, 而 mainUploadForm生成 html的表单.
也就是说, 在点击upload那个button时, 执行的还是 那个 页面. 而只不过里面的参数通过 变化, 最后执行的 函数不一样而以.
在processUpload()中, 调用internalProcessUpload()函数, 这里 应该就是 upload的细节部分.