diff --git a/InfoTool/Model/Index.php b/InfoTool/Model/Index.php new file mode 100644 index 0000000..f627698 --- /dev/null +++ b/InfoTool/Model/Index.php @@ -0,0 +1,225 @@ + + * @license GNU GENERAL PUBLIC LICENSE Version 3. See application/doc/COPYING + */ + +/** + * @name $InfoToolModel + */ +namespace InfoTool\Model; + +/** + * Index + */ +class Index +{ + + /** + * toolbar array + * + * @var array + * @access private + */ + private $aToolbar = array (); + + /** + * adds Event Listerner to 'mvc.view.render.before'
+ * starts collecting Infos and save it to Registry + * + * @access public + * @param \Smarty $oView + * @return void + */ + public function __construct (\Smarty $oView) + { + // add toolbar at the right time + \MVC\Event::BIND ('mvc.view.render.before', function ($oView) + { + \InfoTool\Model\Index::injectToolbar ($oView); + }); + + // get toolbar values and save them to registry + \MVC\Registry::set ('aToolbar', $this->collectInfo ($oView)); + } + + /** + * adds the toolbar to the html dom before closing body tag + * + * @access public + * @static + * @param \Smarty $oView + * @return void + */ + public static function injectToolbar (\Smarty $oView) + { + $sToolBarVarName = 'sToolBar_' . uniqid (); + $sInfoToolSmarty = '{$' . $sToolBarVarName . '}'; + + // add toolbar template var to layout + $aToolbar = \MVC\Registry::get ('aToolbar'); + $oView->assign ('aToolbar', $aToolbar); + $oView->assign ($sToolBarVarName, $oView->loadTemplateAsString (realpath (__DIR__ . '/../') . '/templates/infoTool.tpl')); + + // disable regular view output + \MVC\View::$_bEchoOut = FALSE; + + // inject toolbar var to regular string output via DOM + INJECT: + { + $oDom = new \DOMDocument(null, null); + + // prevent error messages occuring by using DOM + // @see http://stackoverflow.com/a/6090728/2487859 + libxml_use_internal_errors (true); + // DOMDocument::loadHTML will treat your string as being in ISO-8859-1 unless you tell it otherwise. + // @see http://stackoverflow.com/a/8218649/2487859 + $oDom->loadHTML ( + mb_convert_encoding( + $aToolbar['sRendered'], + 'HTML-ENTITIES', + 'UTF-8' + ) + ); + libxml_clear_errors (); + + // add toolbar tag as a placeholder before body closing tag + $oNode = $oDom->createElement ($sToolBarVarName); + $oBody = $oDom->getElementsByTagName ('body'); + + foreach ($oBody as $oItem) + { + $oItem->appendChild ($oNode); + } + + $sHtml = $oDom->saveHTML (); + + // render the toolbar + $sInfoToolRendered = $oView->fetch ('string:' . $sInfoToolSmarty); + + // replace toolbar tag placeholder with rendered toolbar + $sHtml = str_replace ('<' . $sToolBarVarName . '>', $sInfoToolRendered, $sHtml); + } + + // new output, now including toolbar + echo $sHtml; + } + + /** + * collects all Info for being displayed by the Toolbar + * + * @access private + * @param \Smarty $oView + * @return array $aToolbar containing all Info for toolbar + */ + private function collectInfo (\Smarty $oView) + { + $aToolbar = array (); + + $aToolbar['sPHP'] = phpversion (); + $aToolbar['sOS'] = PHP_OS; + $aToolbar['sEnv'] = \MVC\Registry::get('MVC_ENV'); + + $aToolbar['aGet'] = array_map('htmlentities', $_GET); + $aToolbar['aPost'] = array_map('htmlentities', $_POST); + $aToolbar['aCookie'] = array_map('htmlentities', $_COOKIE); + $aToolbar['aRequest'] = array_map('htmlentities', $_REQUEST); + $aToolbar['aSession'] = $_SESSION; + $aToolbar['aSmartyTemplateVars'] = $oView->getTemplateVars (); + $aConstants = get_defined_constants (true); + $aToolbar['aConstant'] = $aConstants['user']; + $aToolbar['aServer'] = $_SERVER; + + $aToolbar['oMvcRequestGetWhitelistParams'] = \MVC\Request::getInstance ()->getWhitelistParams (); + $aToolbar['oMvcRequestGetQueryArray'] = \MVC\Request::getInstance ()->getQueryArray (); + $aToolbar['aEvent'] = ((\MVC\Registry::isRegistered ('MVC_EVENT')) ? \MVC\Registry::get ('MVC_EVENT') : array ()); + + $aRequest = \MVC\Request::GETCURRENTREQUEST (); + $aToolbar['aRouting'] = array( + 'aRequest' => \MVC\Request::GETCURRENTREQUEST (), + 'sModule' => \MVC\Request::getInstance ()->getModule (), + 'sController' => \MVC\Request::getInstance ()->getController (), + 'sMethod' => \MVC\Request::getInstance ()->getMethod (), + 'sArg' => ((isset($aToolbar['oMvcRequestGetQueryArray']['GET']['a'])) ? $aToolbar['oMvcRequestGetQueryArray']['GET']['a'] : ''), + 'aRoute' => \MVC\Registry::get ('MVC_ROUTING_CURRENT'), + 'sRoutingJsonBuilder' => \MVC\Registry::get ('MVC_ROUTING_JSON_BUILDER'), + 'sRoutingHandling' => \MVC\Registry::get ('MVC_ROUTING_HANDLING') + ); + + $aPolicy = \MVC\Registry::get ('MVC_POLICY'); + $sController = '\\' . \MVC\Request::getInstance ()->getModule () . '\\Controller\\' . \MVC\Request::getInstance ()->getController (); + $sMethod = \MVC\Request::getInstance ()->getMethod (); + + $aToolbar['aPolicy']['aRule'] = ((\MVC\Registry::isRegistered ('MVC_POLICY')) ? \MVC\Registry::get ('MVC_POLICY') : array ()); + $aToolbar['aPolicy']['aApplied'] = ((isset($aPolicy[$sController][$sMethod])) ? $aPolicy[$sController][$sMethod] : false); + $aToolbar['aPolicy']['sAppliedAt'] = ((isset($aPolicy[$sController][$sMethod])) ? $sController . '::' . $sMethod : false); + + $sTemplate = ((file_exists($oView->sTemplate)) ? $oView->sTemplate : ((file_exists($oView->_joined_template_dir . '/' . $oView->sTemplate)) ? $oView->_joined_template_dir . '/' . $oView->sTemplate : false)); + $aToolbar['sTemplate'] = $sTemplate; + $aToolbar['sTemplateContent'] = file_get_contents ($aToolbar['sTemplate']); + + ob_start (); + $sTemplate = file_get_contents ($oView->sTemplate, true); + $oView->renderString ($sTemplate); + $sRendered = ob_get_contents (); + ob_end_clean (); + $aToolbar['sRendered'] = $sRendered; + + $aToolbar['aFilesIncluded'] = get_required_files (); + $aToolbar['aMemory'] = array ( + 'iRealMemoryUsage' => (memory_get_usage (true) / 1024) + , 'dMemoryUsage' => (memory_get_usage () / 1024) + , 'dMemoryPeakUsage' => (memory_get_peak_usage () / 1024) + ); + $aToolbar['aRegistry'] = \MVC\Registry::getStorageArray (); + $aToolbar['aCache'] = $this->getCaches (); + $aToolbar['aError'] = \MVC\Error::getERROR (); + $aToolbar['oIds'] = ( (\MVC\Registry::isRegistered ('MVC_IDS_IMPACT')) ? \MVC\Registry::get ('MVC_IDS_IMPACT') : '' ); + $aToolbar['aIdsConfig'] = ( (\MVC\Registry::isRegistered ('MVC_IDS_INIT')) ? \MVC\Registry::get ('MVC_IDS_INIT') : '' ); + $aToolbar['aIdsDisposed'] = ( (\MVC\Registry::isRegistered ('MVC_IDS_DISPOSED')) ? \MVC\Registry::get ('MVC_IDS_DISPOSED') : '' ); + + $iMicrotime = microtime (true); + $sMicrotime = sprintf ("%06d", ($iMicrotime - floor ($iMicrotime)) * 1000000); + $oDateTime = new \DateTime (date ('Y-m-d H:i:s.' . $sMicrotime, $iMicrotime)); + $oStart = \MVC\Session::getInstance ()->get ('startDateTime'); + $dDiff = (date_format ($oDateTime, "s.u") - date_format ($oStart, "s.u")); + $aToolbar['sConstructionTime'] = round ($dDiff, 3); + + return $aToolbar; + } + + /** + * get cachefiles + * + * @access private + * @return array $aCache + */ + private function getCaches () + { + $aCache = array (); + $oObjects = new \RecursiveIteratorIterator ( + new \RecursiveDirectoryIterator ( + \MVC\Registry::get ('MVC_CACHE_DIR'), + 0 + ), + \RecursiveIteratorIterator::SELF_FIRST, + 0 + ); + + foreach ($oObjects as $sName => $oObject) + { + $sTmp = str_replace (\MVC\Registry::get ('MVC_CACHE_DIR'), '', $sName); + + if ($sTmp != '.' && $sTmp != '..') + { + $aCache[] = $sTmp; + } + } + + return $aCache; + } +} diff --git a/InfoTool/README.md b/InfoTool/README.md index 8c384e0..82a0d1c 100644 --- a/InfoTool/README.md +++ b/InfoTool/README.md @@ -1 +1,39 @@ # myMVC_module_InfoTool +This is a module for myMVC (https://github.com/gueff/myMVC). Get it run in a few Steps: + + +## 1. Download this Repository +and place it inside myMVC's `modules` folder: +~~~ + application + config + modules + [..] + InfoTool + Controller + Event + Model + _INSTALL + README.md + [..] + public + composer.json + manager.php + README.md +~~~ + +## 2. Activate via Event Listener +~~~ +/* + * switch on InfoTool in develop environment + * immediatly after the target class/method was called + */ +if ('develop' === \MVC\Registry::get('MVC_ENV')) +{ + \MVC\Event::BIND ('mvc.reflect.targetObject.after', function ($oObject) + { + // switch on InfoTool + new \InfoTool\Model\Index ($oObject->oBlogixxViewIndex); + }); +} +~~~ \ No newline at end of file diff --git a/InfoTool/templates/infoTool.tpl b/InfoTool/templates/infoTool.tpl new file mode 100644 index 0000000..c33b1ff --- /dev/null +++ b/InfoTool/templates/infoTool.tpl @@ -0,0 +1,505 @@ +{* + +see /InfoTool/README.md +for more Info + +*} + + + + + + +