Source of file api.devconsole.php
Size: 15,351 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.devconsole.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 | <?php /** * Developers console implementation */ class DevConsole { /** * Contains alter config a key=>value */ protected $altCfg = array(); /** * Protected OnePunch scripts object instance * * @var object */ protected $onePunch = ''; /** * Some predefined stuff like routes here */ const URL_ME = '?module=sqlconsole'; const URL_DEVCON = '?module=sqlconsole&devconsole=true'; const OPTION_KEEP = 'DEVCON_SQL_KEEP'; const OPTION_DEBUG = 'DEVCON_VERBOSE_DEBUG'; const ROUTE_PHP_CON = 'devconsole'; const ROUTE_OP_RUN = 'runscript'; const ROUTE_OP_CREATE = 'scriptadd'; const ROUTE_OP_DELETE = 'delscript'; const ROUTE_OP_EDIT = 'editscript'; const ROUTE_OP_IMPORT = 'importoldcodetemplates'; /** * forms inputs post-routes here */ const PROUTE_SQL = 'sqlq'; const PROUTE_PHP = 'phpq'; const PROUTE_OPN_NAME = 'newscriptname'; const PROUTE_OPN_ALIAS = 'newscriptalias'; const PROUTE_OPN_CONTENT = 'newscriptcontent'; const PROUTE_OPE_ID = 'editscriptid'; const PROUTE_OPE_OLDALIAS = 'editscriptoldalias'; const PROUTE_OPE_NAME = 'editscriptname'; const PROUTE_OPE_ALIAS = 'editscriptalias'; const PROUTE_OPE_CONTENT = 'editscriptcontent'; const PROUTE_HLIGHT = 'phphightlight'; const PROUTE_TABLE = 'tableresult'; const PROUTE_TRUETABLE = 'truetableresult'; /** * Plagued by doubt that it can be done * In a culture so committed to temporal pleasure and distraction * Should I flee into lifelong mountain retreat? */ public function __construct() { $this->loadConfigs(); if (ubRouting::checkGet(self::ROUTE_PHP_CON)) { $this->initOnePunch(); } } /** * Loads required configs data * * @return void */ protected function loadConfigs() { global $ubillingConfig; $this->altCfg = $ubillingConfig->getAlter(); } /** * Initializes the OnePunch object * * @return void */ protected function initOnePunch() { $this->onePunch = new OnePunch(); } /** * Renders the controls for the developers console * * @return string */ protected function renderControls() { $result = ''; $migrationControls = ''; $result .= wf_Link(self::URL_ME, wf_img('skins/icon_restoredb.png') . ' ' . __('SQL Console'), false, 'ubButton'); $result .= wf_Link(self::URL_ME . '&' . self::ROUTE_PHP_CON . '=true', wf_img('skins/icon_php.png') . ' ' . __('PHP Console'), false, 'ubButton'); if (cfr('ROOT')) { $migrationControls .= wf_Link("?module=migration", wf_img('skins/icon_puzzle.png') . ' ' . __('Migration'), false, 'ubButton'); $migrationControls .= wf_Link("?module=migration2", wf_img('skins/icon_puzzle.png') . ' ' . __('Migration') . ' 2', false, 'ubButton'); $migrationControls .= wf_Link("?module=migration2_exten", wf_img('skins/icon_puzzle.png') . ' ' . __('Migration live (occupancy & tags)'), false, 'ubButton'); $migrationControls .= wf_Link("?module=migration2_ukv", wf_img('skins/icon_puzzle.png') . ' ' . __('Migration') . ' 2 UKV', false, 'ubButton'); } if (cfr('MIKMIGR')) { $migrationControls .= wf_Link("?module=mikbill_migration", wf_img('skins/ukv/dollar.png') . ' ' . __('Migration') . ' MikBiLL', false, 'ubButton'); } $result .= wf_modalAuto(wf_img('skins/icon_puzzle.png') . ' ' . __('Migration'), __('Migration'), $migrationControls, 'ubButton'); $result .= wf_tag('br'); return ($result); } /** * Renders the SQL console form * * This method generates the HTML form for the SQL console, including input fields for the SQL query, * and options for displaying the query result as a table * * @return string */ public function renderSqlForm() { $startQuery = ''; $result = ''; $sqlinputs = $this->renderControls(); $tableResultFlag = (ubRouting::checkPost(self::PROUTE_TABLE)) ? true : false; $trueTableResultFlag = (ubRouting::checkPost(self::PROUTE_TRUETABLE)) ? true : false; if (ubRouting::checkPost(self::PROUTE_SQL)) { if ($this->altCfg[self::OPTION_KEEP]) { $startQuery = ubRouting::post(self::PROUTE_SQL, 'callback', 'trim'); } } $sqlinputs .= wf_TextArea(self::PROUTE_SQL, '', $startQuery, true, '80x10'); $sqlinputs .= wf_CheckInput(self::PROUTE_TABLE, 'Display query result as table', true, $tableResultFlag); $sqlinputs .= wf_CheckInput(self::PROUTE_TRUETABLE, 'Display query result as table with fields', true, $trueTableResultFlag); $sqlinputs .= wf_Submit('Process query'); $result = wf_Form('', 'POST', $sqlinputs, 'glamour'); return ($result); } /** * Renders the PHP form for the dev console. * * This method generates the HTML code for the PHP form in the dev console. * It includes the necessary inputs, such as text areas and checkboxes, for * running and highlighting PHP code. * * @return string */ public function renderPhpForm() { $result = ''; $runCode = ''; $phpinputs = $this->renderControls(); $phphightlightFlag = (ubRouting::checkPost(self::PROUTE_HLIGHT)) ? true : false; //is this template run or clear area? if (ubRouting::checkGet(self::ROUTE_OP_RUN)) { $this->initOnePunch(); $runCode = htmlentities($this->onePunch->getScriptContent(ubRouting::get(self::ROUTE_OP_RUN)), ENT_COMPAT, "UTF-8"); } else { if ($this->altCfg[self::OPTION_KEEP]) { if (ubRouting::checkPost(self::PROUTE_PHP)) { $runCode = ubRouting::post(self::PROUTE_PHP); } } } $phpinputs .= wf_TextArea(self::PROUTE_PHP, '', $runCode, true, '80x10'); $phpinputs .= wf_CheckInput(self::PROUTE_HLIGHT, 'Hightlight this PHP code', true, $phphightlightFlag); $phpinputs .= wf_Submit('Run this code inside framework'); $result .= wf_Form(self::URL_DEVCON, 'POST', $phpinputs, 'glamour'); return ($result); } /** * Renders the PHP interfaces grid for the dev console. * * @return string */ public function renderPhpInterfaces() { $result = ''; $phpForm = $this->renderPhpForm(); //php console grid assemble $phpcells = wf_TableCell($phpForm, '50%', '', 'valign="top"'); if (ubRouting::checkGet(array(self::ROUTE_OP_CREATE))) { //show script creation form $punchCreateForm = $this->onePunch->renderCreateForm(); //override devconsole forms with script creation interface $phpcells = wf_TableCell($punchCreateForm, '100%', '', 'valign="top"'); } else { if (ubRouting::checkGet(self::ROUTE_OP_EDIT)) { //show scripts edit form $punchEditForm = $this->onePunch->renderEditForm($_GET['editscript']); //override devconsole forms with script editing interface $phpcells = wf_TableCell($punchEditForm, '100%', '', 'valign="top"'); } else { //show scripts list $punchScriptsList = $this->onePunch->renderScriptsList(); $punchScriptsList .= wf_tag('br'); $punchScriptsList .= wf_Link(self::URL_DEVCON . '&scriptadd=true', web_icon_create() . ' ' . __('Create') . ' ' . __('One-Punch') . ' ' . __('Script'), true, 'ubButton'); $phpcells .= wf_TableCell($punchScriptsList, '50%', '', 'valign="top"'); } } $phprows = wf_TableRow($phpcells); $result .= wf_TableBody($phprows, '100%', '0', ''); return ($result); } /** * Executes an SQL query and displays the result. * * This method checks if the SQL query is received through the POST request and then attempts to execute it. * If the query is not empty, it logs the query and starts buffering the output. * Depending on the PHP extension loaded (mysql or mysqli), it executes the query and fetches the result. * If the query execution fails, it returns an error message. * If the query execution is successful, it stores the query debug data and displays it if the corresponding option is enabled. * It then renders the query result based on the selected options: raw array result, table with fields, or table without fields. * Finally, it displays the query result, query status, and the number of returned records. * * @return void */ public function executeSqlQuery() { //here we go? if (ubRouting::checkPost(self::PROUTE_SQL)) { if (!extension_loaded('mysql')) { global $loginDB; //that instance initialized outside } $newquery = ubRouting::post(self::PROUTE_SQL, 'callback', 'trim'); $recCount = 0; //preventing notices on empty queries $vdump = ''; //used for storing query executing result $query_result = array(); //executed query result shall to be there //trying to execute received SQL query if (!empty($newquery)) { $stripquery = substr($newquery, 0, 70) . '..'; log_register('SQLCONSOLE ' . $stripquery); ob_start(); if (!extension_loaded('mysql')) { mysqli_report(0); $queried = mysqli_query($loginDB, $newquery); } else { $queried = mysql_query($newquery); } if ($queried === false) { ob_end_clean(); return (show_error(wf_tag('b') . __('Wrong query') . ': ' . wf_tag('b', true) . $newquery)); } else { if (!extension_loaded('mysql')) { mysqli_report(0); if ($queried !== true) { while (@$row = mysqli_fetch_assoc($queried)) { $query_result[] = $row; } } } else { while (@$row = mysql_fetch_assoc($queried)) { $query_result[] = $row; } } $sqlDebugData = ob_get_contents(); ob_end_clean(); log_register('SQLCONSOLE QUERYDONE'); if ($this->altCfg[self::OPTION_DEBUG]) { show_window(__('Console debug data'), $sqlDebugData); } } // trying to render SQL query execution results depends on selected options if (!empty($query_result)) { $recCount = count($query_result); if (!ubRouting::checkPost(self::PROUTE_TABLE) and !ubRouting::checkPost(self::PROUTE_TRUETABLE)) { //raw array result $vdump = var_export($query_result, true); } elseif (ubRouting::checkPost(self::PROUTE_TRUETABLE)) { //show query result as table with fields $tablecells = ''; $tablerows = ''; $fieldNames = array_keys($query_result[0]); if (!empty($fieldNames)) { $fieldsCnt = count($fieldNames); foreach ($fieldNames as $fieldName) { $tablecells .= wf_TableCell($fieldName); } $tablerows .= $tablecells; $tablecells = ''; foreach ($query_result as $eachresult) { for ($k = 0; $k < $fieldsCnt; $k++) { $tablecells .= wf_TableCell(''); } $tablerows .= wf_TableRow($tablecells, 'row1'); $tablecells = ''; foreach ($eachresult as $io => $key) { $tablecells .= wf_TableCell($key); } $tablerows .= wf_TableRow($tablecells, 'row3'); $tablecells = ''; } } $vdump = wf_TableBody($tablerows, '100%', '0', ''); } else { //show query result as table $tablerows = ''; foreach ($query_result as $eachresult) { $tablecells = wf_TableCell(''); $tablecells .= wf_TableCell(''); $tablerows .= wf_TableRow($tablecells, 'row1'); foreach ($eachresult as $io => $key) { $tablecells = wf_TableCell($io); $tablecells .= wf_TableCell($key); $tablerows .= wf_TableRow($tablecells, 'row3'); } } $vdump = wf_TableBody($tablerows, '100%', '0', ''); } } } //rendering records if available show_window(__('Result'), wf_tag('pre') . $vdump . wf_tag('pre', 'true')); //rendering query status here if (empty($newquery)) { show_warning(__('Empty query')); } else { if ($queried !== false) { show_info(__('SQL Query') . ': ' . $newquery); } if (empty($query_result)) { show_warning(__('Query returned empty result')); } else { show_success(__('Returned records count') . ': ' . $recCount); } } } } /** * Displays the debug data in the PHP console if enabled with option. * * @param string $debugData The debug data to be displayed. * * @return void */ public function showDebugData($debugData) { if ($this->altCfg[self::OPTION_DEBUG]) { show_window(__('Console debug data'), wf_tag('pre') . $debugData) . wf_tag('pre', true); } } /** * Displays the highlighted PHP code in a window if the POST request matches the specified route. * * @param string $phpCode The PHP code to be highlighted and displayed. * * @return void */ public function showCodeHighlight($phpCode) { if (ubRouting::checkPost(self::PROUTE_HLIGHT)) { $code = '<?php' . PHP_EOL . PHP_EOL; $code .= $phpCode . PHP_EOL . PHP_EOL; $code .= '?>'; show_window(__('Running this'), highlight_string($code, true)); } } } |