evolution-cms /
evolution
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | if( ! defined('IN_MANAGER_MODE') || IN_MANAGER_MODE !== true) {
|
||
| 3 | die("<b>INCLUDE_ORDERING_ERROR</b><br /><br />Please use the EVO Content Manager instead of accessing this file directly.");
|
||
| 4 | } |
||
| 5 | View Code Duplication | switch($modx->getManagerApi()->action) {
|
|
| 6 | case 107: |
||
| 7 | if(!$modx->hasPermission('new_module')) {
|
||
| 8 | $modx->webAlertAndQuit($_lang["error_no_privileges"]); |
||
| 9 | } |
||
| 10 | break; |
||
| 11 | case 108: |
||
| 12 | if(!$modx->hasPermission('edit_module')) {
|
||
| 13 | $modx->webAlertAndQuit($_lang["error_no_privileges"]); |
||
| 14 | } |
||
| 15 | break; |
||
| 16 | default: |
||
| 17 | $modx->webAlertAndQuit($_lang["error_no_privileges"]); |
||
| 18 | } |
||
| 19 | $id = isset($_REQUEST['id']) ? (int)$_REQUEST['id'] : 0; |
||
| 20 | // Get table names (alphabetical) |
||
| 21 | $tbl_membergroup_names = $modx->getDatabase()->getFullTableName('membergroup_names');
|
||
| 22 | $tbl_site_content = $modx->getDatabase()->getFullTableName('site_content');
|
||
| 23 | $tbl_site_htmlsnippets = $modx->getDatabase()->getFullTableName('site_htmlsnippets');
|
||
| 24 | $tbl_site_module_access = $modx->getDatabase()->getFullTableName('site_module_access');
|
||
| 25 | $tbl_site_module_depobj = $modx->getDatabase()->getFullTableName('site_module_depobj');
|
||
| 26 | $tbl_site_modules = $modx->getDatabase()->getFullTableName('site_modules');
|
||
| 27 | $tbl_site_plugins = $modx->getDatabase()->getFullTableName('site_plugins');
|
||
| 28 | $tbl_site_snippets = $modx->getDatabase()->getFullTableName('site_snippets');
|
||
| 29 | $tbl_site_templates = $modx->getDatabase()->getFullTableName('site_templates');
|
||
| 30 | $tbl_site_tmplvars = $modx->getDatabase()->getFullTableName('site_tmplvars');
|
||
| 31 | |||
| 32 | |||
| 33 | // check to see the module editor isn't locked |
||
| 34 | View Code Duplication | if($lockedEl = $modx->elementIsLocked(6, $id)) {
|
|
| 35 | $modx->webAlertAndQuit(sprintf($_lang['lock_msg'], $lockedEl['username'], $_lang['module'])); |
||
| 36 | } |
||
| 37 | // end check for lock |
||
| 38 | |||
| 39 | // Lock snippet for other users to edit |
||
| 40 | $modx->lockElement(6, $id); |
||
| 41 | |||
| 42 | if(isset($_GET['id'])) {
|
||
| 43 | $rs = $modx->getDatabase()->select('*', $tbl_site_modules, "id='{$id}'");
|
||
| 44 | $content = $modx->getDatabase()->getRow($rs); |
||
| 45 | if(!$content) {
|
||
| 46 | $modx->webAlertAndQuit("Module not found for id '{$id}'.");
|
||
| 47 | } |
||
| 48 | $content['properties'] = str_replace("&", "&", $content['properties']);
|
||
| 49 | $_SESSION['itemname'] = $content['name']; |
||
| 50 | View Code Duplication | if($content['locked'] == 1 && $_SESSION['mgrRole'] != 1) {
|
|
| 51 | $modx->webAlertAndQuit($_lang["error_no_privileges"]); |
||
| 52 | } |
||
| 53 | } else {
|
||
| 54 | $_SESSION['itemname'] = $_lang["new_module"]; |
||
| 55 | $content['wrap'] = '1'; |
||
| 56 | } |
||
| 57 | if($modx->getManagerApi()->hasFormValues()) {
|
||
| 58 | $modx->getManagerApi()->loadFormValues(); |
||
| 59 | } |
||
| 60 | |||
| 61 | // Add lock-element JS-Script |
||
| 62 | $lockElementId = $id; |
||
| 63 | $lockElementType = 6; |
||
| 64 | require_once(MODX_MANAGER_PATH . 'includes/active_user_locks.inc.php'); |
||
| 65 | ?> |
||
| 66 | <script type="text/javascript"> |
||
| 67 | function loadDependencies() {
|
||
| 68 | if(documentDirty) {
|
||
| 69 | if(!confirm("<?= $_lang['confirm_load_depends']?>")) {
|
||
| 70 | return; |
||
| 71 | } |
||
| 72 | } |
||
| 73 | documentDirty = false; |
||
| 74 | window.location.href = "index.php?id=<?= $_REQUEST['id']?>&a=113"; |
||
| 75 | } |
||
| 76 | |||
| 77 | var actions = {
|
||
| 78 | save: function() {
|
||
| 79 | documentDirty = false; |
||
| 80 | form_save = true; |
||
| 81 | document.mutate.save.click(); |
||
| 82 | saveWait('mutate');
|
||
| 83 | }, |
||
| 84 | duplicate: function() {
|
||
| 85 | if(confirm("<?= $_lang['confirm_duplicate_record'] ?>") === true) {
|
||
| 86 | documentDirty = false; |
||
| 87 | document.location.href = "index.php?id=<?= $_REQUEST['id'] ?>&a=111"; |
||
| 88 | } |
||
| 89 | }, |
||
| 90 | delete: function() {
|
||
| 91 | if(confirm("<?= $_lang['confirm_delete_module'] ?>") === true) {
|
||
| 92 | documentDirty = false; |
||
| 93 | document.location.href = "index.php?id=" + document.mutate.id.value + "&a=110"; |
||
| 94 | } |
||
| 95 | }, |
||
| 96 | cancel: function() {
|
||
| 97 | documentDirty = false; |
||
| 98 | document.location.href = 'index.php?a=106'; |
||
| 99 | }, |
||
| 100 | run: function() {
|
||
| 101 | document.location.href = "index.php?id=<?= $_REQUEST['id'] ?>&a=112"; |
||
| 102 | } |
||
| 103 | }; |
||
| 104 | |||
| 105 | function setTextWrap(ctrl, b) {
|
||
| 106 | if(!ctrl) return; |
||
| 107 | ctrl.wrap = (b) ? "soft" : "off"; |
||
| 108 | } |
||
| 109 | |||
| 110 | // Current Params/Configurations |
||
| 111 | var currentParams = {};
|
||
| 112 | var internal = <?= json_encode($internal) ?>; |
||
| 113 | var first = true; |
||
| 114 | |||
| 115 | function showParameters(ctrl) {
|
||
| 116 | var c, p, df, cp; |
||
| 117 | var ar, label, value, key, dt, defaultVal; |
||
| 118 | |||
| 119 | currentParams = {}; // reset;
|
||
| 120 | |||
| 121 | if(ctrl && ctrl.form) {
|
||
| 122 | f = ctrl.form; |
||
| 123 | } else {
|
||
| 124 | f = document.forms['mutate']; |
||
| 125 | if(!f) return; |
||
| 126 | } |
||
| 127 | |||
| 128 | tr = (document.getElementById) ? document.getElementById('displayparamrow') : document.all['displayparamrow'];
|
||
| 129 | |||
| 130 | // check if codemirror is used |
||
| 131 | var props = typeof myCodeMirrors != "undefined" && typeof myCodeMirrors['properties'] != "undefined" ? myCodeMirrors['properties'].getValue() : f.properties.value; |
||
| 132 | |||
| 133 | // convert old schemed setup parameters |
||
| 134 | if(!IsJsonString(props)) {
|
||
| 135 | dp = props ? props.match(/([^&=]+)=(.*?)(?=&[^&=]+=|$)/g) : ""; // match ¶mname= |
||
| 136 | if(!dp) tr.style.display = 'none'; |
||
| 137 | else {
|
||
| 138 | for(p = 0; p < dp.length; p++) {
|
||
| 139 | dp[p] = (dp[p] + '').replace(/^\s|\s$/, ""); // trim |
||
| 140 | ar = dp[p].match(/(?:[^\=]|==)+/g); // split by =, not by == |
||
| 141 | key = ar[0]; // param |
||
| 142 | ar = (ar[1] + '').split(";");
|
||
| 143 | label = ar[0]; // label |
||
| 144 | dt = ar[1]; // data type |
||
| 145 | value = decode((ar[2]) ? ar[2] : ''); |
||
| 146 | |||
| 147 | // convert values to new json-format |
||
| 148 | if(key && (dt === 'menu' || dt === 'list' || dt === 'list-multi' || dt === 'checkbox' || dt === 'radio')) {
|
||
| 149 | defaultVal = decode((ar[4]) ? ar[4] : ar[3]); |
||
| 150 | desc = decode((ar[5]) ? ar[5] : ""); |
||
| 151 | currentParams[key] = []; |
||
| 152 | currentParams[key][0] = {"label": label, "type": dt, "value": ar[3], "options": value, "default": defaultVal, "desc": desc};
|
||
| 153 | } else if(key) {
|
||
| 154 | defaultVal = decode((ar[3]) ? ar[3] : ar[2]); |
||
| 155 | desc = decode((ar[4]) ? ar[4] : ""); |
||
| 156 | currentParams[key] = []; |
||
| 157 | currentParams[key][0] = {"label": label, "type": dt, "value": value, "default": defaultVal, "desc": desc};
|
||
| 158 | } |
||
| 159 | } |
||
| 160 | } |
||
| 161 | } else {
|
||
| 162 | currentParams = JSON.parse(props); |
||
| 163 | } |
||
| 164 | |||
| 165 | t = '<table width="100%" class="displayparams grid"><thead><tr><td><?= $_lang['parameter'] ?></td><td><?= $_lang['value'] ?></td><td style="text-align:right;white-space:nowrap"><?= $_lang["set_default"] ?> </td></tr></thead>'; |
||
| 166 | |||
| 167 | try {
|
||
| 168 | var type, options, found, info, sd; |
||
| 169 | var ll, ls, sets = []; |
||
| 170 | |||
| 171 | Object.keys(currentParams).forEach(function(key) {
|
||
| 172 | |||
| 173 | if(key === 'internal' || currentParams[key][0]['label'] == undefined) return; |
||
| 174 | |||
| 175 | cp = currentParams[key][0]; |
||
| 176 | type = cp['type']; |
||
| 177 | value = cp['value']; |
||
| 178 | defaultVal = cp['default']; |
||
| 179 | label = cp['label'] != undefined ? cp['label'] : key; |
||
| 180 | desc = cp['desc'] + ''; |
||
| 181 | options = cp['options'] != undefined ? cp['options'] : ''; |
||
| 182 | |||
| 183 | ll = []; |
||
| 184 | ls = []; |
||
| 185 | if(options.indexOf('==') > -1) {
|
||
| 186 | // option-format: label==value||label==value |
||
| 187 | sets = options.split("||");
|
||
| 188 | for(i = 0; i < sets.length; i++) {
|
||
| 189 | split = sets[i].split("==");
|
||
| 190 | ll[i] = split[0]; |
||
| 191 | ls[i] = split[1] != undefined ? split[1] : split[0]; |
||
| 192 | } |
||
| 193 | } else {
|
||
| 194 | // option-format: value,value |
||
| 195 | ls = options.split(",");
|
||
| 196 | ll = ls; |
||
| 197 | } |
||
| 198 | |||
| 199 | switch(type) {
|
||
| 200 | case 'int': |
||
| 201 | c = '<input type="text" name="prop_' + key + '" value="' + value + '" size="30" onchange="setParameter(\'' + key + '\',\'' + type + '\',this)" />'; |
||
| 202 | break; |
||
| 203 | case 'menu': |
||
| 204 | c = '<select name="prop_' + key + '" onchange="setParameter(\'' + key + '\',\'' + type + '\',this)">'; |
||
| 205 | if(currentParams[key] === options) currentParams[key] = ls[0]; // use first list item as default |
||
| 206 | for(i = 0; i < ls.length; i++) {
|
||
| 207 | c += '<option value="' + ls[i] + '"' + ((ls[i] === value) ? ' selected="selected"' : '') + '>' + ll[i] + '</option>'; |
||
| 208 | } |
||
| 209 | c += '</select>'; |
||
| 210 | break; |
||
| 211 | case 'list': |
||
| 212 | if(currentParams[key] === options) currentParams[key] = ls[0]; // use first list item as default |
||
| 213 | c = '<select name="prop_' + key + '" size="' + ls.length + '" onchange="setParameter(\'' + key + '\',\'' + type + '\',this)">'; |
||
| 214 | for(i = 0; i < ls.length; i++) {
|
||
| 215 | c += '<option value="' + ls[i] + '"' + ((ls[i] === value) ? ' selected="selected"' : '') + '>' + ll[i] + '</option>'; |
||
| 216 | } |
||
| 217 | c += '</select>'; |
||
| 218 | break; |
||
| 219 | case 'list-multi': |
||
| 220 | // value = typeof ar[3] !== 'undefined' ? (ar[3] + '').replace(/^\s|\s$/, "") : ''; |
||
| 221 | arrValue = value.split(",");
|
||
| 222 | if(currentParams[key] === options) currentParams[key] = ls[0]; // use first list item as default |
||
| 223 | c = '<select name="prop_' + key + '" size="' + ls.length + '" multiple="multiple" onchange="setParameter(\'' + key + '\',\'' + type + '\',this)">'; |
||
| 224 | for(i = 0; i < ls.length; i++) {
|
||
| 225 | if(arrValue.length) {
|
||
| 226 | found = false; |
||
| 227 | for(j = 0; j < arrValue.length; j++) {
|
||
| 228 | if(ls[i] === arrValue[j]) {
|
||
| 229 | found = true; |
||
| 230 | } |
||
| 231 | } |
||
| 232 | if(found === true) {
|
||
| 233 | c += '<option value="' + ls[i] + '" selected="selected">' + ll[i] + '</option>'; |
||
| 234 | } else {
|
||
| 235 | c += '<option value="' + ls[i] + '">' + ll[i] + '</option>'; |
||
| 236 | } |
||
| 237 | } else {
|
||
| 238 | c += '<option value="' + ls[i] + '">' + ll[i] + '</option>'; |
||
| 239 | } |
||
| 240 | } |
||
| 241 | c += '</select>'; |
||
| 242 | break; |
||
| 243 | case 'checkbox': |
||
| 244 | lv = (value + '').split(",");
|
||
| 245 | c = ''; |
||
| 246 | for(i = 0; i < ls.length; i++) {
|
||
| 247 | c += '<label><input type="checkbox" name="prop_' + key + '[]" value="' + ls[i] + '"' + ((contains(lv, ls[i]) == true) ? ' checked="checked"' : '') + ' onchange="setParameter(\'' + key + '\',\'' + type + '\',this)" />' + ll[i] + '</label> '; |
||
| 248 | } |
||
| 249 | break; |
||
| 250 | case 'radio': |
||
| 251 | c = ''; |
||
| 252 | for(i = 0; i < ls.length; i++) {
|
||
| 253 | c += '<label><input type="radio" name="prop_' + key + '" value="' + ls[i] + '"' + ((ls[i] === value) ? ' checked="checked"' : '') + ' onchange="setParameter(\'' + key + '\',\'' + type + '\',this)" />' + ll[i] + '</label> '; |
||
| 254 | } |
||
| 255 | break; |
||
| 256 | case 'textarea': |
||
| 257 | c = '<textarea name="prop_' + key + '" rows="4" onchange="setParameter(\'' + key + '\',\'' + type + '\',this)">' + value + '</textarea>'; |
||
| 258 | break; |
||
| 259 | default: // string |
||
| 260 | c = '<input type="text" name="prop_' + key + '" value="' + value + '" onchange="setParameter(\'' + key + '\',\'' + type + '\',this)" />'; |
||
| 261 | break; |
||
| 262 | } |
||
| 263 | |||
| 264 | info = ''; |
||
| 265 | info += desc ? '<br/><small>' + desc + '</small>' : ''; |
||
| 266 | sd = defaultVal != undefined ? '<a title="<?= $_lang["set_default"] ?>" href="javascript:;" class="btn btn-primary" onclick="setDefaultParam(\'' + key + '\',1);return false;"><i class="fa fa-refresh"></i></a>' : ''; |
||
| 267 | |||
| 268 | t += '<tr><td class="labelCell" width="20%"><span class="paramLabel">' + label + '</span><span class="paramDesc">' + info + '</span></td><td class="inputCell relative" width="74%">' + c + '</td><td style="text-align: center">' + sd + '</td></tr>'; |
||
| 269 | }); |
||
| 270 | |||
| 271 | t += '</table>'; |
||
| 272 | |||
| 273 | } catch(e) {
|
||
| 274 | t = e + "\n\n" + props; |
||
| 275 | } |
||
| 276 | |||
| 277 | td = (document.getElementById) ? document.getElementById('displayparams') : document.all['displayparams'];
|
||
| 278 | td.innerHTML = t; |
||
| 279 | tr.style.display = ''; |
||
| 280 | |||
| 281 | implodeParameters(); |
||
| 282 | } |
||
| 283 | |||
| 284 | function setParameter(key, dt, ctrl) {
|
||
| 285 | var v; |
||
| 286 | var arrValues, cboxes = []; |
||
| 287 | if(!ctrl) return null; |
||
| 288 | switch(dt) {
|
||
| 289 | case 'int': |
||
| 290 | ctrl.value = parseInt(ctrl.value); |
||
| 291 | if(isNaN(ctrl.value)) ctrl.value = 0; |
||
| 292 | v = ctrl.value; |
||
| 293 | break; |
||
| 294 | case 'menu': |
||
| 295 | case 'list': |
||
| 296 | v = ctrl.options[ctrl.selectedIndex].value; |
||
| 297 | break; |
||
| 298 | case 'list-multi': |
||
| 299 | arrValues = []; |
||
| 300 | for(var i = 0; i < ctrl.options.length; i++) {
|
||
| 301 | if(ctrl.options[i].selected) {
|
||
| 302 | arrValues.push(ctrl.options[i].value); |
||
| 303 | } |
||
| 304 | } |
||
| 305 | v = arrValues.toString(); |
||
| 306 | break; |
||
| 307 | case 'checkbox': |
||
| 308 | arrValues = []; |
||
| 309 | cboxes = document.getElementsByName(ctrl.name); |
||
| 310 | for(var i = 0; i < cboxes.length; i++) {
|
||
| 311 | if(cboxes[i].checked) {
|
||
| 312 | arrValues.push(cboxes[i].value); |
||
| 313 | } |
||
| 314 | } |
||
| 315 | v = arrValues.toString(); |
||
| 316 | break; |
||
| 317 | default: |
||
| 318 | v = ctrl.value + ''; |
||
| 319 | break; |
||
| 320 | } |
||
| 321 | currentParams[key][0]['value'] = v; |
||
| 322 | implodeParameters(); |
||
| 323 | } |
||
| 324 | |||
| 325 | // implode parameters |
||
| 326 | function implodeParameters() {
|
||
| 327 | var stringified = JSON.stringify(currentParams, null, 2); |
||
| 328 | if(typeof myCodeMirrors != "undefined") {
|
||
| 329 | myCodeMirrors['properties'].setValue(stringified); |
||
| 330 | } else {
|
||
| 331 | f.properties.value = stringified; |
||
| 332 | } |
||
| 333 | if(first) {
|
||
| 334 | documentDirty = false; |
||
| 335 | first = false; |
||
| 336 | } |
||
| 337 | ; |
||
| 338 | } |
||
| 339 | |||
| 340 | function encode(s) {
|
||
| 341 | s = s + ''; |
||
| 342 | s = s.replace(/\=/g, '%3D'); // = |
||
| 343 | s = s.replace(/\&/g, '%26'); // & |
||
| 344 | return s; |
||
| 345 | } |
||
| 346 | |||
| 347 | function decode(s) {
|
||
| 348 | s = s + ''; |
||
| 349 | s = s.replace(/\%3D/g, '='); // = |
||
| 350 | s = s.replace(/\%26/g, '&'); // & |
||
| 351 | return s; |
||
| 352 | } |
||
| 353 | |||
| 354 | /** |
||
| 355 | * @return {boolean}
|
||
| 356 | */ |
||
| 357 | function IsJsonString(str) {
|
||
| 358 | try {
|
||
| 359 | JSON.parse(str); |
||
| 360 | } catch(e) {
|
||
| 361 | return false; |
||
| 362 | } |
||
| 363 | return true; |
||
| 364 | } |
||
| 365 | |||
| 366 | function setDefaultParam(key, show) {
|
||
| 367 | if(typeof currentParams[key][0]['default'] != 'undefined') {
|
||
| 368 | currentParams[key][0]['value'] = currentParams[key][0]['default']; |
||
| 369 | if(show) {
|
||
| 370 | implodeParameters(); |
||
| 371 | showParameters(); |
||
| 372 | } |
||
| 373 | } |
||
| 374 | } |
||
| 375 | |||
| 376 | function setDefaults() {
|
||
| 377 | var keys = Object.keys(currentParams); |
||
| 378 | var last = keys[keys.length - 1], |
||
| 379 | show; |
||
| 380 | Object.keys(currentParams).forEach(function(key) {
|
||
| 381 | show = key === last ? 1 : 0; |
||
| 382 | setDefaultParam(key, show); |
||
| 383 | }); |
||
| 384 | } |
||
| 385 | |||
| 386 | function contains(a, obj) {
|
||
| 387 | var i = a.length; |
||
| 388 | while(i--) {
|
||
| 389 | if(a[i] === obj) {
|
||
| 390 | return true; |
||
| 391 | } |
||
| 392 | } |
||
| 393 | return false; |
||
| 394 | } |
||
| 395 | |||
| 396 | // Resource browser |
||
| 397 | function OpenServerBrowser(url, width, height) {
|
||
| 398 | var iLeft = (screen.width - width) / 2; |
||
| 399 | var iTop = (screen.height - height) / 2; |
||
| 400 | var sOptions = "toolbar=no,status=no,resizable=yes,dependent=yes"; |
||
| 401 | sOptions += ",width=" + width; |
||
| 402 | sOptions += ",height=" + height; |
||
| 403 | sOptions += ",left=" + iLeft; |
||
| 404 | sOptions += ",top=" + iTop; |
||
| 405 | var oWindow = window.open(url, "FCKBrowseWindow", sOptions); |
||
| 406 | } |
||
| 407 | |||
| 408 | function BrowseServer() {
|
||
| 409 | var w = screen.width * 0.7; |
||
| 410 | var h = screen.height * 0.7; |
||
| 411 | OpenServerBrowser("<?= MODX_MANAGER_URL;?>media/browser/<?= $which_browser;?>/browser.php?Type=images", w, h);
|
||
|
0 ignored issues
–
show
|
|||
| 412 | } |
||
| 413 | |||
| 414 | function SetUrl(url, width, height, alt) {
|
||
| 415 | document.mutate.icon.value = url; |
||
| 416 | } |
||
| 417 | |||
| 418 | document.addEventListener('DOMContentLoaded', function() {
|
||
| 419 | var h1help = document.querySelector('h1 > .help');
|
||
| 420 | h1help.onclick = function() {
|
||
| 421 | document.querySelector('.element-edit-message').classList.toggle('show')
|
||
| 422 | } |
||
| 423 | }); |
||
| 424 | |||
| 425 | </script> |
||
| 426 | |||
| 427 | <form name="mutate" id="mutate" class="module" method="post" action="index.php?a=109"> |
||
| 428 | <?php |
||
| 429 | // invoke OnModFormPrerender event |
||
| 430 | $evtOut = $modx->invokeEvent('OnModFormPrerender', array('id' => $id));
|
||
| 431 | if(is_array($evtOut)) {
|
||
| 432 | echo implode('', $evtOut);
|
||
| 433 | } |
||
| 434 | |||
| 435 | // Prepare internal params & info-tab via parseDocBlock |
||
| 436 | $modulecode = isset($content['modulecode']) ? $modx->getDatabase()->escape($content['modulecode']) : ''; |
||
| 437 | $docBlock = $modx->parseDocBlockFromString($modulecode); |
||
| 438 | $docBlockList = $modx->convertDocBlockIntoList($docBlock); |
||
| 439 | $internal = array(); |
||
| 440 | ?> |
||
| 441 | <input type="hidden" name="id" value="<?= $content['id'] ?>"> |
||
| 442 | <input type="hidden" name="mode" value="<?= $modx->getManagerApi()->action ?>"> |
||
| 443 | |||
| 444 | <h1> |
||
| 445 | <i class="<?= ($content['icon'] != '' ? $content['icon'] : $_style['icons_module']) ?>"></i><?= ($content['name'] ? $content['name'] . '<small>(' . $content['id'] . ')</small>' : $_lang['new_module']) ?><i class="fa fa-question-circle help"></i>
|
||
| 446 | </h1> |
||
| 447 | |||
| 448 | <?= ManagerTheme::getStyle('actionbuttons.dynamic.element') ?>
|
||
| 449 | |||
| 450 | <div class="container element-edit-message"> |
||
| 451 | <div class="alert alert-info"><?= $_lang['module_msg'] ?></div> |
||
| 452 | </div> |
||
| 453 | |||
| 454 | <div class="tab-pane" id="modulePane"> |
||
| 455 | <script type="text/javascript"> |
||
| 456 | tp = new WebFXTabPane(document.getElementById("modulePane"), <?= ($modx->config['remember_last_tab'] == 1 ? 'true' : 'false') ?> );
|
||
| 457 | </script> |
||
| 458 | |||
| 459 | <!-- General --> |
||
| 460 | <div class="tab-page" id="tabModule"> |
||
| 461 | <h2 class="tab"><?= $_lang['settings_general'] ?></h2> |
||
| 462 | <script type="text/javascript">tp.addTabPage(document.getElementById("tabModule"));</script>
|
||
| 463 | <div class="container container-body"> |
||
| 464 | <div class="form-group"> |
||
| 465 | <div class="row form-row"> |
||
| 466 | <label class="col-md-3 col-lg-2"><?= $_lang['module_name'] ?></label> |
||
| 467 | <div class="col-md-9 col-lg-10"> |
||
| 468 | <div class="form-control-name clearfix"> |
||
| 469 | <input name="name" type="text" maxlength="100" value="<?= $modx->getPhpCompat()->htmlspecialchars($content['name']) ?>" class="form-control form-control-lg" onchange="documentDirty=true;" /> |
||
| 470 | <?php if($modx->hasPermission('save_role')): ?>
|
||
| 471 | <label class="custom-control" title="<?= $_lang['lock_module'] . "\n" . $_lang['lock_module_msg'] ?>" tooltip> |
||
| 472 | <input name="locked" type="checkbox"<?= ($content['locked'] == 1 ? ' checked="checked"' : '') ?> /> |
||
| 473 | <i class="fa fa-lock"></i> |
||
| 474 | </label> |
||
| 475 | <?php endif; ?> |
||
| 476 | </div> |
||
| 477 | <script>if(!document.getElementsByName("name")[0].value) document.getElementsByName("name")[0].focus();</script>
|
||
| 478 | <small class="form-text text-danger hide" id="savingMessage"></small> |
||
| 479 | </div> |
||
| 480 | </div> |
||
| 481 | <div class="row form-row"> |
||
| 482 | <label class="col-md-3 col-lg-2"><?= $_lang['module_desc'] ?></label> |
||
| 483 | <div class="col-md-9 col-lg-10"> |
||
| 484 | <input name="description" type="text" maxlength="255" value="<?= $content['description'] ?>" class="form-control" onchange="documentDirty=true;" /> |
||
| 485 | </div> |
||
| 486 | </div> |
||
| 487 | <div class="row form-row"> |
||
| 488 | <label class="col-md-3 col-lg-2"><?= $_lang['existing_category'] ?></label> |
||
| 489 | <div class="col-md-9 col-lg-10"> |
||
| 490 | <select name="categoryid" class="form-control" onchange="documentDirty=true;"> |
||
| 491 | <option> </option> |
||
| 492 | <?php |
||
| 493 | include_once(MODX_MANAGER_PATH . 'includes/categories.inc.php'); |
||
| 494 | foreach(getCategories() as $n => $v) {
|
||
| 495 | echo "\t\t\t" . '<option value="' . $v['id'] . '"' . ($content['category'] == $v['id'] ? ' selected="selected"' : '') . '>' . $modx->getPhpCompat()->htmlspecialchars($v['category']) . "</option>\n"; |
||
| 496 | } |
||
| 497 | ?> |
||
| 498 | </select> |
||
| 499 | </div> |
||
| 500 | </div> |
||
| 501 | <div class="row form-row"> |
||
| 502 | <label class="col-md-3 col-lg-2"><?= $_lang['new_category'] ?></label> |
||
| 503 | <div class="col-md-9 col-lg-10"> |
||
| 504 | <input name="newcategory" type="text" maxlength="45" value="" class="form-control" onchange="documentDirty=true;" /> |
||
| 505 | </div> |
||
| 506 | </div> |
||
| 507 | <div class="row form-row"> |
||
| 508 | <label class="col-md-3 col-lg-2"><?= $_lang['icon'] ?> |
||
| 509 | <small class="text-muted"><?= $_lang["icon_description"] ?></small> |
||
| 510 | </label> |
||
| 511 | <div class="col-md-9 col-lg-10"> |
||
| 512 | <div class="input-group"> |
||
| 513 | <input type="text" maxlength="255" name="icon" value="<?= $content['icon'] ?>" class="form-control" onchange="documentDirty=true;" /> |
||
| 514 | </div> |
||
| 515 | </div> |
||
| 516 | </div> |
||
| 517 | <div class="row form-row"> |
||
| 518 | <label class="col-md-3 col-lg-2" for="enable_resource"><input name="enable_resource" id="enable_resource" title="<?= $_lang['enable_resource'] ?>" type="checkbox"<?= ($content['enable_resource'] == 1 ? ' checked="checked"' : '') ?> onclick="documentDirty=true;" /> <span title="<?= $_lang['enable_resource'] ?>"><?= $_lang["element"] ?></span></label> |
||
| 519 | <div class="col-md-9 col-lg-10"> |
||
| 520 | <input name="resourcefile" type="text" maxlength="255" value="<?= $content['resourcefile'] ?>" class="form-control" onchange="documentDirty=true;" /> |
||
| 521 | </div> |
||
| 522 | </div> |
||
| 523 | </div> |
||
| 524 | <div class="form-group"> |
||
| 525 | <div class="form-row"> |
||
| 526 | <label for="disabled"><input name="disabled" id="disabled" type="checkbox" value="on"<?= ($content['disabled'] == 1 ? ' checked="checked"' : '') ?> /> |
||
| 527 | <?= ($content['disabled'] == 1 ? '<span class="text-danger">' . $_lang['module_disabled'] . '</span>' : $_lang['module_disabled']) ?></label> |
||
| 528 | </div> |
||
| 529 | <div class="form-row"> |
||
| 530 | <label for="parse_docblock"> |
||
| 531 | <input name="parse_docblock" id="parse_docblock" type="checkbox" value="1"<?= ($modx->getManagerApi()->action == 107 ? ' checked="checked"' : '') ?> /> <?= $_lang['parse_docblock'] ?></label> |
||
| 532 | <small class="form-text text-muted"><?= $_lang['parse_docblock_msg'] ?></small> |
||
| 533 | </div> |
||
| 534 | </div> |
||
| 535 | </div> |
||
| 536 | |||
| 537 | <!-- PHP text editor start --> |
||
| 538 | <div class="navbar navbar-editor"> |
||
| 539 | <span><?= $_lang['module_code'] ?></span> |
||
| 540 | </div> |
||
| 541 | <div class="section-editor clearfix"> |
||
| 542 | <textarea dir="ltr" class="phptextarea" name="post" rows="20" wrap="soft" onchange="documentDirty=true;"><?= $modx->getPhpCompat()->htmlspecialchars($content['modulecode']) ?></textarea> |
||
| 543 | </div> |
||
| 544 | <!-- PHP text editor end --> |
||
| 545 | </div> |
||
| 546 | |||
| 547 | <!-- Configuration --> |
||
| 548 | <div class="tab-page" id="tabConfig"> |
||
| 549 | <h2 class="tab"><?= $_lang["settings_config"] ?></h2> |
||
| 550 | <script type="text/javascript">tp.addTabPage(document.getElementById("tabConfig"));</script>
|
||
| 551 | <div class="container container-body"> |
||
| 552 | <div class="form-group"> |
||
| 553 | <a href="javascript:;" class="btn btn-primary" onclick="setDefaults(this);return false;"><?= $_lang['set_default_all'] ?></a> |
||
| 554 | </div> |
||
| 555 | <div id="displayparamrow"> |
||
| 556 | <div id="displayparams"></div> |
||
| 557 | </div> |
||
| 558 | </div> |
||
| 559 | </div> |
||
| 560 | |||
| 561 | <!-- Properties --> |
||
| 562 | <div class="tab-page" id="tabParams"> |
||
| 563 | <h2 class="tab"><?= $_lang['settings_properties'] ?></h2> |
||
| 564 | <script type="text/javascript">tp.addTabPage(document.getElementById("tabParams"));</script>
|
||
| 565 | <div class="container container-body"> |
||
| 566 | <div class="form-group"> |
||
| 567 | <div class="row form-row"> |
||
| 568 | <label class="col-md-3 col-lg-2"><?= $_lang['guid'] ?></label> |
||
| 569 | <div class="col-md-9 col-lg-10"> |
||
| 570 | <input name="guid" type="text" maxlength="32" value="<?= ($modx->getManagerApi()->action == 107 ? createGUID() : $content['guid']) ?>" class="form-control" onchange="documentDirty=true;" /> |
||
| 571 | <small class="form-text text-muted"><?= $_lang['import_params_msg'] ?></small> |
||
| 572 | </div> |
||
| 573 | </div> |
||
| 574 | <div class="row form-row"> |
||
| 575 | <label class="col-md-3 col-lg-2" for="enable_sharedparams"> |
||
| 576 | <input name="enable_sharedparams" id="enable_sharedparams" type="checkbox"<?= ($content['enable_sharedparams'] == 1 ? ' checked="checked"' : '') ?> onclick="documentDirty=true;" /> <?= $_lang['enable_sharedparams'] ?></label> |
||
| 577 | <div class="col-md-9 col-lg-10"> |
||
| 578 | <small class="form-text text-muted"><?= $_lang['enable_sharedparams_msg'] ?></small> |
||
| 579 | </div> |
||
| 580 | </div> |
||
| 581 | </div> |
||
| 582 | <div class="form-group"> |
||
| 583 | <a href="javascript:;" class="btn btn-primary" onclick="tp.pages[1].select();showParameters(this);return false;"><?= $_lang['update_params'] ?></a> |
||
| 584 | </div> |
||
| 585 | </div> |
||
| 586 | <!-- HTML text editor start --> |
||
| 587 | <div class="section-editor clearfix"> |
||
| 588 | <textarea dir="ltr" name="properties" class="phptextarea" rows="20" wrap="soft" onChange="showParameters(this);documentDirty=true;"><?= $content['properties'] ?></textarea> |
||
| 589 | </div> |
||
| 590 | <!-- HTML text editor end --> |
||
| 591 | </div> |
||
| 592 | <?php if($modx->getManagerApi()->action == '108'): ?> |
||
| 593 | <!-- Dependencies --> |
||
| 594 | <div class="tab-page" id="tabDepend"> |
||
| 595 | <h2 class="tab"><?= $_lang['settings_dependencies'] ?></h2> |
||
| 596 | <script type="text/javascript">tp.addTabPage(document.getElementById("tabDepend"));</script>
|
||
| 597 | <div class="container container-body"> |
||
| 598 | <p><?= $_lang['module_viewdepend_msg'] ?></p> |
||
| 599 | <div class="form-group clearfix"> |
||
| 600 | <a class="btn btn-primary" href="javascript:;" onclick="loadDependencies();return false;"> |
||
| 601 | <i class="<?= $_style["actions_save"] ?>"></i> <?= $_lang['manage_depends'] ?></a> |
||
| 602 | </div> |
||
| 603 | <?php |
||
| 604 | $ds = $modx->getDatabase()->select("smd.id, COALESCE(ss.name,st.templatename,sv.name,sc.name,sp.name,sd.pagetitle) AS name,
|
||
| 605 | CASE smd.type |
||
| 606 | WHEN 10 THEN 'Chunk' |
||
| 607 | WHEN 20 THEN 'Document' |
||
| 608 | WHEN 30 THEN 'Plugin' |
||
| 609 | WHEN 40 THEN 'Snippet' |
||
| 610 | WHEN 50 THEN 'Template' |
||
| 611 | WHEN 60 THEN 'TV' |
||
| 612 | END AS type", "{$tbl_site_module_depobj} AS smd
|
||
| 613 | LEFT JOIN {$tbl_site_htmlsnippets} AS sc ON sc.id = smd.resource AND smd.type = 10
|
||
| 614 | LEFT JOIN {$tbl_site_content} AS sd ON sd.id = smd.resource AND smd.type = 20
|
||
| 615 | LEFT JOIN {$tbl_site_plugins} AS sp ON sp.id = smd.resource AND smd.type = 30
|
||
| 616 | LEFT JOIN {$tbl_site_snippets} AS ss ON ss.id = smd.resource AND smd.type = 40
|
||
| 617 | LEFT JOIN {$tbl_site_templates} AS st ON st.id = smd.resource AND smd.type = 50
|
||
| 618 | LEFT JOIN {$tbl_site_tmplvars} AS sv ON sv.id = smd.resource AND smd.type = 60", "smd.module='{$id}'", 'smd.type,name');
|
||
| 619 | |||
| 620 | $grd = new \EvolutionCMS\Support\DataGrid('', $ds, 0); // set page size to 0 t show all items
|
||
| 621 | $grd->noRecordMsg = $_lang['no_records_found']; |
||
| 622 | $grd->cssClass = 'grid'; |
||
| 623 | $grd->columnHeaderClass = 'gridHeader'; |
||
| 624 | $grd->itemClass = 'gridItem'; |
||
| 625 | $grd->altItemClass = 'gridAltItem'; |
||
| 626 | $grd->columns = $_lang['element_name'] . " ," . $_lang['type']; |
||
| 627 | $grd->fields = "name,type"; |
||
| 628 | echo $grd->render(); |
||
| 629 | ?> |
||
| 630 | </div> |
||
| 631 | </div> |
||
| 632 | <?php endif; ?> |
||
| 633 | |||
| 634 | <!-- access permission --> |
||
| 635 | <div class="tab-page" id="tabPermissions"> |
||
| 636 | <h2 class="tab"><?= $_lang['access_permissions'] ?></h2> |
||
| 637 | <script type="text/javascript">tp.addTabPage(document.getElementById("tabPermissions"));</script>
|
||
| 638 | <div class="container container-body"> |
||
| 639 | <?php if($modx->getConfig('use_udperms')) : ?>
|
||
| 640 | <?php |
||
| 641 | // fetch user access permissions for the module |
||
| 642 | $rs = $modx->getDatabase()->select('usergroup', $tbl_site_module_access, "module='{$id}'");
|
||
| 643 | $groupsarray = $modx->getDatabase()->getColumn('usergroup', $rs);
|
||
| 644 | |||
| 645 | if($modx->hasPermission('access_permissions')) {
|
||
| 646 | ?> |
||
| 647 | <!-- User Group Access Permissions --> |
||
| 648 | <script type="text/javascript"> |
||
| 649 | function makePublic(b) {
|
||
| 650 | var notPublic = false; |
||
| 651 | var f = document.forms['mutate']; |
||
| 652 | var chkpub = f['chkallgroups']; |
||
| 653 | var chks = f['usrgroups[]']; |
||
| 654 | if(!chks && chkpub) {
|
||
| 655 | chkpub.checked = true; |
||
| 656 | return false; |
||
| 657 | } else if(!b && chkpub) {
|
||
| 658 | if(!chks.length) notPublic = chks.checked; |
||
| 659 | else for(i = 0; i < chks.length; i++) if(chks[i].checked) notPublic = true; |
||
| 660 | chkpub.checked = !notPublic; |
||
| 661 | } else {
|
||
| 662 | if(!chks.length) chks.checked = (b) ? false : chks.checked; |
||
| 663 | else for(i = 0; i < chks.length; i++) if(b) chks[i].checked = false; |
||
| 664 | chkpub.checked = true; |
||
| 665 | } |
||
| 666 | } |
||
| 667 | </script> |
||
| 668 | <p><?= $_lang['module_group_access_msg'] ?></p> |
||
| 669 | <?php |
||
| 670 | } |
||
| 671 | $chk = ''; |
||
| 672 | $rs = $modx->getDatabase()->select('name, id', $tbl_membergroup_names, '', 'name');
|
||
| 673 | while($row = $modx->getDatabase()->getRow($rs)) {
|
||
| 674 | $groupsarray = is_numeric($id) && $id > 0 ? $groupsarray : array(); |
||
| 675 | $checked = in_array($row['id'], $groupsarray); |
||
| 676 | if($modx->hasPermission('access_permissions')) {
|
||
| 677 | if($checked) {
|
||
| 678 | $notPublic = true; |
||
| 679 | } |
||
| 680 | $chks .= '<label><input type="checkbox" name="usrgroups[]" value="' . $row['id'] . '"' . ($checked ? ' checked="checked"' : '') . ' onclick="makePublic(false)" /> ' . $row['name'] . "</label><br />\n"; |
||
| 681 | } else {
|
||
| 682 | if($checked) {
|
||
| 683 | $chks = '<input type="hidden" name="usrgroups[]" value="' . $row['id'] . '" />' . "\n" . $chks; |
||
| 684 | } |
||
| 685 | } |
||
| 686 | } |
||
| 687 | View Code Duplication | if($modx->hasPermission('access_permissions')) {
|
|
| 688 | $chks = '<label><input type="checkbox" name="chkallgroups"' . (!$notPublic ? ' checked="checked"' : '') . ' onclick="makePublic(true)" /><span class="warning"> ' . $_lang['all_usr_groups'] . '</span></label><br />' . "\n" . $chks; |
||
| 689 | } |
||
| 690 | echo $chks; |
||
| 691 | ?> |
||
| 692 | <?php endif; ?> |
||
| 693 | </div> |
||
| 694 | </div> |
||
| 695 | |||
| 696 | <!-- docBlock Info --> |
||
| 697 | <div class="tab-page" id="tabDocBlock"> |
||
| 698 | <h2 class="tab"><?= $_lang['information'] ?></h2> |
||
| 699 | <script type="text/javascript">tp.addTabPage(document.getElementById("tabDocBlock"));</script>
|
||
| 700 | <div class="container container-body"> |
||
| 701 | <?= $docBlockList ?> |
||
| 702 | </div> |
||
| 703 | </div> |
||
| 704 | |||
| 705 | <input type="submit" name="save" style="display:none;"> |
||
| 706 | <?php |
||
| 707 | // invoke OnModFormRender event |
||
| 708 | $evtOut = $modx->invokeEvent('OnModFormRender', array('id' => $id));
|
||
| 709 | if(is_array($evtOut)) {
|
||
| 710 | echo implode('', $evtOut);
|
||
| 711 | } |
||
| 712 | ?> |
||
| 713 | </form> |
||
| 714 | <script type="text/javascript">setTimeout('showParameters();', 10);</script>
|
||
| 715 |
Let’s take a look at an example: