'u','plugin'=>'d')); //User must have user update right and delete plugin right to perform this action
     * ```.
     *
     * @param function action/code to execute
     * @param array Array wich contain right to execute action
     *
     * @return print json response
     */
    public static function write($f, $p=array()) {
        global $myUser;
        header('content-type:application/json');
        $response = array();
        set_error_handler(function ($level, $error, $file, $line) { throw new Exception($error." \r\n\r\n  ".$file.' - L '.$line.'');});
        try {
            foreach ($p as $scope => $right) {
                if (!$myUser->can($scope, $right)) throw new Exception('Vous ne disposez pas des droits suffisants pour effectuer cette action');
            }
            $f($response);
        } catch (Exception $e) {
            $response['error'] = $e->getMessage();
            $response['errorCode'] = $e->getCode();
            $response['trace'] = exception_trace($e);
            if($myUser->superadmin || $_SERVER['HTTP_HOST'] == '127.0.0.1'){
                $traces = $e->getTrace();
                $traceIndex = 0;
                //Si c'est une erreur de bound sql / data  ou une erreur de syntaxe sql
                if($e->getCode() == 'HY093' || $e->getCode() == '42000'){
                    //On recupere la premiere trace qui n'est pas Entity ou Action (trace significative)
                    foreach($traces as $i => $currentTrace){
                        if(isset($currentTrace['file']) && in_array(basename($currentTrace['file']), array('Entity.class.php','Action.class.php'))) continue;
                        $traceIndex = $i;
                        break;
                    }
                    //On affiche la requete et les datas
                    if(isset($traces[1]) && $traces[1]['function']=='customQuery'){
                        if(isset($traces[1]['args'])) $response['error'] .= ''.(is_string($traces[1]['args'][0]) ? $traces[1]['args'][0]:json_encode($traces[1]['args'][0])).'';
                        if(isset($traces[1]['args']) && isset($traces[1]['args'][1])){
                            $plainTrace = $traces[1]['args'][1];
                            if(is_array($plainTrace)) $plainTrace = implode(',',$plainTrace);
                            if(is_object($plainTrace)) $plainTrace =  implode(',',(array)$plainTrace);
                            $response['error'] .= '
['.$plainTrace.']';
                        }
                    }
                }
                $response['line'] = isset($traces[$traceIndex]['line']) ? $traces[$traceIndex]['line'] : 0;
                $response['file'] = isset( $traces[$traceIndex]['file'])? $traces[$traceIndex]['file'] : '';
                $response['trace'] = ''.exception_trace($e).''; } } echo json_encode($response); restore_error_handler(); } public static function register($name,$f) { $GLOBALS['actions'][$name] = $f; } public static function run($name, &$response) { if(!isset($GLOBALS['actions'][$name])) return; $functionName = $GLOBALS['actions'][$name]; call_user_func_array($functionName, array(&$response)); } }