Friday, July 23, 2010

sugarcrm logic hook problem

I created an after_save logic hook for Lead. My SugarCRM is version 5.5.2 and the function is quite simple:
function runMeAfterSave(SugarBean $bean, $event, $arguments)
{
if ($bean->first_name == 'someone') {
//do some tasks
}
}

The function works very well on my localhost. When i put it on another server, however, it doesn't work at all. So, i var_dump($bean->first_name), and it turns out to be NULL all the time, no matter what value i enter into first name field. I var_dump some other fields and get NULL as well. The server SugarCRM version is 5.5.3. I can't find any reason why it can't work.

Finally, i try var_dump($bean->id). This time i'm lucky! I can get its ID! So i add one line in my code: $bean->retrieve($bean->id) and everything works fine now.

Later I found a thread on SugarCRM forum regarding this issue http://panther.sugarcrm.com/forums/showthread.php?t=44872. It says "The problem was that after_save, the bean discards all the new field info. So we needed to use $bean->retrieve($bean->id); to get it back"

Thursday, July 8, 2010

sugarcrm warning message

I created a new module. When i save a new entry, sugarcrm will show this message:
Warning: preg_match() expects parameter 2 to be string, array given in /var/www/crm/include/utils.php on line 1715

Call Stack
# Time Memory Function Location
1 0.0000 72612 {main}( ) ../index.php:0
2 0.0001 73516 require_once( '/var/www/crm/include/entryPoint.php' ) ../index.php:38
3 0.0019 214344 clean_incoming_data( ) ../entryPoint.php:124
4 0.0067 235068 clean_string( ) ../utils.php:1797
5 0.0068 235120 preg_match ( )
../utils.php:1715

So I traced the code back to line 1797 in utils.php, and found this code "if (isset($_REQUEST['language'])) clean_string($_REQUEST['language']);".

Actually in this new module, i created a field called 'language' and it is MultiSelect type, which is an array. After i change the field name, this warning message disappeared.

Sunday, April 4, 2010

DON'T USE 'CREATE TABLE XXX SELECT * FROM YYY' TO BACKUP AN INNODB TABLE

The reason is simple: the backup table will lose all key/index attributes from the original innodb table.

Monday, March 22, 2010

Replace built-in PHP fatal errors with exceptions

We may want to use Exception instead of php4 style error handling systems to make error handling more consistent. We can build a bridge from old error handling to the new Exception handling.

class PhpErrorException extends Exception {}

function errorHandler($errno, $errstr, $errfile, $errline) {
throw new PhpErrorException ($errstr,$errno);
}

$handler= set_error_handler('errorHandler');

Now you can test it. For example: run echo 5/0; and you will see an exception is thrown instead that a PHP warning is given off.

Friday, March 19, 2010

memory usage in PHP

A very excellent blog about PHP memory usage: http://blog.preinheimer.com/index.php?/archives/354-Memory-usage-in-PHP.html

Unlike C/C++ developers, most PHP developers never think about memory management in PHP. It is true that PHP can free the memory after a request is processed. However, if you use PHP to process critical tasks with large amount of data, you'd better read this blog carefully, and test its memory-usage-example.php by yourself. You will see how different it is.

Monday, March 8, 2010

新版(浙版)西游记

张纪中拍的. 因为勾起了对儿时西游记的怀念, 就买了下来. 正如网上评价的, 不愧是2010年第一部雷人剧集.

白骨精是孙悟空的结拜兄妹, 最后为爱自尽.

最让我羡慕的是那个如来佛祖啊,座下美女菩萨如云: 观音, 文殊, 普贤, 全是美女. 看了真让人有恨不得早日成佛的感觉.

呵呵, 总的来说, 这部西游记作为无聊时的消遣也是可以的. 但是要和六小龄童演的西游记比起来, 考虑到时代和技术的进步, 实在是看不出新版的西游记有什么突破的地方.

哦, 对了, 剧中大牌明星云集: 唐国强是玉皇大帝, 陈冲是观音, 总而言之, 本剧可作消遣和笑料, 但成不了经典.

Tuesday, March 2, 2010

Interesting issue of Zend_Request Object

See the code below:
class TestController extends Zend_Controller_Action
{
public function testAction()
{
$params = $this->getRequest()->getParams();
}
}

It tries to get all parameters of a request. In most situations, it works fine. However, if the request contains a parameter like '?action=subscribe', and you try to get $action = $params['action']. Now, what do you think is the value of $action? If you say, it must be 'subscribe', then you are wrong.

How come this happen? The answer is, Zend_Request object set 3 default parameters: 'module', 'controller' and 'action', and they will overwrite the identified variables in the request. Back to the code above, if you var_dump($params), you probably will see the result like:
array(3) {
['module'] => string(7) "default"
['controller'] => string(5) "test"
['action'] => string(5) "test"
}

As you can see, the value of $action will be 'test'. What if we try to do $action = $this->getRequest()->getParam('action')? This doesn't help either, the value of $action is still 'test' instead of 'subscribe'. Same applies to $this->_getAllParams() and $this->_getParam().

So how do we get the correct value of action in the request? The answer is, for a POST request, we must exactly use $this->getRequest()->getPost('action'); for a GET request, we must use $this->getRequest()->getQuery('action')