Example #1
0
File: debug.php Project: akksi/jcg
 /**
  * Show the debug info
  *
  */
 function __destruct()
 {
     global $_PROFILER;
     // Do not render if debugging is not enabled
     if (!JDEBUG) {
         return;
     }
     if (!$_PROFILER instanceof JProfiler) {
         return;
     }
     // Load the language
     $this->loadLanguage();
     // Capture output
     $contents = ob_get_contents();
     ob_end_clean();
     // No debug for Safari and Chrome redirection
     if (strstr(strtolower($_SERVER['HTTP_USER_AGENT']), 'webkit') !== false && substr($contents, 0, 50) == '<html><head><meta http-equiv="refresh" content="0;') {
         echo $contents;
         return;
     }
     $document = JFactory::getDocument();
     $doctype = $document->getType();
     // Only render for HTML output
     if ($doctype !== 'html') {
         echo $contents;
         return;
     }
     // If the user is not allowed to view the output then end here
     $filterGroups = (array) $this->params->get('filter_groups', null);
     if (!empty($filterGroups)) {
         $userGroups = JFactory::getUser()->get('groups');
         if (!array_intersect($filterGroups, array_keys($userGroups))) {
             echo $contents;
             return;
         }
     }
     // Load language file
     $this->loadLanguage('plg_system_debug');
     $profiler =& $_PROFILER;
     ob_start();
     echo '<div id="system-debug" class="profiler">';
     $errors = JError::getErrors();
     if (!empty($errors)) {
         echo '<h4>' . JText::_('PLG_DEBUG_ERRORS') . '</h4><ol>';
         while ($error = JError::getError(true)) {
             echo '<li>' . $error->getMessage() . '<br /><h4>' . JText::_('PLG_DEBUG_INFO') . '</h4><pre>' . print_r($error->get('info'), true) . '</pre><br /><h4>' . JText::_('PLG_DEBUG_BACKTRACE') . '</h4>' . JError::renderBacktrace($error) . '</li>';
         }
         echo '</ol>';
     }
     if ($this->params->get('profile', 1)) {
         echo '<h4>' . JText::_('PLG_DEBUG_PROFILE_INFORMATION') . '</h4>';
         foreach ($profiler->getBuffer() as $mark) {
             echo '<div>' . $mark . '</div>';
         }
     }
     if ($this->params->get('memory', 1)) {
         echo '<h4>' . JText::_('PLG_DEBUG_MEMORY_USAGE') . '</h4>';
         $bytes = $profiler->getMemory();
         echo JHtml::_('number.bytes', $bytes);
         echo ' (' . number_format($bytes) . ' Bytes)';
     }
     if ($this->params->get('queries', 1)) {
         $newlineKeywords = '#\\b(FROM|LEFT|INNER|OUTER|WHERE|SET|VALUES|ORDER|GROUP|HAVING|LIMIT|ON|AND)\\b#i';
         $db = JFactory::getDbo();
         echo '<h4>' . JText::sprintf('PLG_DEBUG_QUERIES_LOGGED', $db->getTicker()) . '</h4>';
         if ($log = $db->getLog()) {
             echo '<ol>';
             $selectQueryTypeTicker = array();
             $otherQueryTypeTicker = array();
             foreach ($log as $k => $sql) {
                 // Start Query Type Ticker Additions
                 $fromStart = stripos($sql, 'from');
                 $whereStart = stripos($sql, 'where', $fromStart);
                 if ($whereStart === false) {
                     $whereStart = stripos($sql, 'order by', $fromStart);
                 }
                 if ($whereStart === false) {
                     $whereStart = strlen($sql) - 1;
                 }
                 $fromString = substr($sql, 0, $whereStart);
                 $fromString = str_replace("\t", " ", $fromString);
                 $fromString = str_replace("\n", " ", $fromString);
                 $fromString = trim($fromString);
                 // Initialize the select/other query type counts the first time:
                 if (!isset($selectQueryTypeTicker[$fromString])) {
                     $selectQueryTypeTicker[$fromString] = 0;
                 }
                 if (!isset($otherQueryTypeTicker[$fromString])) {
                     $otherQueryTypeTicker[$fromString] = 0;
                 }
                 // Increment the count:
                 if (stripos($sql, 'select') === 0) {
                     $selectQueryTypeTicker[$fromString] = $selectQueryTypeTicker[$fromString] + 1;
                     unset($otherQueryTypeTicker[$fromString]);
                 } else {
                     $otherQueryTypeTicker[$fromString] = $otherQueryTypeTicker[$fromString] + 1;
                     unset($selectQueryTypeTicker[$fromString]);
                 }
                 // Finish Query Type Ticker Additions
                 $text = htmlspecialchars($sql, ENT_QUOTES);
                 $text = preg_replace($newlineKeywords, '<br />&#160;&#160;\\0', $text);
                 echo '<li>' . $text . '</li>';
             }
             echo '</ol>';
             if ($this->params->get('query_types', 1)) {
                 // Get the totals for the query types:
                 $totalSelectQueryTypes = count($selectQueryTypeTicker);
                 $totalOtherQueryTypes = count($otherQueryTypeTicker);
                 $totalQueryTypes = $totalSelectQueryTypes + $totalOtherQueryTypes;
                 echo '<h4>' . JText::sprintf('PLG_DEBUG_QUERY_TYPES_LOGGED', $totalQueryTypes) . '</h4>';
                 if ($totalSelectQueryTypes) {
                     echo '<h5>' . JText::sprintf('PLG_DEBUG_SELECT_QUERIES') . '</h5>';
                     arsort($selectQueryTypeTicker);
                     echo '<ol>';
                     foreach ($selectQueryTypeTicker as $table => $occurrences) {
                         echo '<li>' . JText::sprintf('PLG_DEBUG_QUERY_TYPE_AND_OCCURRENCES', $table, $occurrences) . '</li>';
                     }
                     echo '</ol>';
                 }
                 if ($totalOtherQueryTypes) {
                     echo '<h5>' . JText::sprintf('PLG_DEBUG_OTHER_QUERIES') . '</h5>';
                     arsort($otherQueryTypeTicker);
                     echo '<ol>';
                     foreach ($otherQueryTypeTicker as $table => $occurrences) {
                         echo '<li>' . JText::sprintf('PLG_DEBUG_QUERY_TYPE_AND_OCCURRENCES', $table, $occurrences) . '</li>';
                     }
                     echo '</ol>';
                 }
             }
         }
     }
     // Show language debug only if enabled
     if (JFactory::getApplication()->getCfg('debug_lang')) {
         $lang = JFactory::getLanguage();
         if ($this->params->get('language_errorfiles', 1)) {
             echo '<h4>' . JText::_('PLG_DEBUG_LANGUAGE_FILES_IN_ERROR') . '</h4>';
             $errorfiles = $lang->getErrorFiles();
             if (count($errorfiles)) {
                 echo '<ul>';
                 foreach ($errorfiles as $file => $error) {
                     echo "<li>{$error}</li>";
                 }
                 echo '</ul>';
             } else {
                 echo '<pre>' . JText::_('JNONE') . '</pre>';
             }
         }
         if ($this->params->get('language_files', 1)) {
             echo '<h4>' . JText::_('PLG_DEBUG_LANGUAGE_FILES_LOADED') . '</h4>';
             echo '<ul>';
             $extensions = $lang->getPaths();
             foreach ($extensions as $extension => $files) {
                 foreach ($files as $file => $status) {
                     echo "<li>{$file} {$status}</li>";
                 }
             }
             echo '</ul>';
         }
         if ($this->params->get('language_strings')) {
             $stripFirst = $this->params->get('strip-first');
             $stripPref = $this->params->get('strip-prefix');
             $stripSuff = $this->params->get('strip-suffix');
             echo '<h4>' . JText::_('PLG_DEBUG_UNTRANSLATED_STRINGS') . '</h4>';
             echo '<pre>';
             $orphans = $lang->getOrphans();
             if (count($orphans)) {
                 ksort($orphans, SORT_STRING);
                 $guesses = array();
                 foreach ($orphans as $key => $occurance) {
                     if (is_array($occurance) and isset($occurance[0])) {
                         $info =& $occurance[0];
                         $file = @$info['file'];
                         if (!isset($guesses[$file])) {
                             $guesses[$file] = array();
                         }
                         // Prepare the key
                         if (($pos = strpos($info['string'], '=')) > 0) {
                             $parts = explode('=', $info['string']);
                             $key = $parts[0];
                             $guess = $parts[1];
                         } else {
                             $guess = str_replace('_', ' ', $info['string']);
                             if ($stripFirst) {
                                 $parts = explode(' ', $guess);
                                 if (count($parts) > 1) {
                                     array_shift($parts);
                                     $guess = implode(' ', $parts);
                                 }
                             }
                             $guess = trim($guess);
                             if ($stripPref) {
                                 $guess = trim(preg_replace(chr(1) . '^' . $stripPref . chr(1) . 'i', '', $guess));
                             }
                             if ($stripSuff) {
                                 $guess = trim(preg_replace(chr(1) . $stripSuff . '$' . chr(1) . 'i', '', $guess));
                             }
                         }
                         $key = trim(strtoupper($key));
                         $key = preg_replace('#\\s+#', '_', $key);
                         $key = preg_replace('#\\W#', '', $key);
                         // Prepare the text
                         $guesses[$file][] = $key . '="' . $guess . '"';
                     }
                 }
                 foreach ($guesses as $file => $keys) {
                     echo "\n\n# " . ($file ? $file : JText::_('PLG_DEBUG_UNKNOWN_FILE')) . "\n\n";
                     echo implode("\n", $keys);
                 }
             } else {
                 echo JText::_('JNONE');
             }
             echo '</pre>';
         }
     }
     echo '</div>';
     $debug = ob_get_clean();
     $body = JResponse::getBody();
     $body = str_replace('</body>', $debug . '</body>', $body);
     echo str_replace('</body>', $debug . '</body>', $contents);
 }
Example #2
0
 /**
  * Converting the site URL to fit to the HTTP request
  *
  */
 function onAfterRender()
 {
     global $_PROFILER;
     // Do not render if debugging is not enabled
     if (!JDEBUG) {
         return;
     }
     $document =& JFactory::getDocument();
     $doctype = $document->getType();
     // Only render for HTML output
     if ($doctype !== 'html') {
         return;
     }
     // If the user is not allowed to view the output then end here
     $filterGroups = (array) $this->params->get('filter_groups', null);
     if (!empty($filterGroups)) {
         $userGroups = JFactory::getUser()->get('groups');
         if (!array_intersect($filterGroups, array_keys($userGroups))) {
             return;
         }
     }
     $profiler =& $_PROFILER;
     ob_start();
     echo '<div id="system-debug" class="profiler">';
     $errors = JError::getErrors();
     if (!empty($errors)) {
         echo '<h4>' . JText::_('Errors') . '</h4><ol>';
         while ($error = JError::getError(true)) {
             echo '<li>' . $error->getMessage() . '<br /><h4>' . JText::_('Info') . '</h4><pre>' . print_r($error->get('info'), true) . '</pre><br /><h4>' . JText::_('Backtrace') . '</h4>' . JError::renderBacktrace($error) . '</li>';
         }
         echo '</ol>';
     }
     if ($this->params->get('profile', 1)) {
         echo '<h4>' . JText::_('Debug_Profile_Information') . '</h4>';
         foreach ($profiler->getBuffer() as $mark) {
             echo '<div>' . $mark . '</div>';
         }
     }
     if ($this->params->get('memory', 1)) {
         echo '<h4>' . JText::_('Debug_Memory_Usage') . '</h4>';
         echo number_format($profiler->getMemory());
     }
     if ($this->params->get('queries', 1)) {
         $newlineKeywords = '#\\b(FROM|LEFT|INNER|OUTER|WHERE|SET|VALUES|ORDER|GROUP|HAVING|LIMIT|ON|AND)\\b#i';
         $db =& JFactory::getDbo();
         echo '<h4>' . JText::sprintf('Debug_Queries_logged', $db->getTicker()) . '</h4>';
         if ($log = $db->getLog()) {
             echo '<ol>';
             foreach ($log as $k => $sql) {
                 $text = preg_replace($newlineKeywords, '<br />&nbsp;&nbsp;\\0', $sql);
                 echo '<li>' . $text . '</li>';
             }
             echo '</ol>';
         }
     }
     $lang =& JFactory::getLanguage();
     if ($this->params->get('language_files', 1)) {
         echo '<h4>' . JText::_('Debug_Language_Files_Loaded') . '</h4>';
         echo '<ul>';
         $extensions = $lang->getPaths();
         foreach ($extensions as $extension => $files) {
             foreach ($files as $file => $status) {
                 echo "<li>{$file} {$status}</li>";
             }
         }
         echo '</ul>';
     }
     if ($this->params->get('language_strings')) {
         $stripFirst = $this->params->get('strip-first');
         $stripPref = $this->params->get('strip-prefix');
         $stripSuff = $this->params->get('strip-suffix');
         echo '<h4>' . JText::_('Debug_Untranslated_Strings') . '</h4>';
         echo '<pre>';
         $orphans = $lang->getOrphans();
         if (count($orphans)) {
             ksort($orphans, SORT_STRING);
             $guesses = array();
             foreach ($orphans as $key => $occurance) {
                 if (is_array($occurance) and isset($occurance[0])) {
                     $info =& $occurance[0];
                     $file = @$info['file'];
                     if (!isset($guesses[$file])) {
                         $guesses[$file] = array();
                     }
                     // Prepare the key
                     if (($pos = strpos($info['string'], '=')) > 0) {
                         $parts = explode('=', $info['string']);
                         $key = $parts[0];
                         $guess = $parts[1];
                     } else {
                         $guess = str_replace('_', ' ', $info['string']);
                         if ($stripFirst) {
                             $parts = explode(' ', $guess);
                             if (count($parts) > 1) {
                                 array_shift($parts);
                                 $guess = implode(' ', $parts);
                             }
                         }
                         $guess = trim($guess);
                         if ($stripPref) {
                             $guess = trim(preg_replace(chr(1) . '^' . $stripPref . chr(1) . 'i', '', $guess));
                         }
                         if ($stripSuff) {
                             $guess = trim(preg_replace(chr(1) . $stripSuff . '$' . chr(1) . 'i', '', $guess));
                         }
                     }
                     $key = trim(strtoupper($key));
                     $key = preg_replace('#\\s+#', '_', $key);
                     $key = preg_replace('#\\W#', '', $key);
                     // Prepare the text
                     $guesses[$file][] = $key . '=' . $guess;
                 }
             }
             foreach ($guesses as $file => $keys) {
                 echo "\n\n# " . ($file ? $file : JText::_('Debug_Unknown_file')) . "\n\n";
                 echo implode("\n", $keys);
             }
         } else {
             echo JText::_('JNone');
         }
         echo '</pre>';
     }
     echo '</div>';
     $debug = ob_get_clean();
     $body = JResponse::getBody();
     $body = str_replace('</body>', $debug . '</body>', $body);
     JResponse::setBody($body);
 }