Changeset 3125

Show
Ignore:
Timestamp:
06/04/07 17:27:27 (3 weeks ago)
Author:
demian
Message:

bugfix to trunk merge -3

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/lib/SGL/Emailer.php

    r2425 r3125  
    134134        $mime->setHTMLBody($this->html); 
    135135        if (!empty($this->options['filepath'])) { 
    136             $mime->addAttachment($this->options['filepath'],$this->options['mimetype']); 
     136            if (!is_array($this->options['filepath'])) { 
     137                //single attachment 
     138                $mime->addAttachment($this->options['filepath'],$this->options['mimetype']); 
     139            } else { 
     140                //multiple attachments 
     141                $count_f = count($this->options['filepath']); 
     142                $count_m = count($this->options['mimetype']); 
     143                //$mimetype =''; 
     144                for ($i = 0; $i < $count_f; $i++) { 
     145                    //multiple mime-types?? 
     146                    if ($count_m == $count_f) { 
     147                        $mimetype =  $this->options['mimetype'][$i]; 
     148                    } else { 
     149                        if (is_string($this->options['mimetype'])) { 
     150                            $mimetype = $this->options['mimetype']; 
     151                        } else { 
     152                            $mimetype = $this->options['mimetype'][0]; 
     153                        } 
     154                    } 
     155                    $mime->addAttachment($this->options['filepath'][$i], $mimetype); 
     156                } 
     157            } 
    137158        } 
    138159        // Add Cc-address 
     
    141162        } 
    142163        $body = $mime->get(array( 
     164            'head_encoding' => 'base64', 
    143165            'html_encoding' => '7bit', 
    144166            'html_charset' => $GLOBALS['_SGL']['CHARSET'], 
     
    153175 
    154176    // PEAR Mail::factory wrapper 
    155     function factory() 
     177    function &factory() 
    156178    { 
    157179        SGL::logMessage(null, PEAR_LOG_DEBUG); 
  • trunk/lib/SGL/Error.php

    r1993 r3125  
    8080     * Remove first error off stack. 
    8181     * 
    82      * @return unknown 
     82     * @return PEAR_Error 
    8383     */ 
    8484    function shift() 
     
    9090    { 
    9191        return end($GLOBALS['_SGL']['ERRORS']); 
     92    } 
     93 
     94    /** 
     95     * Reset error stack to empty array. 
     96     * 
     97     * @return boolean 
     98     */ 
     99    function reset() 
     100    { 
     101        unset($GLOBALS['_SGL']['ERRORS']); 
     102        $GLOBALS['_SGL']['ERRORS'] = array(); 
     103        return true; 
    92104    } 
    93105 
     
    139151            SGL_ERROR_INVALIDTYPE       => 'invalid type', 
    140152            SGL_ERROR_RECURSION         => 'recursion', 
     153            SGL_ERROR_RESOURCENOTFOUND  => 'page not found', 
    141154        ); 
    142155        if (in_array($errorCode, array_keys($aErrorCodes))) { 
  • trunk/lib/SGL/ErrorHandler.php

    r2484 r3125  
    157157                $output = <<<EOF 
    158158<hr /> 
    159 <div class="errorContent"> 
     159<div id="errorWrapper" class="errorContent"> 
    160160        <strong>MESSAGE</strong>: $errStr<br /> 
    161161        <strong>TYPE:</strong> {$this->errorType[$errNo][0]}<br /> 
     
    191191                //  get extra info 
    192192                $dbh = & SGL_DB::singleton(); 
    193                 $lastQuery = $dbh->last_query; 
     193 
    194194                $aExtraInfo['callingURL'] = $_SERVER['SCRIPT_NAME']; 
    195195                $aExtraInfo['lastSQL'] = isset($dbh->last_query) ? 
    196196                    $dbh->last_query : null; 
    197197                $aExtraInfo['userID'] = SGL_Session::get('uid'); 
    198                 $aExtraInfo['clientData']['HTTP_REFERER'] = $_SERVER['HTTP_REFERER']; 
    199                 $aExtraInfo['clientData']['HTTP_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT']; 
    200                 $aExtraInfo['clientData']['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR']; 
    201                 $aExtraInfo['clientData']['SERVER_PORT'] = $_SERVER['SERVER_PORT']; 
     198                $aExtraInfo['clientData']['HTTP_REFERER'] = isset($_SERVER['HTTP_REFERER']) 
     199                    ? $_SERVER['HTTP_REFERER'] 
     200                    : null; 
     201                $aExtraInfo['clientData']['HTTP_USER_AGENT'] = isset($_SERVER['HTTP_USER_AGENT']) 
     202                    ? $_SERVER['HTTP_USER_AGENT'] 
     203                    : null; 
     204                $aExtraInfo['clientData']['REMOTE_ADDR'] = isset($_SERVER['REMOTE_ADDR']) 
     205                    ? $_SERVER['REMOTE_ADDR'] 
     206                    : null; 
     207                $aExtraInfo['clientData']['SERVER_PORT'] = isset($_SERVER['SERVER_PORT']) 
     208                    ? $_SERVER['SERVER_PORT'] 
     209                    : null; 
    202210 
    203211                //  store formatted output 
    204                 ob_start(); 
    205                 print_r($aExtraInfo); 
    206                 $info = ob_get_contents(); 
    207                 ob_end_clean(); 
     212                $info = print_r($aExtraInfo, true); 
    208213 
    209214                //  rebuild error output w/out html 
  • trunk/lib/SGL/FrontController.php

    r2425 r3125  
    4242require_once dirname(__FILE__)  . '/Task/Init.php'; 
    4343 
    44  
    4544/** 
    4645 * Application controller. 
     
    5352{ 
    5453    /** 
     54     * Allow SGL_Output with its template methods to be extended. 
     55     * 
     56     * Remember to add your custom include path to the global config, ie a class 
     57     * called FOO_Output will be discovered if it exists in seagull/lib/FOO/Output.php. 
     58     * This means '/path/to/seagull/lib' must be added to 
     59     * $conf['path']['additionalIncludePath'].  The class definition would be: 
     60     * 
     61     *  class FOO_Output extends SGL_Output {} 
     62     * 
     63     * @param  array $conf 
     64     */ 
     65    function getOutputClass($conf) 
     66    { 
     67        if (!empty($conf['site']['customOutputClassName'])) { 
     68            $className = $conf['site']['customOutputClassName']; 
     69            $path = trim(preg_replace('/_/', '/', $className)) . '.php'; 
     70            require_once $path; 
     71        } else { 
     72            $className = 'SGL_Output'; 
     73        } 
     74        return $className; 
     75    } 
     76 
     77    /** 
    5578     * Main invocation, init tasks plus main process. 
    5679     * 
     
    7093        } 
    7194        $input->setRequest($req); 
    72         $output = &new SGL_Output(); 
     95        $outputClass = SGL_FrontController::getOutputClass($input->getConfig()); 
     96        $output = &new $outputClass(); 
     97 
     98        $setupNav = SGL::moduleIsEnabled('cms') 
     99            ? 'SGL_Task_SetupNavigation2' 
     100            : 'SGL_Task_SetupNavigation'; 
    73101 
    74102        // see http://trac.seagullproject.org/wiki/Howto/PragmaticPatterns/InterceptingFilter 
     
    91119                new SGL_Task_SetSystemAlert( 
    92120                new SGL_Task_BuildView( 
     121                new SGL_Task_BuildDebugBlock( 
    93122                new SGL_Task_SetupBlocks( 
    94                 new SGL_Task_SetupNavigation
     123                new $setupNav
    95124                new SGL_Task_SetupGui( 
    96                 new SGL_Task_GetPerformanceInfo( 
    97125                new SGL_Task_SetupWysiwyg( 
    98126                new SGL_Task_BuildOutputData( 
     
    111139            ob_end_flush(); 
    112140        } 
     141 
    113142        echo $output->data; 
    114143    } 
     
    118147        $conf = $input->getConfig(); 
    119148        $req = $input->getRequest(); 
    120         $mgr = SGL_Inflector::getManagerNameFromSimplifiedName( 
    121             $req->getManagerName()); 
    122         if (!empty($conf[$mgr]['filterChain'])) { 
    123             $aFilters = explode(',', $conf[$mgr]['filterChain']); 
     149 
     150        switch ($req->getType()) { 
     151 
     152        case SGL_REQUEST_BROWSER: 
     153        case SGL_REQUEST_CLI: 
     154            $mgr = SGL_Inflector::getManagerNameFromSimplifiedName( 
     155                $req->getManagerName()); 
     156            //  load filters defined by specific manager 
     157            if (!empty($conf[$mgr]['filterChain'])) { 
     158                $aFilters = explode(',', $conf[$mgr]['filterChain']); 
     159                $input->setFilters($aFilters); 
     160                $ret = true; 
     161 
     162            //  load sitewide custom filters 
     163            } elseif (!empty($conf['site']['filterChain'])) { 
     164                $aFilters = explode(',', $conf['site']['filterChain']); 
     165                $input->setFilters($aFilters); 
     166                $ret = true; 
     167            } else { 
     168                $ret = false; 
     169            } 
     170            break; 
     171 
     172        case SGL_REQUEST_AJAX: 
     173            $moduleName     = ucfirst($req->getModuleName()); 
     174            $providerName   = $moduleName . 'AjaxProvider'; 
     175            if (!empty($conf[$providerName]['filterChain'])) { 
     176                $aFilters = explode(',', $conf[$providerName]['filterChain']); 
     177            } else { 
     178                $aFilters = array( 
     179                    'SGL_Task_Init', 
     180                    'SGL_Task_SetupORM', 
     181                    'SGL_Task_CreateSession', 
     182                    'SGL_Task_CustomBuildOutputData', 
     183                    'SGL_Task_ExecuteAjaxAction', 
     184                    ); 
     185            } 
    124186            $input->setFilters($aFilters); 
    125187            $ret = true; 
    126         } elseif (!empty($conf['site']['filterChain'])) { 
    127             $aFilters = explode(',', $conf['site']['filterChain']); 
     188            break; 
     189 
     190 
     191        case SGL_REQUEST_AMF: 
     192            $aFilters = array( 
     193                'SGL_Task_Init', 
     194                'SGL_Task_SetupORM', 
     195                'SGL_Task_CreateSession', 
     196                'SGL_Task_ExecuteAmfAction', 
     197                ); 
    128198            $input->setFilters($aFilters); 
    129199            $ret = true; 
    130         } else { 
    131             $ret = false; 
    132         } 
     200            break; 
     201 
     202 
     203        } 
     204 
    133205        return $ret; 
    134206    } 
     207 
    135208 
    136209    function init() 
     
    147220        $init->addData($c->getAll()); 
    148221        $init->addTask(new SGL_Task_SetupConstantsFinish()); 
     222        $init->addTask(new SGL_Task_EnsurePlaceholderDbPrefixIsNull()); 
    149223        $init->addTask(new SGL_Task_SetGlobals()); 
    150224        $init->addTask(new SGL_Task_ModifyIniSettings()); 
     
    153227        $init->addTask(new SGL_Task_SetBaseUrl()); 
    154228        $init->addTask(new SGL_Task_RegisterTrustedIPs()); 
     229        $init->addTask(new SGL_Task_LoadCustomConfig()); 
     230        $init->addTask(new SGL_Task_InitialiseModules()); 
    155231        $init->main(); 
    156232        define('SGL_INITIALISED', true); 
     
    207283            } 
    208284        } 
     285        require_once 'PEAR.php'; 
    209286        require_once 'DB.php'; 
    210287    } 
     
    234311        $req  = $input->getRequest(); 
    235312        $mgr  = $input->get('manager'); 
    236         $conf = $mgr->conf; 
     313 
    237314        $mgr->validate($req, $input); 
    238  
    239315        $input->aggregate($output); 
    240316 
     
    242318        if ($mgr->isValid()) { 
    243319            $ok = $mgr->process($input, $output); 
    244             if (PEAR::isError($ok)) { 
    245                 //  stop with error page 
    246                 SGL::displayStaticPage($ok->getMessage()); 
    247             } 
    248         } 
     320            if (SGL_Error::count() && SGL_Session::getRoleId() != SGL_ADMIN 
     321                    && $mgr->conf['debug']['production']) { 
     322                $mgr->handleError(SGL_Error::getLast(), $output); 
     323            } 
     324        } 
     325        SGL_Manager::display($output); 
    249326        $mgr->display($output); 
    250327    } 
  • trunk/lib/SGL/Inflector.php

    r2451 r3125  
    115115 
    116116        //  if the file exists, mgr name is valid and has not been omitted 
    117         return !is_file($path); 
     117        if (!is_file($path)) { 
     118            //  so before we can be sure of simplification, let's check for presence of simplified Manager, 
     119            //  ie, that has same name of module, so if module is foo, look for FooMgr 
     120            $mgrName = SGL_Inflector::getManagerNameFromSimplifiedName($aParsedUri['moduleName']); 
     121            $corrected = SGL_Inflector::caseFix($mgrName, true); 
     122            $pathToMgr = SGL_MOD_DIR . '/'. $aParsedUri['moduleName'] . '/classes/' . $corrected . '.php'; 
     123            //  if a default mgr can be loaded, then we assume that mgr name was omitted in request 
     124            $ret = is_file($pathToMgr); 
     125        } else { 
     126            $ret = false; 
     127        } 
     128        return $ret; 
    118129    } 
    119130 
     
    153164        } 
    154165        return strtolower($name); 
     166    } 
     167 
     168   /** 
     169    * Converts "string with spaces" to "camelCase" string. 
     170    * 
     171    * @access  public 
     172    * @param   string $s 
     173    * @return  string 
     174    * 
     175    * @author Julien Casanova <julien_casanova AT yahoo DOT fr> 
     176    */ 
     177    function camelise($s) 
     178    { 
     179        $ret = ''; 
     180        $i = 0; 
     181 
     182        $s = preg_replace('!\s+!', ' ', $s); 
     183        $s = trim($s); 
     184        $aString = explode(' ', $s); 
     185        foreach ($aString as $value) { 
     186            if ($i == 0) { 
     187                $ret .= strtolower($value); 
     188            } else { 
     189                $ret .= ucfirst(strtolower($value)); 
     190            } 
     191            $i++; 
     192        } 
     193        return $ret; 
    155194    } 
    156195 
     
    183222        } 
    184223    } 
     224 
     225    function isConstant($str) 
     226    { 
     227        if (empty($str)) { 
     228            return false; 
     229        } 
     230        if (preg_match('/sessid/i', $str)) { 
     231            return false; 
     232        } 
     233        $pattern = '@^[A-Z_\']*$@'; 
     234        if (!preg_match($pattern, $str)) { 
     235            return false; 
     236        } 
     237        return true; 
     238    } 
     239 
     240    /** 
     241     * Returns a human-readable string from $lower_case_and_underscored_word, 
     242     * by replacing underscores with a space, and by upper-casing the initial characters. 
     243     * 
     244     * @param string $lower_case_and_underscored_word String to be made more readable 
     245     * @return string Human-readable string 
     246     */ 
     247        function humanise($lowerCaseAndUnderscoredWord) 
     248        { 
     249                $replace = ucwords(str_replace("_", " ", $lowerCaseAndUnderscoredWord)); 
     250                return $replace; 
     251        } 
    185252 
    186253    /** 
  • trunk/lib/SGL/Manager.php

    r2441 r3125  
    119119            $this->trans = & SGL_Translation::singleton(); 
    120120        } 
     121 
     122        //  determine the value for the masterTemplate 
     123        if (!empty($this->conf['site']['masterTemplate'])) { 
     124            $this->masterTemplate = $this->conf['site']['masterTemplate']; 
     125        } 
    121126    } 
    122127 
     
    168173        if (SGL_Error::count()) { 
    169174            $oLastError = SGL_Error::getLast(); 
    170             if ($oLastError->getCode() == SGL_ERROR_INVALIDCALL) { 
     175            if ($oLastError->getCode() == SGL_ERROR_RESOURCENOTFOUND) { 
    171176                $defaultMgrLoaded = true; 
     177                $output->addHeader('HTTP/1.1 404 Not Found'); 
    172178            } 
    173179 
     
    189195            //  determine global manager perm, ie that is valid for all actions 
    190196            //  in the mgr 
    191             $mgrPerm = @constant('SGL_PERMS_' . strtoupper($mgrName)); 
     197            $mgrPerm = SGL_String::pseudoConstantToInt('SGL_PERMS_' . strtoupper($mgrName)); 
    192198 
    193199            //  check authorisation 
     
    260266    { 
    261267        // if user has no global manager perms check for each action 
    262         if (!SGL_Session::hasPerms($mgrPerm)) { 
     268        if (!SGL_Session::hasPerms($mgrPerm) && !SGL::runningFromCLI()) { 
    263269 
    264270            // and if chained methods to be called are allowed 
     
    273279 
    274280                //  build relevant perms constant 
    275                 $perm = @constant('SGL_PERMS_' . strtoupper($mgrName . $methodName)); 
     281                $perm = SGL_String::pseudoConstantToInt('SGL_PERMS_' . strtoupper($mgrName . $methodName)); 
    276282 
    277283                //  return false if user doesn't have method specific or classwide perms 
     
    290296    { 
    291297        $req = $input->getRequest(); 
    292         $mgr = $req->get('managerName'); 
     298        $mgrName = $req->get('managerName'); 
    293299        $userRid = SGL_Session::getRoleId(); 
    294300 
     
    301307 
    302308    /** 
    303      * Abstract page display method. 
     309     * Parent page display method. 
     310     * 
     311     * Sets CSS file if supplied in request 
    304312     * 
    305313     * @abstract 
     
    309317     * @return  void 
    310318     */ 
    311     function display(&$output) {} 
     319    function display(&$output) 
     320    { 
     321        //  reinstate dynamically added css 
     322        if (!$output->manager->isValid()) { 
     323            if (!count($output->aCssFiles)) { 
     324                //  get action 
     325                $cssFile = $output->request->get('cssFile'); 
     326                if (!is_null($cssFile)) { 
     327                    $output->addCssFile($cssFile); 
     328                } 
     329            } 
     330        } 
     331    } 
    312332 
    313333    /** 
     
    382402        return $aMergedParams; 
    383403    } 
     404 
     405    function handleError($oError, &$output) 
     406    { 
     407        $output->template = 'error.html'; 
     408        $output->masterTemplate = 'masterNoCols.html'; 
     409        $output->aError = array( 
     410            'message'   => $oError->getMessage(), 
     411            'debugInfo' => $oError->getDebugInfo(), 
     412            'level'     => $oError->getCode(), 
     413            'errorType' => SGL_Error::constantToString($oError->getCode()) 
     414        ); 
     415    } 
    384416} 
    385417?> 
  • trunk/lib/SGL/NestedSet.php

    r2425 r3125  
    144144                ORDER BY {$this->_tableName}.{$this->_fieldsInternal['norder']}"; 
    145145        $result =& $this->dbh->query($sql); 
    146         if (DB::isError($result)) { 
    147             SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    148             return; 
     146        if (PEAR::isError($result)) { 
     147            return SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    149148        } 
    150149        $r = ''; 
     
    185184                        ORDER BY {$this->_tableName}.{$this->_fieldsInternal['l']}"; 
    186185                $result =& $this->dbh->query($sql); 
    187                 if (DB::isError($result)) { 
    188                     SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    189                     return; 
     186                if (PEAR::isError($result)) { 
     187                    return SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    190188                } 
    191189                while ($result->fetchInto($row, DB_FETCHMODE_ASSOC)){ 
     
    224222                ORDER BY {$this->_tableName}.{$this->_fieldsInternal['l']}"; 
    225223        $result =& $this->dbh->query($sql); 
    226         if (DB::isError($result)) { 
    227             SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    228             return; 
     224        if (PEAR::isError($result)) { 
     225            return SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    229226        } 
    230227        while ($result->fetchInto($row, DB_FETCHMODE_ASSOC)){ 
     
    263260                ORDER BY {$this->_tableName}.{$this->_fieldsInternal['l']}"; 
    264261        $result =& $this->dbh->query($sql); 
    265         if (DB::isError($result)) { 
    266             SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    267             return; 
     262        if (PEAR::isError($result)) { 
     263            return SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    268264        } 
    269265        $r = ''; 
     
    308304                ORDER BY {$this->_tableName}.{$this->_fieldsInternal['l']}"; 
    309305        $result =& $this->dbh->query($sql); 
    310         if (DB::isError($result)) { 
    311             SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    312             return; 
     306        if (PEAR::isError($result)) { 
     307            return SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    313308        } 
    314309        $r = array(); 
     
    363358                    WHERE {$this->_fieldsInternal['id']} = $node_id"; 
    364359            $result =& $this->dbh->query($sql); 
    365             if (DB::isError($result)) { 
    366                 SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    367                 return; 
     360            if (PEAR::isError($result)) { 
     361                return $result; 
    368362            } 
    369363            $result->fetchInto($this->_aNodes[$node_id], DB_FETCHMODE_ASSOC); 
     
    416410        } 
    417411        $result =& $this->dbh->query($sql); 
    418         if (DB::isError($result)) { 
    419             SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    420             return; 
     412        if (PEAR::isError($result)) { 
     413            return SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    421414        } 
    422415        $r = array(); 
     
    522515                WHERE {$this->_fieldsInternal['id']} = $id"; 
    523516        $result =& $this->dbh->query($sql); 
    524         if (DB::isError($result)) { 
    525             SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    526             return; 
     517        if (PEAR::isError($result)) { 
     518            return SGL::raiseError('SQL problem', SGL_ERROR_DBFAILURE); 
    527519        } 
    528520        return $result; 
  • trunk/lib/SGL/Output.php

    r2482 r3125  
    5252    var $onLoad = ''; 
    5353    var $aOnLoadEvents = array(); 
     54    var $onUnload = ''; 
     55    var $aOnUnloadEvents = array(); 
     56    var $onReadyDom = ''; 
     57    var $aOnReadyDomEvents = array(); 
     58    var $aJavascriptFiles = array(); 
     59    var $aCssFiles = array(); 
     60    var $aHeaders = array(); 
    5461 
    5562    /** 
     
    6875    } 
    6976 
    70     function getLangSwitcher($currUrl = '', $webRoot = '', $theme = '') 
    71     { 
    72         $c = & SGL_Config::singleton(); 
    73         $conf = $c->getAll(); 
    74         $aInstalledLangs = str_replace('_', '-', explode(',', $conf['translation']['installedLanguages'])); 
    75         $imageDir = "$webRoot/themes/$theme/images/flags/"; 
    76         $hasLangParam = preg_match('/lang=/', $currUrl); 
    77         $aLangs  = SGL_Util::getLangsDescriptionMap(); 
    78         $langSwitcher  = ''; 
    79  
    80         foreach ($aLangs as $k => $v) { 
    81             if (in_array($k, $aInstalledLangs) 
    82                     && file_exists(SGL_APP_ROOT . "/www/themes/$theme/images/flags/$k.png")) { 
    83                 $link = ($hasLangParam) 
    84                     ? preg_replace('/(lang=)(.+)/', '$1'. $k, $currUrl) 
    85                     : $currUrl . "?lang=$k"; 
    86                 preg_match('/(.+) \(.+\)/', $v, $matches); 
    87                 $langSwitcher .= "<a class='langFlag' id='$k' href='$link'><img src='$imageDir$k.png' alt='$matches[1]' title='speak $matches[1] please'/></a>"; 
    88             } 
    89         } 
    90  
    91         return $langSwitcher; 
    92     } 
    93  
    9477    /** 
    9578     * Generates options for an HTML select object. 
     
    10588    { 
    10689        SGL::logMessage(null, PEAR_LOG_DEBUG); 
     90 
    10791        if (!is_array($aValues) || (isset($options) && !is_array($options))) { 
    10892            SGL::raiseError('Incorrect param passed to ' . __CLASS__ . '::' . 
     
    142126     * @param   array   $hElements  hash of checkbox values 
    143127     * @param   array   $aChecked   array of checked elements 
    144      * @param   string  $groupName  usually an array name that will contain all elements 
     128     * @param   string  $groupName  name of element group 
    145129     * @param   array   $options    attibutes to add to the input tag : array() {"class" => "myClass", "onclick" => "myClickEventHandler()"} 
    146130     * @return  string  html        list of checkboxes 
     
    218202        $radioString = ''; 
    219203        if ($checked) { 
    220             $yesChecked = ' checked'; 
     204            $yesChecked = ' checked="checked"'; 
    221205            $noChecked = ''; 
    222206        } else { 
    223207            $yesChecked = ''; 
    224             $noChecked = ' checked'; 
     208            $noChecked = ' checked="checked"'; 
    225209        } 
    226210        $optionsString = ''; 
     
    230214            } 
    231215        } 
    232         $radioString .= "<input type='radio' name='$radioName' value='0'" . $optionsString . " $noChecked>".SGL_String::translate('no')."\n"; 
    233         $radioString .= "<input type='radio' name='$radioName' value='1'" . $optionsString . " $yesChecked>".SGL_String::translate('yes')."\n"; 
     216        $radioString .= "<input type='radio' name='$radioName' value='0'" . $optionsString . " $noChecked />".SGL_String::translate('no')."\n"; 
     217        $radioString .= "<input type='radio' name='$radioName' value='1'" . $optionsString . " $yesChecked />".SGL_String::translate('yes')."\n"; 
    234218        return $radioString; 
    235219    } 
     
    442426    { 
    443427        static $count; 
     428        if (empty($elementsToCount)) { // reset counter 
     429            $count = 0; 
     430            return; 
     431        } 
    444432        if ($count % $elementsToCount) { 
    445433            $switcher = false; 
     
    464452    function summarise($str, $limit=50, $element=SGL_WORD, $appendString=' ...') 
    465453    { 
    466          return SGL_String::summarise($str, $limit, $element, $appendString); 
    467     } 
    468  
     454         $ret = SGL_String::summarise($str, $limit, $element, $appendString); 
     455         return $ret; 
     456    } 
     457 
     458    /** 
     459     * Prints formatted error message to standard out. 
     460     * 
     461     * @return mixed 
     462     */ 
    469463    function msgGet() 
    470464    { 
     
    495489            unset($GLOBALS['message']); 
    496490            unset($GLOBALS['messageType']); 
    497         } elseif (SGL_Error::count()) { 
    498  
    499             //  for now get last message added to stack 
    500             $msg = SGL_Error::toString($GLOBALS['_SGL']['ERRORS'][0]); 
    501             echo '  <div class="errorContainer"> 
    502                         <div class="errorHeader">Error</div> 
    503                         <div class="errorContent">' . $msg . '</div> 
    504                     </div>'; 
     491        } 
     492        if (SGL_Error::count()) { 
     493 
     494            // get all errors from stack 
     495            while ($msg = SGL_Error::pop()) { 
     496                $msg = SGL_Error::toString($msg); 
     497                echo '  <div class="errorContainer"> 
     498                            <div class="errorHeader">Error</div> 
     499                            <div class="errorContent">' . $msg . '</div> 
     500                        </div>'; 
     501            } 
    505502        } else { 
    506503            return false; 
     
    508505    } 
    509506 
    510     //  return true if role id  is admin (1) 
    511507    /** 
    512508     * Returns true if current user or passed role ID is that of an admin. 
     
    522518    } 
    523519 
    524     //  return true if $rid is 1 or -1 
     520    /** 
     521     * Returns true if $rid is 1 or -1. 
     522     * 
     523     * @return boolean 
     524     */ 
    525525    function isAdminOrUnassigned($rid) 
    526526    { 
     
    528528    } 
    529529 
    530     function addOnLoadEvent($event) 
    531     { 
    532         $this->aOnLoadEvents[] = $event; 
    533     } 
    534  
    535     function getAllOnLoadEvents() 
     530    function isAuthenticated() 
     531    { 
     532        $rid = SGL_Session::getRoleId(); 
     533        return ($rid == SGL_GUEST) ? false : true; 
     534    } 
     535 
     536    function addOnLoadEvent($event, $bOnReady = false) 
     537    { 
     538        if ($bOnReady) { 
     539            $this->aOnReadyDomEvents[] = $event; 
     540        } else { 
     541            $this->aOnLoadEvents[] = $event; 
     542        } 
     543    } 
     544 
     545    function addOnUnloadEvent($event) 
     546    { 
     547        $this->aOnUnloadEvents[] = $event; 
     548    } 
     549 
     550    function getOnLoadEvents() 
    536551    { 
    537552        $c = & SGL_Config::singleton(); 
     
    542557        } 
    543558        if (count($this->aOnLoadEvents)) { 
    544             return implode(';', $this->aOnLoadEvents); 
    545         } 
    546     } 
     559            return $this->aOnLoadEvents; 
     560        } 
     561    } 
     562 
     563    function getOnUnloadEvents() 
     564    { 
     565        $c = & SGL_Config::singleton(); 
     566        $conf = $c->getAll(); 
     567 
     568        if (!empty($conf['site']['globalJavascriptOnUnload'])) { 
     569            $this->aOnUnloadEvents[] = $conf['site']['globalJavascriptOnUnload']; 
     570        } 
     571        if (count($this->aOnUnloadEvents)) { 
     572            return $this->aOnUnloadEvents; 
     573        } 
     574    } 
     575 
     576    function getOnReadyDomEvents() 
     577    { 
     578        $c = & SGL_Config::singleton(); 
     579        $conf = $c->getAll(); 
     580 
     581        if (!empty($conf['site']['globalJavascriptOnReadyDom'])) { 
     582            $this->aOnReadyDomEvents[] = $conf['site']['globalJavascriptOnReadyDom']; 
     583        } 
     584        if (count($this->aOnReadyDomEvents)) { 
     585            return $this->aOnReadyDomEvents; 
     586        } 
     587    } 
     588 
     589    /** 
     590     * For adding JavaScript files to include. 
     591     * 
     592     * @param   mixed $file or array $file path/to/jsFile, relative to www/ dir e.g. js/foo.js. 
     593                can also be remote js file e.g. http://example.com/foo.js 
     594     * @return void 
     595     */ 
     596    function addJavascriptFile($file) 
     597    { 
     598        if (is_array($file)) { 
     599            foreach ($file as $jsFile) { 
     600                if (!in_array($jsFile, $this->aJavascriptFiles)) { 
     601                    $this->aJavascriptFiles[] = (strpos($jsFile, 'http://') === 0) 
     602                        ? $jsFile 
     603                        : SGL_BASE_URL . '/' . $jsFile; 
     604                } 
     605            } 
     606        } else { 
     607            if (!in_array($file, $this->aJavascriptFiles)) { 
     608                $this->aJavascriptFiles[] = (strpos($file, 'http://') === 0) 
     609                    ? $file 
     610                    : SGL_BASE_URL . '/' . $file; 
     611            } 
     612        } 
     613    } 
     614 
     615    function getJavascriptFiles() 
     616    { 
     617        $aFiles = array(); 
     618 
     619        $c = & SGL_Config::singleton(); 
     620        $conf = $c->getAll(); 
     621        // Check for global files to include 
     622        if (!empty($conf['site']['globalJavascriptFiles'])) { 
     623            $aTmp = explode(';', $conf['site']['globalJavascriptFiles']); 
     624            foreach ($aTmp as $file) { 
     625                $aFiles[] = (strpos($file, 'http://') === 0) 
     626                    ? $file 
     627                    : SGL_BASE_URL . '/' . $file; 
     628            } 
     629        } 
     630        // BC with old way of including js files 
     631        if (isset($this->javascriptSrc)) { 
     632            if (is_array($this->javascriptSrc)) { 
     633                foreach ($this->javascriptSrc as $file) { 
     634                    $aFiles[] = (strpos($file, 'http://') === 0) 
     635                        ? $file 
     636                        : SGL_BASE_URL . '/' . $file; 
     637                } 
     638            } else { 
     639                $aFiles[] = (strpos($this->javascriptSrc, 'http://') === 0) 
     640                    ? $this->javascriptSrc 
     641                    : SGL_BASE_URL . '/' . $this->javascriptSrc; 
     642            } 
     643        } 
     644        // Get files added with $output->addJavascriptFile() 
     645        if (count($this->aJavascriptFiles)) { 
     646            $aFiles = array_merge( 
     647                $aFiles, 
     648                $this->aJavascriptFiles 
     649            ); 
     650        } 
     651 
     652        return $aFiles; 
     653    } 
     654 
     655    /** 
     656     * For adding CSS files to include. 
     657     * 
     658     * @param  mixed $file or array $file path/to/cssFile, relative to www/ dir e.g. css/foo.css 
     659     * @return void 
     660     */ 
     661    function addCssFile($file) 
     662    { 
     663        if (is_array($file)) { 
     664            foreach ($file as $cssFile) { 
     665                if (!in_array($cssFile, $this->aCssFiles)) { 
     666                    $this->aCssFiles[] = $cssFile; 
     667                } 
     668            } 
     669        } else { 
     670            if (!in_array($file, $this->aCssFiles)) { 
     671                $this->aCssFiles[] = $file; 
     672            } 
     673        } 
     674    } 
     675 
    547676    /** 
    548677     * Wrapper for SGL_Url::makeLink, 
     
    583712        $view = &new SGL_HtmlSimpleView($this, $templateEngine); 
    584713        echo $view->render(); 
     714 
     715        //  suppress error notices in templates 
     716        SGL::setNoticeBehaviour(SGL_NOTICES_DISABLED); 
    585717    } 
    586718 
     
    617749    { 
    618750        return ++ $int; 
     751    } 
     752 
     753    function isChecked($value) 
     754    { 
     755        if ($value) { 
     756            $ret = 'checked="checked"'; 
     757        } else { 
     758            $ret = ''; 
     759        } 
     760        return $ret; 
    619761    } 
    620762 
     
    708850        return $ret; 
    709851    } 
     852 
     853    function humanise($lowerCaseAndUnderscoredWord) 
     854    { 
     855        return SGL_Inflector::humanise($lowerCaseAndUnderscoredWord); 
     856    } 
     857 
     858    function camelise($lowerCaseWithSpacesWordsString) 
     859    { 
     860        return SGL_Inflector::camelise($lowerCaseWithSpacesWordsString); 
     861    } 
     862 
     863    /** 
     864     * @return current ms since script start 
     865     */ 
     866    function getExecutionTime() 
     867    { 
     868        return getSystemTime() - @SGL_START_TIME; 
     869    } 
     870 
     871    /** 
     872     * @return query count 
     873     */ 
     874    function getQueryCount() 
     875    { 
     876        return $GLOBALS['_SGL']['QUERY_COUNT']; 
     877    } 
     878 
     879    /** 
     880     * @return memory usage 
     881     */ 
     882    function getMemoryUsage() 
     883    { 
     884        if (function_exists('memory_get_usage')) { 
     885            return number_format(memory_get_usage()); 
     886        } else { 
     887            return 'unknown'; 
     888        } 
     889    } 
     890 
     891    function addHeader($header) 
     892    { 
     893        if (!in_array($header, $this->aHeaders)) { 
     894            $this->aHeaders[] = $header; 
     895        } 
     896    } 
     897 
     898    function getHeaders() 
     899    { 
     900        return $this->aHeaders; 
     901    } 
    710902} 
    711903?> 
  • trunk/lib/SGL/Request.php

    r2166 r3125  
    3939// $Id: Permissions.php,v 1.5 2005/02/03 11:29:01 demian Exp $ 
    4040 
     41define('SGL_REQUEST_BROWSER',   1); 
     42define('SGL_REQUEST_CLI',       2); 
     43define('SGL_REQUEST_AJAX',      3); 
     44define('SGL_REQUEST_XMLRPC',    4); 
     45define('SGL_REQUEST_AMF',       5); 
     46 
    4147/** 
    42  * Wraps all $_GET $_POST $_FILES arrays into a Request object, provides a number of filtering methods. 
     48 * Loads Request driver, provides a number of filtering methods. 
    4349 * 
    4450 * @package SGL 
     
    5359    { 
    5460        if ($this->isEmpty()) { 
    55             $res = (!SGL::runningFromCLI()) 
    56                 ? $this->initHttp() 
    57                 : $this->initCli(); 
    58         } 
    59         return $res; 
     61            $type = $this->getRequestType(); 
     62            $typeName = $this->constantToString($type); 
     63            $file = SGL_CORE_DIR . '/Request/' . $typeName . '.php'; 
     64            if (!is_file($file)) { 
     65              return PEAR::raiseError('Request driver could not be located', 
     66                  SGL_ERROR_NOFILE); 
     67            } 
     68            require_once $file; 
     69            $class = 'SGL_Request_' . $typeName; 
     70            if (!class_exists($class)) { 
     71              return PEAR::raiseError('Request driver class does not exist', 
     72                  SGL_ERROR_NOCLASS); 
     73            } 
     74            $obj = new $class(); 
     75            $ok = $obj->init(); 
     76 
     77            return PEAR::isError($ok) 
     78                ? $ok 
     79                : $obj; 
     80        } 
     81    } 
     82 
     83    function constantToString($constant) 
     84    { 
     85        switch($constant) { 
     86        case SGL_REQUEST_BROWSER: 
     87            $ret = 'Browser'; 
     88            break; 
     89 
     90        case SGL_REQUEST_CLI: 
     91            $ret = 'Cli'; 
     92            break; 
     93 
     94        case SGL_REQUEST_AJAX: 
     95            $ret = 'Ajax'; 
     96            break; 
     97 
     98        case SGL_REQUEST_AMF: 
     99            $ret = 'Amf'; 
     100            break; 
     101        } 
     102        return $ret; 
     103    } 
     104 
     105    function getRequestType() 
     106    { 
     107        if (SGL::runningFromCLI()) { 
     108            $ret = SGL_REQUEST_CLI; 
     109 
     110        } elseif (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 
     111                        $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { 
     112            $ret = SGL_REQUEST_AJAX; 
     113 
     114        } else if(isset($_SERVER['CONTENT_TYPE']) && 
     115            $_SERVER['CONTENT_TYPE'] == 'application/x-amf') { 
     116            $ret = SGL_REQUEST_AMF; 
     117 
     118        } else { 
     119            $ret = SGL_REQUEST_BROWSER; 
     120        } 
     121        return $ret; 
    60122    } 
    61123 
     
    78140 
    79141        if (!isset($instance) || $forceNew) { 
    80             $instance = new SGL_Request(); 
    81             $err = $instance->init(); 
     142            $obj = new SGL_Request(); 
     143            $instance = $obj->init(); 
    82144        } 
    83145        return $instance; 
     
    89151    } 
    90152 
    91     function initHttp() 
    92     { 
    93         //  get config singleton 
    94         $c = &SGL_Config::singleton(); 
    95         $conf = $c->getAll(); 
    96  
    97         //  resolve value for $_SERVER['PHP_SELF'] based in host 
    98         SGL_URL::resolveServerVars($conf); 
    99  
    100         //  get current url object 
    101         $cache = & SGL_Cache::singleton(); 
    102         $cacheId = md5($_SERVER['PHP_SELF']); 
    103  
    104         if ($data = $cache->get($cacheId, 'uri')) { 
    105             $url = unserialize($data); 
    106             SGL::logMessage('URI from cache', PEAR_LOG_DEBUG); 
    107         } else { 
    108             require_once SGL_CORE_DIR . '/UrlParser/SimpleStrategy.php'; 
    109             require_once SGL_CORE_DIR . '/UrlParser/AliasStrategy.php'; 
    110             require_once SGL_CORE_DIR . '/UrlParser/ClassicStrategy.php'; 
    111  
    112             $aStrats = array( 
    113                 new SGL_UrlParser_ClassicStrategy(), 
    114                 new SGL_UrlParser_AliasStrategy(), 
    115                 new SGL_UrlParser_SefStrategy(), 
    116                 ); 
    117             $url = new SGL_URL($_SERVER['PHP_SELF'], true, $aStrats); 
    118  
    119             $err = $url->init(); 
    120             if (PEAR::isError($err)) { 
    121                 return $err; 
    122             } 
    123             $data = serialize($url); 
    124             $cache->save($data, $cacheId, 'uri'); 
    125             SGL::logMessage('URI parsed ####' . $_SERVER['PHP_SELF'] . '####', PEAR_LOG_DEBUG); 
    126         } 
    127         $aQueryData = $url->getQueryData(); 
    128         if (PEAR::isError($aQueryData)) { 
    129             return $aQueryData; 
    130         } 
    131         //  assign to registry 
    132         $input = &SGL_Registry::singleton(); 
    133         $input->setCurrentUrl($url); 
    134  
    135         //  merge REQUEST AND FILES superglobal arrays 
    136         $this->aProps = array_merge($_GET, $_FILES, $aQueryData, $_POST); 
    137     } 
    138  
    139     function initCli() 
    140     { 
    141         require_once 'Console/Getopt.php'; 
    142  
    143         $shortOptions = ''; 
    144         $longOptions = array('moduleName=', 'managerName=', 'action='); 
    145  
    146         $console = new Console_Getopt(); 
    147         $arguments = $console->readPHPArgv(); 
    148         array_shift($arguments); 
    149         $options = $console->getopt2($arguments, $shortOptions, $longOptions); 
    150  
    151         if (!is_array($options) ) { 
    152             die("CLI parameters invalid\n"); 
    153         } 
    154  
    155         $this->aProps = array(); 
    156  
    157         /* Take all _valid_ parameters and add them into aProps. */ 
    158         while (list($parameter, $value) = each($options[0])) { 
    159             $value[0] = str_replace('--', '', $value[0]); 
    160             $this->aProps[$value[0]] = $value[1]; 
    161         } 
     153    function getType() 
     154    { 
     155        return $this->type; 
    162156    } 
    163157 
     
    218212        $this->aProps = array_merge_recursive($this->aProps, $aParams); 
    219213    } 
     214 
     215    function reset() 
     216    { 
     217        unset($this->aProps); 
     218        $this->aProps = array(); 
     219    } 
    220220    /** 
    221221     * Return an array of all Request properties. 
     
    237237        if (isset($this->aProps['managerName'])) { 
    238238            $ret = $this->aProps['managerName']; 
     239        } else { 
     240            $ret = 'default'; 
     241        } 
     242        return $ret; 
     243    } 
     244 
     245    function getActionName() 
     246    { 
     247        if (isset($this->aProps['action'])) { 
     248            $ret = $this->aProps['action']; 
    239249        } else { 
    240250            $ret = 'default'; 
     
    251261 
    252262        foreach ($this->aProps as $key => $value) { 
     263            if (is_array($value)) { 
     264                continue; 
     265            } 
    253266            if (!empty($value) && $key != 'lang' && strpos($key, $sglSessionName) === false) { 
    254267                $uri .= ($key == 'moduleName' || $key == 'managerName') 
     
    257270            } 
    258271        } 
    259  
    260272        // remove trailing slash 
    261273        $uri = preg_replace('/\/$/','',$uri); 
     
    269281        $c->set('site', array('blocksEnabled' => 0)); 
    270282        print '<pre>'; 
    271         print_r($this->aProps[$key]); 
     283        print_r($this->aProps); 
    272284    } 
    273285} 
    274  
    275286?> 
  • trunk/lib/SGL/Session.php

    r2486 r3125  
    101101     * 
    102102     * @access  public 
    103      * @param   int $uid    user id if present 
     103     * @param   int $uid       user id if present 
     104     * @param   int $lifetime  cookie lifetime in seconds 
    104105     * @return  void 
    105106     */ 
    106     function SGL_Session($uid = -1
     107    function SGL_Session($uid = -1, $lifetime = 0
    107108    { 
    108109        SGL::logMessage(null, PEAR_LOG_DEBUG); 
     
    117118        //  then use user timeout in isTimedOut() method 
    118119        session_set_cookie_params( 
    119             0
     120            $lifetime
    120121            $conf['cookie']['path'], 
    121122            $conf['cookie']['domain'], 
     
    166167        SGL::logMessage(null, PEAR_LOG_DEBUG); 
    167168 
    168         //  get DA_User object 
    169         require_once SGL_MOD_DIR . '/user/classes/DA_User.php'; 
    170         $da = & DA_User::singleton(); 
     169        //  get UserDAO object 
     170        require_once SGL_MOD_DIR . '/user/classes/UserDAO.php'; 
     171        $da = & UserDAO::singleton(); 
    171172 
    172173        //  set secure session key 
     
    286287        $lastPageRefreshTime = $_SESSION['lastRefreshed']; 
    287288        $timeout = $_SESSION['aPrefs']['sessionTimeout']; 
     289        //  if timeout is set to zero session never expires 
     290        if (empty($timeout)) { 
     291            return false; 
     292        } 
    288293        if ($currentTime - $lastPageRefreshTime > $timeout) { 
    289294            return true; 
    290295        } else { 
    291             if (mktime() - $lastPageRefreshTime > SGL_SESSION_UPDATE_WINDOW ) { 
     296            return false; 
     297        } 
     298    } 
     299 
     300    /** 
     301     * Updates the idle time. 
     302     * 
     303     * @access  public 
     304     * @return  boolean true if session idle time delayed 
     305     */ 
     306    function updateIdle() 
     307     { 
     308        SGL::logMessage(null, PEAR_LOG_DEBUG); 
     309 
     310        $ret = false; 
     311        //  check for session timeout 
     312        if (!$this->isTimedOut()) { 
     313            if (mktime() - $_SESSION['lastRefreshed'] > SGL_SESSION_UPDATE_WINDOW ) { 
    292314                $_SESSION['lastRefreshed'] = mktime(); 
    293315            } 
    294             return false; 
    295         } 
    296     } 
     316            $ret = true; 
     317        } 
     318        return $ret; 
     319    } 
     320 
    297321 
    298322    /** 
     
    373397        SGL::logMessage(null, PEAR_LOG_DEBUG); 
    374398 
    375         if (count($_SESSION) && isset($_SESSION['rid'])) { 
     399        if (isset($_SESSION) && count($_SESSION) && isset($_SESSION['rid'])) { 
    376400            return $_SESSION['rid']; 
    377401        } else { 
  • trunk/lib/SGL/Sql.php

    r2425 r3125  
    7373 
    7474        $isMysql323 = false; 
    75         if ($conf['db']['type'] == 'mysql_SGL' || $conf['db']['type'] == 'mysql') { 
     75        if        ($conf['db']['type'] == 'mysql_SGL' 
     76                || $conf['db']['type'] == 'mysql' 
     77                || $conf['db']['type'] == 'mysqli' 
     78                || $conf['db']['type'] == 'mysqli_SGL') { 
    7679            $aEnvData = unserialize(file_get_contents(SGL_VAR_DIR . '/env.php')); 
    7780            if (isset($aEnvData['db_info']) && ereg('3.23', $aEnvData['db_info']['version'])) { 
     
    9699                $line = SGL_Sql::rewriteWithAutoIncrement($line, $nextId); 
    97100            } 
     101 
     102            // prefix table name in statement 
     103            if (!empty($conf['db']['prefix'])) { 
     104                $statementType = ''; 
     105                if (preg_match('/create table/i', $line)) { 
     106                    $statementType = 'createTable'; 
     107                } elseif (preg_match('/insert into/i', $line)) { 
     108                    $statementType = 'insert'; 
     109                } elseif (preg_match('/select(.*?)from/i', $line)) { 
     110                    $statementType = 'select'; 
     111                } elseif (preg_match('/create (unique )?index/i', $line)) { 
     112                    $statementType = 'createIndex'; 
     113                } elseif (preg_match('/delete from/i', $line)) { 
     114                    $statementType = 'delete'; 
     115                } elseif (preg_match('/alter table/i', $line)) { 
     116                    $statementType = 'alterTable'; 
     117                } elseif (preg_match('/references/i', $line)) { 
     118                    $statementType = 'ref'; 
     119                } elseif (preg_match('/add constraint/i', $line)) { 
     120                    $statementType = 'addConstraint'; 
     121                } elseif (preg_match('/create sequence/i', $line)) { 
     122                    $statementType = 'createSequence'; 
     123                } 
     124                if (!empty($statementType)) { 
     125                    $line = SGL_Sql::prefixTableNameInStatement($line, $statementType); 
     126                } 
     127            } 
     128 
    98129            $sql .= $line; 
    99130 
     
    101132                continue; 
    102133            } 
     134 
    103135            // strip semi-colons for MaxDB, Oracle and mysql 3.23 
    104136            if ($conf['db']['type'] == 'oci8_SGL' || $conf['db']['type'] == 'odbc' || $isMysql323) { 
    105137                $sql = preg_replace("/;\s*$/", '', $sql); 
    106138            } 
     139 
     140            // support for mysql cluster 
     141            if ($conf['db']['type'] == 'mysql_SGL' 
     142                    && $conf['db']['mysqlCluster'] == true 
     143                    && preg_match('/create table/i', $sql)) { 
     144                if (preg_match('/(type|engine)(\s*)=(\s*)(myisam|innodb)/i', $sql)) { 
     145                    $sql = preg_replace('/(type|engine)(\s*)=(\s*)(myisam|innodb)/i', 'engine=ndbcluster', $sql); 
     146                } elseif (preg_match('/\)\s*;\s*$/', $sql)) { 
     147                    $sql = preg_replace('/;\s*$/', 'engine=ndbcluster;', $sql); 
     148                } 
     149            } 
     150 
    107151            // Execute the statement. 
    108152            if (!is_null($executerCallback) && is_callable($executerCallback)) { 
     
    110154                    array($executerCallback[0], $executerCallback[1]), $sql); 
    111155                //  handle error 
    112                 if (PEAR::isError($res, DB_ERROR_ALREADY_EXISTS)) { 
     156                if (PEAR::isError($res)) { 
    113157                    return $res; 
    114                 } elseif (DB::isError($res)) { 
    115                     // Print out info on bad statements 
    116                     echo '<pre>'.$res->getMessage().'</pre>'; 
    117                     echo '<pre>'. $res->getUserInfo() . '</pre>'; 
    118158                } 
    119159            } 
     
    156196        $pattern = '/^(INSERT INTO)(\W+)(\w+)(\W+)(.*)/i'; 
    157197        preg_match($pattern, $str, $matches); 
    158         $tableName = $matches[3]
     198        $tableName = SGL_Sql::addTablePrefix($matches[3])
    159199        return $tableName; 
    160200    } 
     
    172212        $pattern = '/(CREATE TABLE)(\W+)(IF NOT EXISTS)?(\W+)?([A-Za-z0-9_-]+)(\W+)?/i'; 
    173213        preg_match($pattern, $str, $matches); 
    174         $tableName = $matches[5]
     214        $tableName = SGL_Sql::addTablePrefix($matches[5])
    175215        return $tableName; 
    176216    } 
     
    208248 
    209249        case 'mysql_SGL': 
     250        case 'mysqli_SGL': 
    210251        case 'mysql': 
     252        case 'mysqli': 
    211253            $shortName = 'my'; 
    212254            break; 
     
    218260        return $shortName; 
    219261    } 
     262 
     263    /** 
     264     * Prefix given table name. 
     265     * 
     266     * @param  string $tableName  table name 
     267     * @return string 
     268     */ 
     269    function addTablePrefix($tableName) 
     270    { 
     271        $c = &SGL_Config::singleton(); 
     272        $prefix = $c->get(array('db' => 'prefix')); 
     273        return $prefix . $tableName; 
     274    } 
     275 
     276    /** 
     277     * Prefix table name in SQL statement. 
     278     * 
     279     * @param  string $str   initial string (statement) 
     280     * @param  string $type  query type 
     281     * @return string 
     282     */ 
     283    function prefixTableNameInStatement($str, $type) 
     284    { 
     285        switch ($type) { 
     286            case 'select': 
     287                $pattern     = '/(SELECT)(.*?)(FROM)(\W+)?([A-Za-z0-9_-]+)(\W+)?/i'; 
     288                $replacement = '${1}${2}${3}${4}' . 
     289                    SGL_Sql::addTablePrefix('$5') . '${6}'; 
     290                break; 
     291 
     292            case 'insert': 
     293                $pattern     = '/(INSERT INTO)(\W+)?([A-Za-z0-9_-]+)(\W+)?/i'; 
     294                $replacement = '${1}${2}' . 
     295                    SGL_Sql::addTablePrefix('$3') . '${4}'; 
     296                break; 
     297 
     298            case 'delete': 
     299                $pattern     = '/(DELETE FROM)(\W+)?([A-Za-z0-9_-]+)(\W+)?/i'; 
     300                $replacement = '${1}${2}' . SGL_Sql::addTablePrefix('$3') . '${4}'; 
     301                break; 
     302 
     303            case 'createTable': 
     304                $pattern     = '/(CREATE TABLE)(\W+)(IF NOT EXISTS)?(\W+)?([A-Za-z0-9_-]+)(\W+)?/i'; 
     305                $replacement = '${1}${2}${3}${4}' . 
     306                    SGL_Sql::addTablePrefix('$5') . '${6}'; 
     307                break; 
     308 
     309            case 'createIndex': 
     310                $pattern     = '/(CREATE)(.*?)(INDEX)(\W+)?([A-Za-z0-9_-]+)(\W+)?' . 
     311                    '(.*?)(ON)(\W+)?([A-Za-z0-9_-]+)(\W+)?/i'; 
     312                $replacement = '${1}${2}${3}${4}' . 
     313                    SGL_Sql::addTablePrefix('$5') . '${6}${7}${8}${9}' . 
     314                    SGL_Sql::addTablePrefix('$10') . '${11}'; 
     315                break; 
     316 
     317            case 'alterTable': 
     318                // prefix sub-statements on the same line 
     319                if (preg_match('/add constraint/i', $str)) { 
     320                    $str = SGL_Sql::prefixTableNameInStatement($str, 'addConstraint'); 
     321                } 
     322                if (preg_match('/references/i', $str)) { 
     323                    $str = SGL_Sql::prefixTableNameInStatement($str, 'ref'); 
     324                } 
     325                $pattern     = '/(ALTER)(.*?)(TABLE)(\W+)?([A-Za-z0-9_-]+)(\W+)?/i'; 
     326                $replacement = '${1}${2}${3}${4}' . 
     327                    SGL_Sql::addTablePrefix('$5') . '${6}'; 
     328                break; 
     329 
     330            case 'addConstraint': 
     331                $pattern     = '/(ADD CONSTRAINT)(\W+)?([A-Za-z0-9_-]+)(\W+)?/i'; 
     332                $replacement = '${1}${2}' . SGL_Sql::addTablePrefix('$3') . '${4}'; 
     333                break; 
     334 
     335            case 'ref': 
     336                $pattern     = '/(REFERENCES)(\W+)?([A-Za-z0-9_-]+)(\W+)?/i'; 
     337                $replacement = '${1}${2}' . SGL_Sql::addTablePrefix('$3') . '${4}'; 
     338                break; 
     339 
     340            case 'createSequence': 
     341                $pattern     = '/(CREATE)(.*?)(SEQUENCE)(\W+)?([A-Za-z0-9_-]+)/i'; 
     342                $replacement = '${1}${2}${3}${4}' . SGL_Sql::addTablePrefix('$5'); 
     343                break; 
     344 
     345            default: 
     346                return SGL::raiseError('Unknown replacement format', 
     347                    SGL_ERROR_INVALIDARGS); 
     348        } 
     349        $str = preg_replace($pattern, $replacement, $str); 
     350        return $str; 
     351    } 
    220352} 
    221353?> 
  • trunk/lib/SGL/String.php

    r2425 r3125  
    5050 * @author  Demian Turner <demian@phpkitchen.com> 
    5151 * @version $Revision: 1.14 $ 
    52  * @since   PHP 4.1 
    5352 */ 
    5453class SGL_String 
     
    7069 
    7170        $editedText = $text; 
    72         if ($conf['censor']['mode'] != SGL_CENSOR_DISABLE) { 
     71        $censorMode = SGL_String::pseudoConstantToInt($conf['censor']['mode']); 
     72        if ($censorMode != SGL_CENSOR_DISABLE) { 
    7373            $aBadWords = explode(',', $conf['censor']['badWords']); 
    7474            if (is_array($aBadWords)) { 
    7575                $replacement = $conf['censor']['replaceString']; 
    7676 
    77                 switch ($conf['censor']['mode']) { 
     77                switch ($censorMode) { 
    7878                case SGL_CENSOR_EXACT_MATCH: 
    7979                    $regExPrefix = '(\s*)'; 
     
    9696            } 
    9797        } 
    98         return ($editedText)
     98        return $editedText
    9999    } 
    100100 
     
    111111        if (defined(PHP_EOL)) { 
    112112            $crlf = PHP_EOL; 
    113         } else
     113        } elseif (defined('SGL_CLIENT_OS'))
    114114            // Win case 
    115115            if (SGL_CLIENT_OS == 'Win') { 
     
    122122                $crlf = "\n"; 
    123123            } 
     124        } else { 
     125            $crlf = "\n"; 
    124126        } 
    125127        return $crlf; 
     
    178180                $clean = array_map(array('SGL_String', 'clean'), $var); 
    179181            } 
    180         } 
    181         return SGL_String::trimWhitespace($clean); 
     182            return SGL_String::trimWhitespace($clean); 
     183        } else { 
     184            return false; 
     185        } 
    182186    } 
    183187 
     
    221225 
    222226        if (       !$conf['site']['tidyhtml'] 
    223                 || !function_exists('tidy_parse_string') 
    224                 || SGL::isPhp5()) { // tidy 2 in PHP5 has different API 
     227                || !extension_loaded('tidy')) { 
    225228            return $html; 
    226229        } 
    227         //  so we don't get doctype, html, head, body etc. tags added; default is false 
    228         tidy_setopt('show-body-only', true); 
    229         //  no wrapping of lines 
    230         tidy_setopt('wrap', 0); 
    231         tidy_setopt('indent', 1); 
    232         tidy_setopt('indent-spaces', 1); 
    233         tidy_parse_string($html); 
    234         if ((tidy_warning_count() || tidy_error_count()) && $logErrors) { 
    235             SGL::logMessage('PHP Tidy error or warning: ' . tidy_get_error_buffer(), PEAR_LOG_NOTICE); 
    236         } 
    237         return tidy_get_output(); 
     230        //  PHP5 version 
     231        if (SGL::isPhp5()) { 
     232            $options = array( 
     233                'wrap' => 0, 
     234                'indent' => true, 
     235                'indent-spaces' => 4, 
     236                'output-xhtml' => true, 
     237                'drop-font-tags' => false, 
     238                'clean' => false, 
     239            ); 
     240            if (strlen($html)) { 
     241                $tidy = new Tidy(); 
     242                $tidy->parseString($html, $options, 'utf8'); 
     243                $tidy->cleanRepair(); 
     244                $ret = $tidy->body(); 
     245            } 
     246        //  PHP4 version 
     247        } else { 
     248            //  so we don't get doctype, html, head, body etc. tags added; default is false 
     249            tidy_setopt('show-body-only', true); 
     250            //  no wrapping of lines 
     251            tidy_setopt('wrap', 0); 
     252            tidy_setopt('indent', 1); 
     253            tidy_setopt('indent-spaces', 1); 
     254            tidy_parse_string($html); 
     255            if ((tidy_warning_count() || tidy_error_count()) && $logErrors) { 
     256                SGL::logMessage('PHP Tidy error or warning: ' . tidy_get_error_buffer(), PEAR_LOG_NOTICE); 
     257            } 
     258            $ret = tidy_get_output(); 
     259        } 
     260        return $ret; 
    238261    } 
    239262 
     
    489512        $aSegment = array_slice($aLines, 0, $lines); 
    490513 
    491  
    492514        //  close tags like <ul> so page layout doesn't break 
    493515        $unclosedListTags = 0; 
     
    506528            array_push($aSegment, '</ul>'); 
    507529        } 
    508         return implode("\n", $aSegment); 
     530        $ret = implode("\n", $aSegment); 
     531        $ret = SGL_String::tidy($ret); 
     532        return $ret; 
    509533    } 
    510534 
     
    540564        } 
    541565        return $formated; 
     566    } 
     567 
     568    function toValidVariableName($str) 
     569    { 
     570        //  remove illegal chars 
     571        $search = '/[^a-zA-Z1-9_]/'; 
     572        $replace = ''; 
     573        $res = preg_replace($search, $replace, $str); 
     574        //  ensure 1st letter is lc 
     575        $firstLetter = strtolower($res[0]); 
     576        $final = substr_replace($res, $firstLetter, 0, 1); 
     577        return $final; 
    542578    } 
    543579 
     
    634670        return preg_replace("/[\|\&\~\!\"\(\)]/i", "", $string); 
    635671    } 
     672 
     673    /** 
     674     * Converts strings representing constants to int values. 
     675     * 
     676     * Used for when constants are stored as strings in config. 
     677     * 
     678     * @static 
     679     * @param string $string 
     680     * @return integer 
     681     */ 
     682    function pseudoConstantToInt($string) 
     683    { 
     684        $ret = 0; 
     685        if (is_int($string)) { 
     686            $ret = $string; 
     687        } 
     688        if (is_numeric($string)) { 
     689            $ret = (int)$string; 
     690        } 
     691        if (SGL_Inflector::isConstant($string)) { 
     692            $const = str_replace("'", '', $string); 
     693            if (defined($const)) { 
     694                $ret = constant($const); 
     695            } 
     696        } 
     697        return $ret; 
     698    } 
    636699} 
    637700 
  • trunk/lib/SGL/Task.php

    r2056 r3125  
    9696            return true; 
    9797        } 
    98         return PEAR::raiseError('unexpected object type'); 
     98        return PEAR::raiseError('an SGL_Task object was expected'); 
    9999    } 
    100100 
  • trunk/lib/SGL/Translation.php

    r2425 r3125  
    7777        } 
    7878 
    79         $c = &SGL_Config::singleton(); 
    80         $conf = $c->getAll(); 
     79        $c      = &SGL_Config::singleton(); 
     80        $conf   = $c->getAll(); 
     81        $dbh    = SGL_DB::singleton(); 
    8182 
    8283        //  set translation table parameters 
    8384        $params = array( 
    84             'langs_avail_table' => 'langs', 
     85            'langs_avail_table' => $conf['db']['prefix'] . 'langs', 
    8586            'lang_id_col'       => 'lang_id', 
    8687            'lang_name_col'     => 'name', 
     
    9697        $driver = 'DB'; 
    9798 
    98         //  retreive DSN 
    99         $dsn = SGL_DB::getDsn('SGL_DSN_ARRAY'); 
    100  
    10199        //  create translation storage tables 
    102         if ($conf['translation']['container'] == 'db' && $conf['table']['translation']) { 
    103  
    104             $prefix = $conf['table']['translation'] .'_'; 
     100        if ($conf['translation']['container'] == 'db') { 
     101 
     102            $prefix = $conf['db']['prefix'] . 
     103                $conf['translation']['tablePrefix'] . '_'; 
    105104            $aLangs = explode(',', $conf['translation']['installedLanguages']); 
    106105 
     
    119118        case 'admin': 
    120119            require_once 'Translation2/Admin.php'; 
    121             $instance[$type] = &Translation2_Admin::factory($driver, $dsn, $params); 
     120            $instance[$type] = &Translation2_Admin::factory($driver, $dbh, $params); 
    122121            break; 
    123122 
     
    125124        default: 
    126125            require_once 'Translation2.php'; 
    127             $instance[$type] = &Translation2::factory($driver, $dsn, $params); 
    128         } 
    129         //  switch phptype to mysql when using mysql_SGL otherwise the langs table 
    130         //  and index's will not be created. 
    131         if ($dsn['phptype'] == 'mysql_SGL') { 
    132             $instance[$type]->storage->db->phptype = 'mysql'; 
    133         } 
    134  
     126            $instance[$type] = &Translation2::factory($driver, $dbh, $params); 
     127        } 
    135128        return $instance[$type]; 
    136129    } 
     
    172165    { 
    173166        $c = &SGL_Config::singleton(); 
    174         $conf = $c->getAll(); 
    175167 
    176168        $aLangs = $aLangs = explode(',', $this->conf['translation']['installedLanguages']); 
     
    349341            } 
    350342        } else { 
    351             SGL::raiseError('Incorrect parameter passed to '.__CLASS__.'::'.__FUNCTION__, 
     343            return SGL::raiseError('Incorrect parameter passed to '.__CLASS__.'::'.__FUNCTION__, 
    352344                SGL_ERROR_INVALIDARGS); 
    353345        } 
     
    402394        if (isset($format)) { 
    403395            $langID = ($format == SGL_LANG_ID_SGL) 
    404                         ? str_replace('_', '-', $langID) 
    405                         : str_replace('-', '_', $langID); 
     396                ? str_replace('_', '-', $langID) 
     397                : str_replace('-', '_', $langID); 
    406398 
    407399            return $langID; 
    408400        } else { 
    409401            $langID = (strstr($langID, '-')) 
    410                         ? str_replace('-', '_', $langID) 
    411                         : str_replace('_', '-', $langID); 
     402                ? str_replace('-', '_', $langID) 
     403                : str_replace('_', '-', $langID); 
    412404            return $langID; 
    413405        } 
     406    } 
     407 
     408    /** 
     409     * Remove all translations for all languages for specified module. 
     410     * 
     411     * @static 
     412     * @param  string  $moduleName  module/page name 
     413     * @return boolean 
     414     */ 
     415    function removeTranslations($moduleName) 
     416    { 
     417        $trans  = &SGL_Translation::singleton('admin'); 
     418        $aPages = $trans->getPageNames(); 
     419        if (PEAR::isError($aPages)) { 
     420            return $aPages; 
     421        } 
     422        if (!in_array($moduleName, $aPages)) { 
     423            return false; // no translations 
     424        } 
     425        $aLangs = $trans->getLangs('ids'); 
     426        if (PEAR::isError($aLangs)) { 
     427            return $aLangs; 
     428        } 
     429        $aStrings = array(); 
     430        foreach ($aLangs as $langId) { 
     431            $ret = SGL_Translation::getTranslations($moduleName, $langId); 
     432            $aStrings = array_merge($aStrings, array_keys($ret)); 
     433        } 
     434        foreach ($aStrings as $stringId) { 
     435            $ret = $trans->remove($stringId, $moduleName); 
     436            if (PEAR::isError($ret)) { 
     437                return $ret; 
     438            } 
     439        } 
     440        return true; 
    414441    } 
    415442} 
  • trunk/lib/SGL/Url.php

    r2083 r3125  
    298298                                $this->path = $urlinfo['path']; 
    299299                                $this->querystring = @$urlinfo['query']; 
    300                                 $install = true; 
    301300                            } else { 
    302301                                $this->path = substr($value, 0, $frontScriptStartIndex); 
     
    415414            } 
    416415        } 
     416        //  remove querystring data 
     417        foreach ($aRet as $k => $v) { 
     418            if (stristr($k, '?start_debug')) { 
     419                unset($aRet[$k]); 
     420            } 
     421        } 
    417422        return $aRet; 
    418423    } 
     
    446451                $this->aRes[] = $res; 
    447452            } 
     453        } 
     454        //  reverse order of strats so Classic comes last in array and overrides SEF 
     455        if (!empty($conf['site']['outputUrlHandler']) 
     456                && $conf['site']['outputUrlHandler'] == 'SGL_UrlParser_ClassicStrategy') { 
     457            $tmp = array_reverse($this->aRes); 
     458            $this->aRes = $tmp; 
    448459        } 
    449460        $ret = call_user_func_array('array_merge', $this->aRes); 
     
    844855        return $aUriParts; 
    845856    } 
    846  
    847     function ensureWebrootSet() 
    848     { 
    849         if (!defined('SGL_BASE_URL')) { 
    850             if (@preg_match('/^(.*)\/.*\.php$/', $_SERVER['SCRIPT_NAME'], $aMatches)) { 
    851                 define('SGL_BASE_URL', $aMatches[1]); 
    852             } else { 
    853                 die('Could not set webroot'); 
    854             } 
    855         } 
    856     } 
    857857} 
    858858 
  • trunk/lib/SGL/Util.php

    r2425 r3125  
    208208 
    209209        require_once 'File/Util.php'; 
    210         require_once SGL_MOD_DIR  . '/default/classes/DA_Default.php'; 
    211         $da = & DA_Default::singleton(); 
    212210 
    213211        //  match all folders except CVS 
     
    216214 
    217215        foreach ($ret as $module) { 
    218             if ($onlyRegistered && !$da->moduleIsRegistered($module)) { 
     216            if ($onlyRegistered && !SGL::moduleIsEnabled($module)) { 
    219217                unset($ret[$module]); 
    220218            } 
     
    349347     * read them.  Thanks to Georg Gell for the idea. 
    350348     * 
    351      * @param string $file 
     349     * @param string $file  Path to ini file 
    352350     */ 
    353351    function makeIniUnreadable($file) 
     
    356354        $string = ';<?php die("Eat dust"); ?>' . "\n"; 
    357355        array_unshift($iniFle, $string); 
    358         file_put_contents($file, implode("", $iniFle)); 
     356        file_put_contents($file . '.php', implode('', $iniFle)); 
     357        //  remove original ini file 
     358        unlink($file); 
    359359    } 
    360360    /** 
     
    431431        return $aReturn; 
    432432    } 
     433 
     434    /** 
     435     * Returns the system's tmp directory. 
     436     * 
     437     * Mactel doesn't supply tmp path in most of the normal places. 
     438     * 
     439     * @return string  Path to tmp dir 
     440     */ 
     441    function getTmpDir() 
     442    { 
     443       // Try to get from environment variable 
     444       if (!empty($_ENV['TMP'])) { 
     445           return realpath($_ENV['TMP']); 
     446       } elseif (!empty($_ENV['TMPDIR'])) { 
     447           return realpath($_ENV['TMPDIR']); 
     448       } elseif (!empty($_ENV['TEMP'])) { 
     449           return realpath($_ENV['TEMP']); 
     450       } 
     451       // Detect by creating a temporary file 
     452       else { 
     453           // Try to use system's temporary directory 
     454           // as random name shouldn't exist 
     455           $temp_file = tempnam(md5(uniqid(rand(), true)), ''); 
     456           if ($temp_file) { 
     457               $temp_dir = realpath(dirname($temp_file)); 
     458               unlink($temp_file); 
     459               return $temp_dir; 
     460           } else { 
     461               return false; 
     462           } 
     463       } 
     464    } 
    433465} 
    434466?>