SugarCE问题点记录
问:如何获取module参数?如果module参数不存在,如何处理?
答:首先检查$_REQUEST['module'],然后再检查$sugar_config['default_module']是否有设置,如果都没有则用SugarApplication类的实例变量$default_module(默认为Home)。这些在SugarApplication::execute()函数的开头进行处理:
if (!empty($sugar_config['default_module']))
$this->default_module = $sugar_config['default_module'];
$module = $this->default_module;
if (!empty($_REQUEST['module']))
$module = $_REQUEST['module'];
问:获得module后,会去创建控制器类,在哪里找到该类?
答:ControllerFactory::getController($module)函数负责创建控制器类:
function getController($module) {
$class = ucfirst($module).'Controller';
$customClass = 'Custom' . $class;
if (file_exists('custom/modules/'.$module.'/controller.php')){
$customClass = 'Custom' . $class;
require_once('custom/modules/'.$module.'/controller.php');
if (class_exists($customClass)) {
$controller = new $customClass();
} else if (class_exists($class)) {
$controller = new $class();
}
} elseif (file_exists('modules/'.$module.'/controller.php')) {
require_once('modules/'.$module.'/controller.php');
if (class_exists($customClass)) {
$controller = new $customClass();
} else if (class_exists($class)) {
$controller = new $class();
}
} else {
if (file_exists('custom/include/MVC/Controller/SugarController.php')) {
require_once('custom/include/MVC/Controller/SugarController.php');
}
if (class_exists('CustomSugarController')){
$controller = new CustomSugarController();
} else {
$controller = new SugarController();
}
}
//setup the controller
$controller->setup($module);
}
从代码分析,ControllerFactory按照下列顺序寻找控制器类:
- custom/modules/{module}/controller.php,检查Custom{Module}Controller类是否存在,若不存在,再检查{Module}Controller类是否存在。
- modules/{module}/controller.php,检查Custom{Module}Controller类是否存在,若不存在,再检查{Module}Controller类是否存在。
- custom/include/MVC/Controller/SugarController.php,检查CustomSugarController类是否存在,若不存在,再检查SugarController类是否存在。
- include/MVC/Controller/SugarController.php,检查CustomSugarController类是否存在,若不存在,再检查SugarController类是否存在。
问:如何获取action参数?如果action参数不存在,如何处理?
答:action参数对应到SugarController的$action实例变量,该实例变量默认值为index:
class SugarController{
/**
* The name of the current action.
*/
public $action = 'index';
}
当控制器setup()时调用loadPropertiesFromRequest()获取$_REQUEST中的action参数:
public function setup($module = ''){
......
//set properties on the controller from the $_REQUEST
$this->loadPropertiesFromRequest();
//load the mapping files
$this->loadMappings();
} private function loadPropertiesFromRequest(){
if(!empty($_REQUEST['action']))
$this->action = $_REQUEST['action'];
if(!empty($_REQUEST['record']))
$this->record = $_REQUEST['record'];
if(!empty($_REQUEST['view']))
$this->view = $_REQUEST['view'];
if(!empty($_REQUEST['return_module']))
$this->return_module = $_REQUEST['return_module'];
if(!empty($_REQUEST['return_action']))
$this->return_action = $_REQUEST['return_action'];
if(!empty($_REQUEST['return_id']))
$this->return_id = $_REQUEST['return_id'];
}
也就是说,action参数首选会从$_REQUEST['action']获取,如果没有设置$_REQUEST['action']则使用SugarController的默认值index。
问:SugarController中如何装入Mapping文件?
答:控制器中有一个loadMapping()函数用来装入Mapping文件。该函数在控制器的setup()函数中被调用:
public function setup($module = ''){
......
//load the mapping files
$this->loadMappings();
} private function loadMappings(){
$this->loadMapping('action_view_map');
$this->loadMapping('action_file_map');
$this->loadMapping('action_remap', true);
}
控制器允许会从多个地方寻找Mapping文件:
private function loadMapping($var, $merge = false){
if ($merge && !empty($this->$var)){
$$var = $this->$var;
} else {
$$var = array();
}
if(file_exists('include/MVC/Controller/'. $var . '.php')){
require('include/MVC/Controller/'. $var . '.php');
}
if(file_exists('modules/'.$this->module.'/'. $var . '.php')){
require('modules/'.$this->module.'/'. $var . '.php');
}
if(file_exists('custom/modules/'.$this->module.'/'. $var . '.php')){
require('custom/modules/'.$this->module.'/'. $var . '.php');
}
if(file_exists('custom/include/MVC/Controller/'. $var . '.php')){
require('custom/include/MVC/Controller/'. $var . '.php');
} // entry_point_registry -> EntryPointRegistry
$varname = str_replace(" ","",ucwords(str_replace("_"," ", $var)));
if(file_exists("custom/application/Ext/$varname/$var.ext.php")){
require("custom/application/Ext/$varname/$var.ext.php");
}
if(file_exists("custom/modules/{$this->module}/Ext/$varname/$var.ext.php")){
require("custom/modules/{$this->module}/Ext/$varname/$var.ext.php");
} $this->$var = $$var;
}
loadMapping()函数在最后会将装入的Mapping映射为控制器的实例变量。
问:控制器中如何实现URL重定向?
答:SugarController中定义了一个实例变量redirect_url:
class SugarController {
/**
* url to redirect to
*/
public $redirect_url = '';
}
在Action方法中设置$redirect_url就可以实现URL重定向。例如:
function action_redirect() {
$this->redirect_url = 'http://www.baidu.com/';
|
这是因为SugarController使用execute()函数处理请求,在该函数末尾有检查$redirect_url是否有设值。若有设值,则调用SugarApplication::redirect()跳转:
final public function execute() {
try
{
$this->process();
if(!empty($this->view))
{
$this->processView();
}
elseif(!empty($this->redirect_url))
{
$this->redirect();
}
}
catch (Exception $e)
{
$this->handleException($e);
}
} protected function redirect(){
if (!empty($this->redirect_url))
SugarApplication::redirect($this->redirect_url);
}
如果不在控制器中要实现URL重定向,就应该用SugarApplication::redirect()函数。
问:控制器如何自动读取Bean?
答:如果请求参数中有record存在,则SugarController会自动读取后台数据到实例变量$bean中。首先控制器要从$_REQUEST获取record参数到$this->record:
public function setup($module = ''){
......
//set properties on the controller from the $_REQUEST
$this->loadPropertiesFromRequest();
} private function loadPropertiesFromRequest(){
......
if(!empty($_REQUEST['record']))
$this->record = $_REQUEST['record'];
}
然后,控制器在处理请求时通过在process()函数中调用loadBean()实现读取Bean:
public function process(){
......
$this->loadBean();
} public function loadBean()
{
if(!empty($GLOBALS['beanList'][$this->module])){
$class = $GLOBALS['beanList'][$this->module];
if(!empty($GLOBALS['beanFiles'][$class])){
require_once($GLOBALS['beanFiles'][$class]);
$this->bean = new $class();
if(!empty($this->record)){
$this->bean->retrieve($this->record);
if($this->bean)
$GLOBALS['FOCUS'] = $this->bean;
}
}
}
}
从loadBean()代码可以发现,要自动装入Bean需要定义$GLOBALS['beanList']和$GLOBALS['beanFiles']。默认的定义在include/modules.php:
// index.php
// require_once('include/entryPoint.php')
// require_once('include/modules.php'); $beanList['Leads'] = 'Lead';
$beanFiles['Lead'] = 'modules/Leads/Lead.php';
问:控制器如何处理action_remap?
问:控制器如何处理action_file_map和action_view_map?
问:控制器如何检查用户请求的权限?例如谁人可以执行数据库的备份和恢复处理?
SugarCE问题点记录的更多相关文章
- 记一次debug记录:Uncaught SyntaxError: Unexpected token ILLEGAL
在使用FIS3搭建项目的时候,遇到了一些问题,这里记录下. 这里是发布搭建代码: // 代码发布时 fis.media('qa') .match('*.{js,css,png}', { useHash ...
- nginx配置反向代理或跳转出现400问题处理记录
午休完上班后,同事说测试站点访问接口出现400 Bad Request Request Header Or Cookie Too Large提示,心想还好是测试服务器出现问题,影响不大,不过也赶紧上 ...
- Kali对wifi的破解记录
好记性不如烂笔头,记录一下. 我是在淘宝买的拓实N87,Kali可以识别,还行. 操作系统:Kali 开始吧. 查看一下网卡的接口.命令如下 airmon-ng 可以看出接口名称是wlan0mon. ...
- 2015 西雅图微软总部MVP峰会记录
2015 西雅图微软总部MVP峰会记录 今年决定参加微软MVP全球峰会,在出发之前本人就已经写这篇博客,希望将本次会议原汁原味奉献给大家 因为这次是本人第一次写会议记录,写得不好的地方希望各位园友见谅 ...
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- 我是如何在SQLServer中处理每天四亿三千万记录的
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
- 前端学HTTP之日志记录
前面的话 几乎所有的服务器和代理都会记录下它们所处理的HTTP事务摘要.这么做出于一系列的原因:跟踪使用情况.安全性.计费.错误检测等等.本文将谥介绍日志记录 记录内容 大多数情况下,日志的记录出于两 ...
- ASP.NET Core应用中如何记录和查看日志
日志记录不仅对于我们开发的应用,还是对于ASP.NET Core框架功能都是一项非常重要的功能特性.我们知道ASP.NET Core使用的是一个极具扩展性的日志系统,该系统由Logger.Logger ...
- python+uwsgi导致redis无法长链接引起性能下降问题记录
今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...
随机推荐
- 关于oracle存储过程需要注意的问题
在使用oracle存储过程时,有一些需要注意的地方,下面就来总结一下. 1.在oracle的存储过程中,数据表别名不能加as 也许是为了区分存储过程中的as,怕与过程中的as冲突. 如: select ...
- 手机发送验证码—.net代码
注册过程中,短信发送验证码流程如下: (1).用户提交手机号码,申请湖区验证码 (2).网站按照预制规则生成验证码 (3).网站将用户手机号码和验证码发送到短信平台 (4).将制定内容发送到制定手机号 ...
- JDBC 编程
DAO设计 没有使用DAO存在的问题:多个地方都要都同时做CRUD操作时,重复的代码就会很多. DAO:Data Access Object(数据存取对象). 位于业务逻辑和持久化数据之间,实现对持久 ...
- 【ZJOI2017】线段树
题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的 功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜又开始研究起线段树来了,有所不同的是,她把目光放 ...
- 【线段树】HDU1394 - Minimum Inversion Number
[题目大意] 给出0..n-1组成的一段数,可以移动前几个数到结尾.求出最小的逆序对个数. [思路] 先用线段树求出逆序对,方法和树状数组是一样的.然后对于当前第一个数num[0],在它之后比它小的数 ...
- JDK源码学习笔记——LinkedHashMap
HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序. LinkedHashMap保证了元素迭代的顺序.该迭代顺序可以是插入顺序或者是访问顺序.通过维护一个 ...
- ie8下使用bootstrap不能显示icon的图标
写在前面: 在做项目的时候,就一直使用的火狐浏览器是开发的,但是放到了ie8上运行的时候,就弄得class样式为icon的图标无法显示出来.所以就要改改改!!! 这里本项目中的代码: <smal ...
- [转]MySQL与Oracle的语法区别详细对比
Oracle和mysql的一些简单命令对比 1) SQL> select to_char(sysdate,'yyyy-mm-dd') from dual; SQL> select to_c ...
- Codeforces Round #114 (Div. 1) C. Wizards and Numbers 博弈论
C. Wizards and Numbers 题目连接: http://codeforces.com/problemset/problem/167/C Description In some coun ...
- 兼容IE8
由于IE8不支持HTML5,而它又是Win7的默认浏览器,我们即使讨厌它,在这几年却也拿它没办法. 最近做了个需要兼容IE8的项目,不可避免地用了HTML5+CSS3,甚至canvas和svg,做兼容 ...