PageRenderTime 53ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/manager/actions/mutate_plugin.dynamic.php

https://github.com/good-web-master/modx.evo.custom
PHP | 488 lines | 443 code | 33 blank | 12 comment | 73 complexity | 63f4a880fa145cd018ebb9fe8e776a09 MD5 | raw file
Possible License(s): LGPL-2.1, AGPL-1.0, GPL-2.0, MIT, BSD-3-Clause
  1. <?php
  2. if(IN_MANAGER_MODE!="true") die("<b>INCLUDE_ORDERING_ERROR</b><br /><br />Please use the MODx Content Manager instead of accessing this file directly.");
  3. switch((int) $_REQUEST['a']) {
  4. case 102:
  5. if(!$modx->hasPermission('edit_plugin')) {
  6. $e->setError(3);
  7. $e->dumpError();
  8. }
  9. break;
  10. case 101:
  11. if(!$modx->hasPermission('new_plugin')) {
  12. $e->setError(3);
  13. $e->dumpError();
  14. }
  15. break;
  16. default:
  17. $e->setError(3);
  18. $e->dumpError();
  19. }
  20. $id = isset($_REQUEST['id']) ? intval($_REQUEST['id']) : 0;
  21. // check to see the plugin editor isn't locked
  22. $sql = "SELECT internalKey, username FROM $dbase.`".$table_prefix."active_users` WHERE $dbase.`".$table_prefix."active_users`.action=102 AND $dbase.`".$table_prefix."active_users`.id=$id";
  23. $rs = mysql_query($sql);
  24. $limit = mysql_num_rows($rs);
  25. if($limit>1) {
  26. for ($i=0;$i<$limit;$i++) {
  27. $lock = mysql_fetch_assoc($rs);
  28. if($lock['internalKey']!=$modx->getLoginUserID()) {
  29. $msg = sprintf($_lang["lock_msg"],$lock['username'],"plugin");
  30. $e->setError(5, $msg);
  31. $e->dumpError();
  32. }
  33. }
  34. }
  35. // end check for lock
  36. if(isset($_GET['id'])) {
  37. $sql = "SELECT * FROM $dbase.`".$table_prefix."site_plugins` WHERE $dbase.`".$table_prefix."site_plugins`.id = $id;";
  38. $rs = mysql_query($sql);
  39. $limit = mysql_num_rows($rs);
  40. if($limit>1) {
  41. echo "Multiple plugins sharing same unique id. Not good.<p>";
  42. exit;
  43. }
  44. if($limit<1) {
  45. header("Location: /index.php?id=".$site_start);
  46. }
  47. $content = mysql_fetch_assoc($rs);
  48. $_SESSION['itemname']=$content['name'];
  49. if($content['locked']==1 && $_SESSION['mgrRole']!=1) {
  50. $e->setError(3);
  51. $e->dumpError();
  52. }
  53. } else {
  54. $_SESSION['itemname']="New Plugin";
  55. }
  56. ?>
  57. <script language="JavaScript">
  58. function duplicaterecord(){
  59. if(confirm("<?php echo $_lang['confirm_duplicate_record'] ?>")==true) {
  60. documentDirty=false;
  61. document.location.href="index.php?id=<?php echo $_REQUEST['id']; ?>&a=105";
  62. }
  63. }
  64. function deletedocument() {
  65. if(confirm("<?php echo $_lang['confirm_delete_plugin']; ?>")==true) {
  66. documentDirty=false;
  67. document.location.href="index.php?id=" + document.mutate.id.value + "&a=104";
  68. }
  69. }
  70. function setTextWrap(ctrl,b){
  71. if(!ctrl) return;
  72. ctrl.wrap = (b)? "soft":"off";
  73. }
  74. // Current Params/Configurations
  75. var currentParams = {};
  76. function showParameters(ctrl) {
  77. var c,p,df,cp;
  78. var ar,desc,value,key,dt;
  79. currentParams = {}; // reset;
  80. if (ctrl) {
  81. f = ctrl.form;
  82. } else {
  83. f= document.forms['mutate'];
  84. if(!f) return;
  85. }
  86. // setup parameters
  87. tr = (document.getElementById) ? document.getElementById('displayparamrow'):document.all['displayparamrow'];
  88. dp = (f.properties.value) ? f.properties.value.split("&"):"";
  89. if(!dp) tr.style.display='none';
  90. else {
  91. t='<table width="300" style="margin-bottom:3px;margin-left:14px;background-color:#EEEEEE" cellpadding="2" cellspacing="1"><thead><tr><td width="50%"><?php echo $_lang['parameter']; ?></td><td width="50%"><?php echo $_lang['value']; ?></td></tr></thead>';
  92. for(p = 0; p < dp.length; p++) {
  93. dp[p]=(dp[p]+'').replace(/^\s|\s$/,""); // trim
  94. ar = dp[p].split("=");
  95. key = ar[0] // param
  96. ar = (ar[1]+'').split(";");
  97. desc = ar[0]; // description
  98. dt = ar[1]; // data type
  99. value = decode((ar[2])? ar[2]:'');
  100. // store values for later retrieval
  101. if (key && (dt=='list' || dt=='list-multi')) currentParams[key] = [desc,dt,value,ar[3]];
  102. else if (key) currentParams[key] = [desc,dt,value];
  103. if (dt) {
  104. switch(dt) {
  105. case 'int':
  106. c = '<input type="text" name="prop_'+key+'" value="'+value+'" size="30" onchange="setParameter(\''+key+'\',\''+dt+'\',this)" />';
  107. break;
  108. case 'menu':
  109. value = ar[3];
  110. c = '<select name="prop_'+key+'" style="width:168px" onchange="setParameter(\''+key+'\',\''+dt+'\',this)">';
  111. ls = (ar[2]+'').split(",");
  112. if(currentParams[key]==ar[2]) currentParams[key] = ls[0]; // use first list item as default
  113. for(i=0;i<ls.length;i++){
  114. c += '<option value="'+ls[i]+'"'+((ls[i]==value)? ' selected="selected"':'')+'>'+ls[i]+'</option>';
  115. }
  116. c += '</select>';
  117. break;
  118. case 'list':
  119. value = ar[3];
  120. ls = (ar[2]+'').split(",");
  121. if(currentParams[key]==ar[2]) currentParams[key] = ls[0]; // use first list item as default
  122. c = '<select name="prop_'+key+'" size="'+ls.length+'" style="width:168px" onchange="setParameter(\''+key+'\',\''+dt+'\',this)">';
  123. for(i=0;i<ls.length;i++){
  124. c += '<option value="'+ls[i]+'"'+((ls[i]==value)? ' selected="selected"':'')+'>'+ls[i]+'</option>';
  125. }
  126. c += '</select>';
  127. break;
  128. case 'list-multi':
  129. value = typeof ar[3] !== 'undefined' ? (ar[3]+'').replace(/^\s|\s$/,"") : '';
  130. arrValue = value.split(",");
  131. ls = (ar[2]+'').split(",");
  132. if(currentParams[key]==ar[2]) currentParams[key] = ls[0]; // use first list item as default
  133. c = '<select name="prop_'+key+'" size="'+ls.length+'" multiple="multiple" style="width:168px" onchange="setParameter(\''+key+'\',\''+dt+'\',this)">';
  134. for(i=0;i<ls.length;i++){
  135. if(arrValue.length){
  136. var found = false;
  137. for(j=0;j<arrValue.length;j++){
  138. if (ls[i] == arrValue[j]) {
  139. found = true;
  140. }
  141. }
  142. if(found == true){
  143. c += '<option value="'+ls[i]+'" selected="selected">'+ls[i]+'</option>';
  144. }else{
  145. c += '<option value="'+ls[i]+'">'+ls[i]+'</option>';
  146. }
  147. }else{
  148. c += '<option value="'+ls[i]+'">'+ls[i]+'</option>';
  149. }
  150. }
  151. c += '</select>';
  152. break;
  153. case 'textarea':
  154. c = '<textarea class="phptextarea" name="prop_'+key+'" cols="50" rows="4" onchange="setParameter(\''+key+'\',\''+dt+'\',this)">'+value+'</textarea>';
  155. break;
  156. default: // string
  157. c = '<input type="text" name="prop_'+key+'" value="'+value+'" size="30" onchange="setParameter(\''+key+'\',\''+dt+'\',this)" />';
  158. break;
  159. }
  160. t +='<tr><td bgcolor="#FFFFFF" width="50%">'+desc+'</td><td bgcolor="#FFFFFF" width="50%">'+c+'</td></tr>';
  161. };
  162. }
  163. t+='</table>';
  164. td = (document.getElementById) ? document.getElementById('displayparams'):document.all['displayparams'];
  165. td.innerHTML = t;
  166. tr.style.display='';
  167. }
  168. implodeParameters();
  169. }
  170. function setParameter(key,dt,ctrl) {
  171. var v;
  172. if(!ctrl) return null;
  173. switch (dt) {
  174. case 'int':
  175. ctrl.value = parseInt(ctrl.value);
  176. if(isNaN(ctrl.value)) ctrl.value = 0;
  177. v = ctrl.value;
  178. break;
  179. case 'menu':
  180. v = ctrl.options[ctrl.selectedIndex].value;
  181. currentParams[key][3] = v;
  182. implodeParameters();
  183. return;
  184. break;
  185. case 'list':
  186. v = ctrl.options[ctrl.selectedIndex].value;
  187. currentParams[key][3] = v;
  188. implodeParameters();
  189. return;
  190. break;
  191. case 'list-multi':
  192. var arrValues = new Array;
  193. for(var i=0; i < ctrl.options.length; i++){
  194. if(ctrl.options[i].selected){
  195. arrValues.push(ctrl.options[i].value);
  196. }
  197. }
  198. currentParams[key][3] = arrValues.toString();
  199. implodeParameters();
  200. return;
  201. break;
  202. default:
  203. v = ctrl.value+'';
  204. break;
  205. }
  206. currentParams[key][2] = v;
  207. implodeParameters();
  208. }
  209. // implode parameters
  210. function implodeParameters(){
  211. var v, p, s='';
  212. for(p in currentParams){
  213. if(currentParams[p]) {
  214. v = currentParams[p].join(";");
  215. if(s && v) s+=' ';
  216. if(v) s += '&'+p+'='+ v;
  217. }
  218. }
  219. document.forms['mutate'].properties.value = s;
  220. }
  221. function encode(s){
  222. s=s+'';
  223. s = s.replace(/\=/g,'%3D'); // =
  224. s = s.replace(/\&/g,'%26'); // &
  225. return s;
  226. }
  227. function decode(s){
  228. s=s+'';
  229. s = s.replace(/\%3D/g,'='); // =
  230. s = s.replace(/\%26/g,'&'); // &
  231. return s;
  232. }
  233. </script>
  234. <form name="mutate" method="post" action="index.php?a=103">
  235. <?php
  236. // invoke OnPluginFormPrerender event
  237. $evtOut = $modx->invokeEvent("OnPluginFormPrerender",array("id" => $id));
  238. if(is_array($evtOut)) echo implode("",$evtOut);
  239. ?>
  240. <input type="hidden" name="id" value="<?php echo $content['id'];?>">
  241. <input type="hidden" name="mode" value="<?php echo $_GET['a'];?>">
  242. <h1><?php echo $_lang['plugin_title']; ?></h1>
  243. <div id="actions">
  244. <ul class="actionButtons">
  245. <li id="Button1">
  246. <a href="#" onclick="documentDirty=false; document.mutate.save.click();saveWait('mutate');">
  247. <img src="<?php echo $_style["icons_save"]?>" /> <?php echo $_lang['save']?>
  248. </a>
  249. <span class="and"> + </span>
  250. <select id="stay" name="stay">
  251. <option id="stay1" value="1" <?php echo $_REQUEST['stay']=='1' ? ' selected=""' : ''?> ><?php echo $_lang['stay_new']?></option>
  252. <option id="stay2" value="2" <?php echo $_REQUEST['stay']=='2' ? ' selected="selected"' : ''?> ><?php echo $_lang['stay']?></option>
  253. <option id="stay3" value="" <?php echo $_REQUEST['stay']=='' ? ' selected=""' : ''?> ><?php echo $_lang['close']?></option>
  254. </select>
  255. </li>
  256. <?php
  257. if ($_GET['a'] == '102') { ?>
  258. <li id="Button2"><a href="#" onclick="duplicaterecord();"><img src="<?php echo $_style["icons_resource_duplicate"] ?>" /> <?php echo $_lang["duplicate"]; ?></a></li>
  259. <li id="Button3" class="disabled"><a href="#" onclick="deletedocument();"><img src="<?php echo $_style["icons_delete_document"] ?>" /> <?php echo $_lang['delete']?></a></li>
  260. <?php } else { ?>
  261. <li id="Button3"><a href="#" onclick="deletedocument();"><img src="<?php echo $_style["icons_delete_document"] ?>" /> <?php echo $_lang['delete']?></a></li>
  262. <?php } ?>
  263. <li id="Button5"><a href="#" onclick="documentDirty=false;document.location.href='index.php?a=76';"><img src="<?php echo $_style["icons_cancel"] ?>" /> <?php echo $_lang['cancel']?></a></li>
  264. </ul>
  265. </div>
  266. <div class="sectionBody">
  267. <p><?php echo $_lang['plugin_msg']; ?></p>
  268. <script type="text/javascript" src="media/script/tabpane.js"></script>
  269. <div class="tab-pane" id="snipetPane">
  270. <script type="text/javascript">
  271. tpSnippet = new WebFXTabPane( document.getElementById( "snipetPane"), <?php echo $modx->config['remember_last_tab'] == 1 ? 'true' : 'false'; ?> );
  272. </script>
  273. <!-- General -->
  274. <div class="tab-page" id="tabSnippet">
  275. <h2 class="tab"><?php echo $_lang["settings_general"] ?></h2>
  276. <script type="text/javascript">tpSnippet.addTabPage( document.getElementById( "tabSnippet" ) );</script>
  277. <table border="0" cellspacing="0" cellpadding="0">
  278. <tr>
  279. <td align="left"><?php echo $_lang['plugin_name']; ?>:</td>
  280. <td align="left"><input name="name" type="text" maxlength="100" value="<?php echo htmlspecialchars($content['name']);?>" class="inputBox" style="width:150px;" onChange='documentDirty=true;'><span class="warning" id='savingMessage'>&nbsp;</span></td>
  281. </tr>
  282. <tr>
  283. <td align="left"><?php echo $_lang['plugin_desc']; ?>:&nbsp;&nbsp;</td>
  284. <td align="left"><input name="description" type="text" maxlength="255" value="<?php echo $content['description'];?>" class="inputBox" style="width:300px;" onChange='documentDirty=true;'></td>
  285. </tr>
  286. <tr>
  287. <td align="left" valign="top" colspan="2"><input name="disabled" type="checkbox" <?php echo $content['disabled']==1 ? "checked='checked'" : "";?> value="on" class="inputBox"> <?php echo $content['disabled']==1 ? "<span class='warning'>".$_lang['plugin_disabled']."</span>":$_lang['plugin_disabled']; ?></td>
  288. </tr>
  289. <tr>
  290. <td align="left" valign="top" colspan="2"><input name="locked" type="checkbox" <?php echo $content['locked']==1 ? "checked='checked'" : "" ;?> value="on" class="inputBox"> <?php echo $_lang['lock_plugin']; ?> <span class="comment"><?php echo $_lang['lock_plugin_msg']; ?></span></td>
  291. </tr>
  292. </table>
  293. <!-- PHP text editor start -->
  294. <div style="width:100%;position:relative">
  295. <div style="padding:1px; width:100%; height:16px;background-color:#eeeeee; border-top:1px solid #e0e0e0;margin-top:5px">
  296. <span style="float:left;color:#707070;font-weight:bold; padding:3px">&nbsp;<?php echo $_lang['plugin_code']; ?></span>
  297. <span style="float:right;color:#707070;"><?php echo $_lang['wrap_lines']; ?><input name="wrap" type="checkbox" <?php echo $content['wrap']== 1 ? "checked='checked'" : "" ;?> class="inputBox" onclick="setTextWrap(document.mutate.post,this.checked)" /></span>
  298. </div>
  299. <textarea dir="ltr" name="post" class="phptextarea" style="width:100%; height:370px;" wrap="<?php echo $content['wrap']== 1 ? "soft" : "off" ;?>" onchange="documentDirty=true;"><?php echo htmlspecialchars($content['plugincode']); ?></textarea>
  300. </div>
  301. <!-- PHP text editor end -->
  302. </div>
  303. <!-- Configuration/Properties -->
  304. <div class="tab-page" id="tabProps">
  305. <h2 class="tab"><?php echo $_lang["settings_config"] ?></h2>
  306. <script type="text/javascript">tpSnippet.addTabPage( document.getElementById( "tabProps" ) );</script>
  307. <table width="90%" border="0" cellspacing="0" cellpadding="0">
  308. <tr>
  309. <td align="left"><?php echo $_lang['existing_category']; ?>:&nbsp;&nbsp;</td>
  310. <td align="left"><select name="categoryid" style="width:300px;" onChange='documentDirty=true;'>
  311. <option>&nbsp;</option>
  312. <?php
  313. include_once "categories.inc.php";
  314. $ds = getCategories();
  315. if($ds) foreach($ds as $n=>$v){
  316. echo "<option value='".$v['id']."'".($content["category"]==$v["id"]? " selected='selected'":"").">".htmlspecialchars($v["category"])."</option>";
  317. }
  318. ?>
  319. </select>
  320. </td>
  321. </tr>
  322. <tr>
  323. <td align="left" valign="top" style="padding-top:5px;"><?php echo $_lang['new_category']; ?>:</td>
  324. <td align="left" valign="top" style="padding-top:5px;"><input name="newcategory" type="text" maxlength="45" value="" class="inputBox" style="width:300px;" onChange='documentDirty=true;'></td>
  325. </tr>
  326. <tr>
  327. <td align="left"><?php echo $_lang['import_params']; ?>:&nbsp;&nbsp;</td>
  328. <td align="left"><select name="moduleguid" style="width:300px;" onChange='documentDirty=true;'>
  329. <option>&nbsp;</option>
  330. <?php
  331. $sql = "SELECT sm.id,sm.name,sm.guid " .
  332. "FROM ".$modx->getFullTableName("site_modules")." sm ".
  333. "INNER JOIN ".$modx->getFullTableName("site_module_depobj")." smd ON smd.module=sm.id AND smd.type=30 ".
  334. "INNER JOIN ".$modx->getFullTableName("site_plugins")." sp ON sp.id=smd.resource ".
  335. "WHERE smd.resource='$id' AND sm.enable_sharedparams='1' ".
  336. "ORDER BY sm.name ";
  337. $ds = $modx->dbQuery($sql);
  338. if($ds) while($row = $modx->fetchRow($ds)){
  339. echo "<option value='".$row['guid']."'".($content["moduleguid"]==$row["guid"]? " selected='selected'":"").">".htmlspecialchars($row["name"])."</option>";
  340. }
  341. ?>
  342. </select>
  343. </td>
  344. </tr>
  345. <tr>
  346. <td>&nbsp;</td>
  347. <td align="left" valign="top"><span style="width:300px;" ><span class="comment"><?php echo $_lang['import_params_msg']; ?></span></span><br /><br /></td>
  348. </tr>
  349. <tr>
  350. <td align="left" valign="top"><?php echo $_lang['plugin_config']; ?>:</td>
  351. <td align="left" valign="top"><textarea class="phptextarea" name="properties" onChange='showParameters(this);documentDirty=true;'><?php echo $content['properties'];?></textarea><br /><input type="button" value="<?php echo $_lang['update_params']; ?>" /></td>
  352. </tr>
  353. <tr id="displayparamrow">
  354. <td valign="top" align="left">&nbsp;</td>
  355. <td align="left" id="displayparams">&nbsp;</td>
  356. </tr>
  357. </table>
  358. </div>
  359. <!-- System Events -->
  360. <div class="tab-page" id="tabEvents">
  361. <h2 class="tab"><?php echo $_lang["settings_events"] ?></h2>
  362. <script type="text/javascript">tpSnippet.addTabPage( document.getElementById( "tabEvents" ) );</script>
  363. <table width="90%" border="0" cellspacing="0" cellpadding="0">
  364. <tr>
  365. <td align="left" valign="top" colspan="2"><?php echo $_lang['plugin_event_msg']; ?><br />&nbsp;</td>
  366. </tr>
  367. <tr>
  368. <td colspan="2">
  369. <table border="0">
  370. <tr>
  371. <td valign="top">&nbsp;&nbsp;</td>
  372. <td>
  373. <table width="100%" border="0">
  374. <?php
  375. // get selected events
  376. if(is_numeric($id) && $id > 0) {
  377. $sql = "
  378. SELECT evtid, pluginid
  379. FROM $dbase.`".$table_prefix."site_plugin_events`
  380. WHERE pluginid='$id'
  381. ";
  382. $evts = array();
  383. $rs = mysql_query($sql);
  384. $limit = mysql_num_rows($rs);
  385. for ($i=0; $i<$limit; $i++) {
  386. $row = mysql_fetch_assoc($rs);
  387. $evts[] = $row['evtid'];
  388. }
  389. } else {
  390. if(isset($content['sysevents']) && is_array($content['sysevents'])) {
  391. $evts = $content['sysevents'];
  392. } else {
  393. $evts = array();
  394. }
  395. }
  396. // display system events
  397. $evtnames = array();
  398. $services = array(
  399. "Parser Service Events",
  400. "Manager Access Events",
  401. "Web Access Service Events",
  402. "Cache Service Events",
  403. "Template Service Events",
  404. "User Defined Events"
  405. );
  406. $sql = "SELECT * FROM $dbase.`".$table_prefix."system_eventnames` ORDER BY service DESC, groupname, name";
  407. $rs = mysql_query($sql);
  408. $limit = mysql_num_rows($rs);
  409. if($limit==0) echo "<tr><td>&nbsp;</td></tr>";
  410. else for ($i=0; $i<$limit; $i++) {
  411. $row = mysql_fetch_assoc($rs);
  412. // display records
  413. if($srv!=$row['service']){
  414. $srv=$row['service'];
  415. if(count($evtnames)>0) echoEventRows($evtnames);
  416. echo "<tr><td colspan='2'><div class='split' style='margin:10px 0;'></div></td></tr>";
  417. echo "<tr><td colspan='2'><b>".$services[$srv-1]."</b></td></tr>";
  418. }
  419. // display group name
  420. if($grp!=$row['groupname']){
  421. $grp=$row['groupname'];
  422. if(count($evtnames)>0) echoEventRows($evtnames);
  423. echo "<tr><td colspan='2'><div class='split' style='margin:10px 0;'></div></td></tr>";
  424. echo "<tr><td colspan='2'><b>".$row['groupname']."</b></td></tr>";
  425. }
  426. $evtnames[] = '<input name="sysevents[]" type="checkbox"'.(in_array($row['id'],$evts) ? " checked='checked' " : "").'class="inputBox" value="'.$row['id'].'" />'.$row['name'];
  427. if(count($evtnames)==2) echoEventRows($evtnames);
  428. }
  429. if(count($evtnames)>0) echoEventRows($evtnames);
  430. function echoEventRows(&$evtnames) {
  431. echo "<tr><td>".implode("</td><td>",$evtnames)."</td></tr>";
  432. $evtnames = array();
  433. }
  434. ?>
  435. </table>
  436. </td>
  437. </tr>
  438. </table>
  439. &nbsp;
  440. </td>
  441. </tr>
  442. </table>
  443. </div>
  444. </div>
  445. <input type="submit" name="save" style="display:none">
  446. </div>
  447. <?php
  448. // invoke OnPluginFormRender event
  449. $evtOut = $modx->invokeEvent("OnPluginFormRender",array("id" => $id));
  450. if(is_array($evtOut)) echo implode("",$evtOut);
  451. ?>
  452. </form>
  453. <script type="text/javascript">
  454. setTimeout('showParameters()',10);
  455. </script>