[ Index ] |
|
Code source de Serendipity 1.2 |
1 <?php # $Id: plugins.inc.php 1823 2007-08-07 13:59:43Z garvinhicking $ 2 # Copyright (c) 2003-2005, Jannis Hermanns (on behalf the Serendipity Developer Team) 3 # All rights reserved. See LICENSE file for licensing details 4 5 if (IN_serendipity !== true) { 6 die ('Don\'t hack!'); 7 } 8 9 if (!serendipity_checkPermission('adminPlugins')) { 10 return; 11 } 12 13 include_once S9Y_INCLUDE_PATH . 'include/plugin_api.inc.php'; 14 include_once S9Y_INCLUDE_PATH . 'include/plugin_internal.inc.php'; 15 include_once S9Y_INCLUDE_PATH . 'include/functions_entries_admin.inc.php'; 16 include_once S9Y_INCLUDE_PATH . 'include/functions_plugins_admin.inc.php'; 17 18 if (isset($_GET['serendipity']['plugin_to_move']) && isset($_GET['submit']) && serendipity_checkFormToken()) { 19 if (isset($_GET['serendipity']['event_plugin'])) { 20 $plugins = serendipity_plugin_api::enum_plugins('event', false); 21 } else { 22 $plugins = serendipity_plugin_api::enum_plugins('event', true); 23 } 24 25 /* Renumber the sort order to be certain that one actually exists 26 Also look for the one we're going to move */ 27 $idx_to_move = -1; 28 for($idx = 0; $idx < count($plugins); $idx++) { 29 $plugins[$idx]['sort_order'] = $idx; 30 31 if ($plugins[$idx]['name'] == $_GET['serendipity']['plugin_to_move']) { 32 $idx_to_move = $idx; 33 } 34 } 35 36 /* If idx_to_move is still -1 then we never found it (shouldn't happen under normal conditions) 37 Also make sure the swaping idx is around */ 38 if ($idx_to_move >= 0 && (($_GET['submit'] == 'move down' && $idx_to_move < (count($plugins)-1)) || ($_GET['submit'] == 'move up' && $idx_to_move > 0))) { 39 40 /* Swap the one were moving with the one that's in the spot we're moving to */ 41 $tmp = $plugins[$idx_to_move]['sort_order']; 42 43 $plugins[$idx_to_move]['sort_order'] = (int)$plugins[$idx_to_move + ($_GET['submit'] == 'move down' ? 1 : -1)]['sort_order']; 44 $plugins[$idx_to_move + ($_GET['submit'] == 'move down' ? 1 : -1)]['sort_order'] = (int)$tmp; 45 46 /* Update table */ 47 foreach($plugins as $plugin) { 48 $key = serendipity_db_escape_string($plugin['name']); 49 serendipity_db_query("UPDATE {$serendipity['dbPrefix']}plugins SET sort_order = {$plugin['sort_order']} WHERE name='$key'"); 50 } 51 } 52 53 /* TODO: Moving The first Right oriented plugin up, 54 or the last left oriented plugin down 55 should not be displayed to the user as an option. 56 It's a behavior which really has no meaning. */ 57 } 58 59 if (isset($_GET['serendipity']['plugin_to_conf'])) { 60 /* configure a specific instance */ 61 $plugin =& serendipity_plugin_api::load_plugin($_GET['serendipity']['plugin_to_conf']); 62 63 if (!($plugin->protected === FALSE || $plugin->serendipity_owner == '0' || $plugin->serendipity_owner == $serendipity['authorid'] || serendipity_checkPermission('adminPluginsMaintainOthers'))) { 64 return; 65 } 66 67 $bag = new serendipity_property_bag; 68 $plugin->introspect($bag); 69 70 if (method_exists($plugin, 'performConfig')) { 71 $plugin->performConfig($bag); 72 } 73 74 $name = htmlspecialchars($bag->get('name')); 75 $desc = htmlspecialchars($bag->get('description')); 76 77 $config_names = $bag->get('configuration'); 78 79 if (isset($_POST['SAVECONF']) && serendipity_checkFormToken()) { 80 /* enum properties and set their values */ 81 82 $save_errors = array(); 83 foreach ($config_names as $config_item) { 84 $cbag = new serendipity_property_bag; 85 if ($plugin->introspect_config_item($config_item, $cbag)) { 86 $value = $_POST['serendipity']['plugin'][$config_item]; 87 88 $validate = $plugin->validate($config_item, $cbag, $value); 89 90 if ($validate === true) { 91 // echo $config_item . " validated: $validate<br />\n"; 92 $plugin->set_config($config_item, $value); 93 } else { 94 $save_errors[] = $validate; 95 } 96 } 97 } 98 99 $plugin->cleanup(); 100 } 101 ?> 102 103 <?php if ( isset($save_errors) && is_array($save_errors) && count($save_errors) > 0 ) { ?> 104 <div class="serendipityAdminMsgError"> 105 <img style="width: 22px; height: 22px; border: 0px; padding-right: 4px; vertical-align: middle" src="<?php echo serendipity_getTemplateFile('admin/img/admin_msg_error.png'); ?>" alt="" /> 106 <?php 107 echo ERROR . ":<br />\n"; 108 echo "<ul>\n"; 109 foreach($save_errors AS $save_error) { 110 echo '<li>' . $save_error . "</li>\n"; 111 } 112 echo "</ul>\n"; 113 ?> 114 </div> 115 <?php } elseif ( isset($_POST['SAVECONF'])) { ?> 116 <div class="serendipityAdminMsgSuccess"><img style="width: 22px; height: 22px; border: 0px; padding-right: 4px; vertical-align: middle" src="<?php echo serendipity_getTemplateFile('admin/img/admin_msg_success.png'); ?>" alt="" /><?php echo DONE .': '. sprintf(SETTINGS_SAVED_AT, serendipity_strftime('%H:%M:%S')); ?></div> 117 <?php } ?> 118 119 <form method="post" name="serendipityPluginConfigure"> 120 <?php echo serendipity_setFormToken(); ?> 121 <table cellpadding="5" style="border: 1px dashed" width="90%" align="center"> 122 <tr> 123 <th width="100"><?php echo NAME; ?></th> 124 <td><?php echo $name; ?></td> 125 </tr> 126 127 <tr> 128 <th><?php echo DESCRIPTION; ?></th> 129 <td><?php echo $desc; ?></td> 130 </tr> 131 </table> 132 <br /> 133 <?php serendipity_plugin_config($plugin, $bag, $name, $desc, $config_names); ?> 134 </form> 135 <?php 136 137 } elseif ( $serendipity['GET']['adminAction'] == 'addnew' ) { 138 ?> 139 <?php if ( $serendipity['GET']['type'] == 'event' ) { ?> 140 <h2><?php echo EVENT_PLUGINS ?></h2> 141 <?php } else { ?> 142 <h2><?php echo SIDEBAR_PLUGINS ?></h2> 143 <?php } ?> 144 <br /> 145 <?php 146 $foreignPlugins = $pluginstack = $errorstack = array(); 147 serendipity_plugin_api::hook_event('backend_plugins_fetchlist', $foreignPlugins); 148 $pluginstack = array_merge((array)$foreignPlugins['pluginstack'], $pluginstack); 149 $errorstack = array_merge((array)$foreignPlugins['errorstack'], $errorstack); 150 151 $plugins = serendipity_plugin_api::get_installed_plugins(); 152 $classes = serendipity_plugin_api::enum_plugin_classes(($serendipity['GET']['type'] == 'event')); 153 usort($classes, 'serendipity_pluginListSort'); 154 155 $counter = 0; 156 foreach ($classes as $class_data) { 157 $pluginFile = serendipity_plugin_api::probePlugin($class_data['name'], $class_data['classname'], $class_data['pluginPath']); 158 $plugin =& serendipity_plugin_api::getPluginInfo($pluginFile, $class_data, $serendipity['GET']['type']); 159 160 if (is_object($plugin)) { 161 // Object is returned when a plugin could not be cached. 162 $bag = new serendipity_property_bag; 163 $plugin->introspect($bag); 164 165 // If a foreign plugin is upgradable, keep the new version number. 166 if (isset($foreignPlugins['pluginstack'][$class_data['name']]) && $foreignPlugins['pluginstack'][$class_data['name']]['upgradable']) { 167 $class_data['upgrade_version'] = $foreignPlugins['pluginstack'][$class_data['name']]['upgrade_version']; 168 } 169 170 $props = serendipity_plugin_api::setPluginInfo($plugin, $pluginFile, $bag, $class_data, 'local', $foreignPlugins); 171 172 $counter++; 173 } elseif (is_array($plugin)) { 174 // Array is returned if a plugin could be fetched from info cache 175 $props = $plugin; 176 } else { 177 $props = false; 178 } 179 180 if (is_array($props)) { 181 if (version_compare($props['version'], $props['upgrade_version'], '<')) { 182 $props['upgradable'] = true; 183 $props['customURI'] .= $foreignPlugins['baseURI'] . $foreignPlugins['upgradeURI']; 184 } 185 186 $props['installable'] = !($props['stackable'] === false && in_array($class_data['true_name'], $plugins)); 187 $props['requirements'] = unserialize($props['requirements']); 188 189 $pluginstack[$class_data['true_name']] = $props; 190 } else { 191 // False is returned if a plugin could not be instantiated 192 $errorstack[] = $class_data['true_name']; 193 } 194 } 195 196 usort($pluginstack, 'serendipity_pluginListSort'); 197 $pluggroups = array(); 198 $pluggroups[''] = array(); 199 foreach($pluginstack AS $plugname => $plugdata) { 200 if ($serendipity['GET']['only_group'] == 'ALL') { 201 $pluggroups['ALL'][] = $plugdata; 202 } elseif ($serendipity['GET']['only_group'] == 'UPGRADE' && $plugdata['upgradable']) { 203 $pluggroups['UPGRADE'][] = $plugdata; 204 } elseif (is_array($plugdata['groups'])) { 205 foreach($plugdata['groups'] AS $group) { 206 $pluggroups[$group][] = $plugdata; 207 } 208 } else { 209 $pluggroups[''][] = $plugdata; 210 } 211 } 212 ksort($pluggroups); 213 214 foreach($errorstack as $e_idx => $e_name) { 215 echo ERROR . ': ' . $e_name . '<br />'; 216 } 217 218 if ($serendipity['GET']['only_group'] == 'UPGRADE') { 219 serendipity_plugin_api::hook_event('backend_pluginlisting_header_upgrade', $pluggroups); 220 } 221 ?> 222 <table cellspacing="0" cellpadding="0" border="0" width="100%"> 223 <?php 224 $available_groups = array_keys($pluggroups); 225 foreach($pluggroups AS $pluggroup => $groupstack) { 226 if (empty($pluggroup)) { 227 ?> 228 <tr> 229 <td colspan="2" class="serendipity_pluginlist_header"> 230 <form action="serendipity_admin.php" method="get"> 231 <?php echo serendipity_setFormToken(); ?> 232 <input type="hidden" name="serendipity[adminModule]" value="plugins" /> 233 <input type="hidden" name="serendipity[adminAction]" value="addnew" /> 234 <input type="hidden" name="serendipity[type]" value="<?php echo htmlspecialchars($serendipity['GET']['type']); ?>" /> 235 <?php echo FILTERS; ?>: <select name="serendipity[only_group]"> 236 <?php foreach((array)$available_groups AS $available_group) { 237 ?> 238 <option value="<?php echo $available_group; ?>" <?php echo ($serendipity['GET']['only_group'] == $available_group ? 'selected="selected"' : ''); ?>><?php echo serendipity_groupname($available_group); ?> 239 <?php } ?> 240 <option value="ALL" <?php echo ($serendipity['GET']['only_group'] == 'ALL' ? 'selected="selected"' : ''); ?>><?php echo ALL_CATEGORIES; ?> 241 <option value="UPGRADE" <?php echo ($serendipity['GET']['only_group'] == 'UPGRADE' ? 'selected="selected"' : ''); ?>><?php echo WORD_NEW; ?> 242 </select> 243 <input class="serendipityPrettyButton input_button" type="submit" value="<?php echo GO; ?>" /> 244 </form> 245 </td> 246 </tr> 247 <?php 248 if (!empty($serendipity['GET']['only_group'])) { 249 continue; 250 } 251 } elseif (!empty($serendipity['GET']['only_group']) && $pluggroup != $serendipity['GET']['only_group']) { 252 continue; 253 } else { 254 ?> 255 <tr> 256 <td colspan="2" class="serendipity_pluginlist_section"><strong><?php echo serendipity_groupname($pluggroup); ?></strong></td> 257 </tr> 258 <?php 259 } 260 ?> 261 <tr> 262 <td><strong>Plugin</strong></td> 263 <td width="100" align="center"><strong>Action</strong></td> 264 </tr> 265 <?php 266 foreach ($groupstack as $plug) { 267 $jsLine = " onmouseout=\"document.getElementById('serendipity_plugin_". $plug['class_name'] ."').className='';\""; 268 $jsLine .= " onmouseover=\"document.getElementById('serendipity_plugin_". $plug['class_name'] ."').className='serendipity_PluginAdminHighlight';\""; 269 270 $pluginInfo = $notice = array(); 271 if (!empty($plug['author'])) { 272 $pluginInfo[] = AUTHOR . ': ' . $plug['author']; 273 } 274 275 if (!empty($plug['version'])) { 276 $pluginInfo[] = VERSION . ': ' . $plug['version']; 277 } 278 279 if (!empty($plug['upgrade_version']) && $plug['upgrade_version'] != $plug['version']) { 280 $pluginInfo[] = sprintf(UPGRADE_TO_VERSION, $plug['upgrade_version']); 281 } 282 283 if (!empty($plug['pluginlocation']) && $plug['pluginlocation'] != 'local') { 284 $pluginInfo[] = '(' . htmlspecialchars($plug['pluginlocation']) . ')'; 285 $installimage = serendipity_getTemplateFile('admin/img/install_now_' . strtolower($plug['pluginlocation']) . '.png'); 286 } else { 287 $installimage = serendipity_getTemplateFile('admin/img/install_now.png'); 288 } 289 290 if (!isset($plug['customURI'])) { 291 $plug['customURI'] = ''; 292 } 293 294 if ( !empty($plug['requirements']['serendipity']) && version_compare($plug['requirements']['serendipity'], serendipity_getCoreVersion($serendipity['version']), '>') ) { 295 $notice['requirements_failures'][] = 's9y ' . $plug['requirements']['serendipity']; 296 } 297 298 if ( !empty($plug['requirements']['php']) && version_compare($plug['requirements']['php'], phpversion(), '>') ) { 299 $notice['requirements_failures'][] = 'PHP ' . $plug['requirements']['php']; 300 } 301 302 /* Enable after Smarty 2.6.7 upgrade. 303 * TODO: How can we get current Smarty version here? $smarty is not created! 304 if ( !empty($plug['requirements']['smarty']) && version_compare($plug['requirements']['smarty'], '2.6.7', '>') ) { 305 $notice['requirements_failures'][] = 'Smarty: ' . $plug['requirements']['smarty']; 306 } 307 */ 308 309 if (count($notice['requirements_failures']) > 0) { 310 $plug['requirements_fail'] = true; 311 } 312 313 ?> 314 <tr id="serendipity_plugin_<?php echo $plug['class_name']; ?>"> 315 <td colspan="2" <?php echo $jsLine ?>> 316 <table width="100%" cellpadding="3" cellspacing="0" border="0"> 317 <tr> 318 <td><strong><?php echo $plug['name'] ?></strong></td> 319 <td width="100" align="center" valign="middle" rowspan="3"> 320 <?php if ( $plug['requirements_fail'] == true ) { ?> 321 <span style="color: #cccccc"><?php printf(UNMET_REQUIREMENTS, implode(', ', $notice['requirements_failures'])); ?></span> 322 <?php } elseif ( $plug['upgradable'] == true ) { ?> 323 <a href="?serendipity[adminModule]=plugins&serendipity[pluginPath]=<?php echo $plug['pluginPath']; ?>&serendipity[install_plugin]=<?php echo $plug['plugin_class'] . $plug['customURI'] ?>"><img src="<?php echo serendipity_getTemplateFile('admin/img/upgrade_now.png') ?>" title="<?php echo UPGRADE ?>" alt="<?php echo UPGRADE ?>" border="0" /></a> 324 <?php } elseif ($plug['installable'] == true) { ?> 325 <a href="?serendipity[adminModule]=plugins&serendipity[pluginPath]=<?php echo $plug['pluginPath']; ?>&serendipity[install_plugin]=<?php echo $plug['plugin_class'] . $plug['customURI'] ?>"><img src="<?php echo $installimage ?>" title="<?php echo INSTALL ?>" alt="<?php echo INSTALL ?>" border="0" /></a> 326 <?php } else { ?> 327 <span style="color: #cccccc"><?php echo ALREADY_INSTALLED ?></span> 328 <?php } ?> 329 </td> 330 </tr> 331 <tr> 332 <td style="padding-left: 10px"><?php echo $plug['description'] ?></td> 333 </tr> 334 <?php if (count($pluginInfo) > 0) { ?> 335 <tr> 336 <td style="padding-left: 10px; font-size: x-small"><?php echo implode('; ', $pluginInfo); ?></td> 337 </tr> 338 <?php } ?> 339 </table> 340 </td> 341 </tr> 342 <?php 343 } 344 } 345 ?> 346 <tr> 347 <td colspan="2" align="right"><?php printf(PLUGIN_AVAILABLE_COUNT, count($pluginstack)); ?></td> 348 </tr> 349 </table> 350 351 <?php 352 } else { 353 /* show general plugin list */ 354 355 /* get sidebar locations */ 356 serendipity_smarty_init(); 357 358 if (is_array($template_config)) { 359 $template_vars =& serendipity_loadThemeOptions($template_config); 360 } 361 362 $col_assoc = array( 363 'event_col' => 'event', 364 'eventh_col' => 'eventh' 365 ); 366 if (isset($template_vars['sidebars'])) { 367 $sidebars = explode(',', $template_vars['sidebars']); 368 } elseif (isset($serendipity['sidebars'])) { 369 $sidebars = $serendipity['sidebars']; 370 } else { 371 $sidebars = array('left', 'hide', 'right'); 372 } 373 374 foreach($sidebars AS $sidebar) { 375 $col_assoc[$sidebar . '_col'] = $sidebar; 376 } 377 378 /* preparse Javascript-generated input */ 379 if (isset($_POST['SAVE']) && !empty($_POST['serendipity']['pluginorder'])) { 380 $parts = explode(':', $_POST['serendipity']['pluginorder']); 381 382 foreach($parts AS $sidepart) { 383 preg_match('@^(.+)\((.*)\)$@imsU', $sidepart, $matches); 384 if (!isset($col_assoc[$matches[1]])) { 385 continue; 386 } 387 $pluginsidelist = explode(',', $matches[2]); 388 foreach($pluginsidelist AS $pluginname) { 389 $pluginname = trim(urldecode(str_replace(array('s9ycid', '-'), array('', '%'), $pluginname))); 390 391 if (empty($pluginname)) { 392 continue; 393 } 394 $serendipity['POST']['placement'][$pluginname] = $col_assoc[$matches[1]]; 395 $new_order[] = $pluginname; 396 397 } 398 } 399 400 if (is_array($new_order)) { 401 foreach($new_order AS $new_order_pos => $order_plugin) { 402 serendipity_db_query("UPDATE {$serendipity['dbPrefix']}plugins SET sort_order = ". (int)$new_order_pos . " WHERE name='" . serendipity_db_escape_string($order_plugin) . "'"); 403 } 404 } 405 } 406 407 if (isset($_POST['SAVE']) && isset($_POST['serendipity']['placement']) && serendipity_checkFormToken()) { 408 foreach ($_POST['serendipity']['placement'] as $plugin_name => $placement) { 409 serendipity_plugin_api::update_plugin_placement( 410 addslashes($plugin_name), 411 addslashes($placement) 412 ); 413 414 serendipity_plugin_api::update_plugin_owner( 415 addslashes($plugin_name), 416 addslashes($_POST['serendipity']['ownership'][$plugin_name]) 417 ); 418 } 419 } 420 421 if (isset($serendipity['GET']['install_plugin'])) { 422 $authorid = $serendipity['authorid']; 423 if (serendipity_checkPermission('adminPluginsMaintainOthers')) { 424 $authorid = '0'; 425 } 426 427 $fetchplugin_data = array('GET' => &$serendipity['GET'], 428 'install' => true); 429 serendipity_plugin_api::hook_event('backend_plugins_fetchplugin', $fetchplugin_data); 430 431 if ($fetchplugin_data['install']) { 432 $serendipity['debug']['pluginload'] = array(); 433 $inst = serendipity_plugin_api::create_plugin_instance($serendipity['GET']['install_plugin'], null, (serendipity_plugin_api::is_event_plugin($serendipity['GET']['install_plugin']) ? 'event': 'right'), $authorid, serendipity_db_escape_string($serendipity['GET']['pluginPath'])); 434 435 /* Load the new plugin */ 436 $plugin = &serendipity_plugin_api::load_plugin($inst); 437 if (!is_object($plugin)) { 438 echo "DEBUG: Plugin $inst not an object: " . print_r($plugin, true) . ".<br />Input: " . print_r($serendipity['GET'], true) . ".<br /><br />\n\nThis error can happen if a plugin was not properly downloaded (check your plugins directory if the requested plugin was downloaded) or the inclusion of a file failed (permissions?)<br />\n"; 439 echo "Backtrace:<br />\n" . implode("<br />\n", $serendipity['debug']['pluginload']) . "<br />"; 440 } 441 $bag = new serendipity_property_bag; 442 $plugin->introspect($bag); 443 444 if ($bag->is_set('configuration')) { 445 /* Only play with the plugin if there is something to play with */ 446 echo '<script type="text/javascript">location.href = \'' . $serendipity['baseurl'] . '?serendipity[adminModule]=plugins&serendipity[plugin_to_conf]=' . $inst . '\';</script>'; 447 die(); 448 } else { 449 /* If no config is available, redirect to plugin overview, because we do not want that a user can install the plugin a second time via accidental browser refresh */ 450 echo '<script type="text/javascript">location.href = \'' . $serendipity['baseurl'] . '?serendipity[adminModule]=plugins\';</script>'; 451 die(); 452 } 453 } 454 } 455 456 if (isset($_POST['REMOVE']) && serendipity_checkFormToken()) { 457 if (is_array($_POST['serendipity']['plugin_to_remove'])) { 458 foreach ($_POST['serendipity']['plugin_to_remove'] as $key) { 459 $plugin =& serendipity_plugin_api::load_plugin($key); 460 461 if ($plugin->serendipity_owner == '0' || $plugin->serendipity_owner == $serendipity['authorid'] || serendipity_checkPermission('adminPluginsMaintainOthers')) { 462 serendipity_plugin_api::remove_plugin_instance($key); 463 } 464 } 465 } 466 } 467 ?> 468 469 <?php if (isset($_POST['SAVE'])) { ?> 470 <div class="serendipityAdminMsgSuccess"><img style="width: 22px; height: 22px; border: 0px; padding-right: 4px; vertical-align: middle" src="<?php echo serendipity_getTemplateFile('admin/img/admin_msg_success.png'); ?>" alt="" /><?php echo DONE .': '. sprintf(SETTINGS_SAVED_AT, serendipity_strftime('%H:%M:%S')); ?></div> 471 <?php } ?> 472 473 <div><?php echo BELOW_IS_A_LIST_OF_INSTALLED_PLUGINS ?></div> 474 <?php 475 if (!isset($serendipity['eyecandy']) || serendipity_db_bool($serendipity['eyecandy'])) { 476 echo '<script src="' . serendipity_getTemplateFile('dragdrop.js') . '" type="text/javascript"></script>'; 477 echo '<div class="warning js_warning"><em>' . PREFERENCE_USE_JS_WARNING . '</em></div>'; 478 } 479 480 serendipity_plugin_api::hook_event('backend_pluginlisting_header', $serendipity['eyecandy']); 481 ?> 482 <br /> 483 484 <h3><?php echo SIDEBAR_PLUGINS ?></h3> 485 <a href="?serendipity[adminModule]=plugins&serendipity[adminAction]=addnew" class="serendipityIconLink"><img src="<?php echo serendipity_getTemplateFile('admin/img/install.png') ?>" style="border: 0px none ; vertical-align: middle; display: inline;" alt="" /><?php echo sprintf(CLICK_HERE_TO_INSTALL_PLUGIN, SIDEBAR_PLUGIN) ?></a> 486 <?php serendipity_plugin_api::hook_event('backend_plugins_sidebar_header', $serendipity); ?> 487 <?php show_plugins(false, $sidebars); ?> 488 489 <br /> 490 <br /> 491 492 <h3><?php echo EVENT_PLUGINS ?></h3> 493 <a href="?serendipity[adminModule]=plugins&serendipity[adminAction]=addnew&serendipity[type]=event" class="serendipityIconLink"><img src="<?php echo serendipity_getTemplateFile('admin/img/install.png') ?>" style="border: 0px none ; vertical-align: middle; display: inline;" alt="" /><?php echo sprintf(CLICK_HERE_TO_INSTALL_PLUGIN, EVENT_PLUGIN) ?></a> 494 <?php serendipity_plugin_api::hook_event('backend_plugins_event_header', $serendipity); ?> 495 <?php show_plugins(true); ?> 496 497 <?php if (count($serendipity['memSnaps']) > 0) { ?> 498 <h3>Memory Usage</h3> 499 <div> 500 <pre><?php print_r($serendipity['memSnaps']); ?></pre> 501 </div> 502 <?php } ?> 503 <?php 504 } 505 /* vim: set sts=4 ts=4 expandtab : */
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sat Nov 24 09:00:37 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |