<?php
session_start();
//------------------------------------------------------------------------------
// Includes
//------------------------------------------------------------------------------
include_once('../inc/config.php');
include_once('../inc/util.inc');
mysql_connect($db_server, $db_username, $db_password);
mysql_select_db($db_database);
//------------------------------------------------------------------------------
// Setup Theme
//------------------------------------------------------------------------------
$THEME = array(
'site_name' => getSiteName(),
'path' => '../',
'page' => 'modules',
'page_title' => _('Administration'),
'theme_path' => getTheme(),
'modules' => getAdminModules(),
);
//------------------------------------------------------------------------------
// Control Structure
//------------------------------------------------------------------------------
include $THEME['path'].$THEME['theme_path'].'adminheader.php';
if (!isLoggedInAdmin()) {
handleBadLogin();
return;
}
displaySubNavigation();
if (isset($_POST['submit-add'])) {
$message = addModule();
displayCurrentModules($message);
} elseif (isset($_POST['submit-delete']) && isset($_POST['chk-delete'])) {
$message = deleteModule($_POST['chk-delete']);
displayCurrentModules($message);
} elseif (isset($_POST['submit-update'])) {
$message = updateModuleOrder($_POST);
displayCurrentModules($message);
} elseif (isset($_GET['add'])) {
displayAddForm();
} else {
displayCurrentModules();
}
include $THEME['path'].$THEME['theme_path'].'footer.php';
return;
//------------------------------------------------------------------------------
// Functions
//------------------------------------------------------------------------------
function displaySubNavigation ()
{
echo '
<div id="sub-navigation" class="clearfix">
<ul id="sub-nav" class="clearfix">
<li class="action"><a href="?add=module">'._('Add Module').'</a></li>
</ul>
</div>';
}
/**
* addModule
*
* Adds a new module to the db and installs any tables needed for that module.
*
* @return array
*/
function addModule ()
{
// Get next order
$sql = "SELECT `order`
FROM `sam_module`
ORDER BY `order` DESC
LIMIT 1";
$result = mysql_query($sql);
if (!$result) {
$error = _('Could not get module information.');
logSqlError(__FILE__, __LINE__, mysql_error(), $sql);
return array('error', $error);
}
$r = mysql_fetch_array($result);
$nextOrder = $r['order'] + 1;
// Add new module to db
$sql = "INSERT INTO `sam_module` (`type`, `order`)
VALUES ('".escape_string($_POST['type'])."', '$nextOrder')";
if (!mysql_query($sql)) {
$error = _('Could not add new module.');
logSqlError(__FILE__, __LINE__, mysql_error(), $sql);
return array('error', $error);
}
// Setup necessary tables for modules
switch ($_POST['type']) {
case MOD_BLOG:
if (!tableExists('sam_blog')) {
include_once('../install/'.MOD_BLOG.'.php');
}
break;
case MOD_DOWNLOAD:
if (!tableExists('sam_download')) {
include_once('../install/'.MOD_DOWNLOAD.'.php');
}
break;
case MOD_IDEA:
if (!tableExists('sam_idea')) {
include_once('../install/'.MOD_IDEA.'.php');
}
break;
case MOD_PROGRESS:
case MOD_TRACKER:
if (!tableExists('sam_ticket')) {
include_once('../install/'.MOD_TRACKER.'.php');
}
break;
case MOD_TRANSLATION:
if (!tableExists('sam_translation')) {
include_once('../install/'.MOD_TRANSLATION.'.php');
}
break;
case MOD_WIKI:
if (!tableExists('sam_wiki')) {
include_once('../install/'.MOD_WIKI.'.php');
}
break;
}
return array('ok', _('New module added.'));
}
/**
* deleteModule
*
* Deletes a module from the module table. Leaves db tables for that module.
*
* @param array $checkedModules
*
* @return array
*/
function deleteModule ($checkedModules)
{
// Delete
foreach ($checkedModules as $id) {
if (!is_numeric($id)) {
return array('error', _('Invalid module id.'));
}
$sql = "DELETE FROM `sam_module`
WHERE `id` = ".escape_string($id)." LIMIT 1";
if (!mysql_query($sql)) {
logSqlError(__FILE__, __LINE__, mysql_error(), $sql);
return array('error', _('Could not delete module.'));;
}
}
// Update the new order
$sql = "SELECT `id`
FROM `sam_module`
ORDER BY `order`";
$result = mysql_query($sql);
if (!$result) {
logSqlError(__FILE__, __LINE__, mysql_error(), $sql);
return array('error', _('Could not get module information.'));
}
$i = 1;
if (mysql_num_rows($result) > 0) {
while ($r = mysql_fetch_array($result)) {
$sql = "UPDATE `sam_module`
SET `order` = '$i'
WHERE `id` = ".$r['id'];
if (!mysql_query($sql)) {
logSqlError(__FILE__, __LINE__, mysql_error(), $sql);
return array('error', _('Could not update module order.'));;
}
$i++;
}
}
$count = count($checkedModules);
$msg = sprintf(ngettext("%d module deleted.", "%d modules deleted.", $count), $count);
return array('ok', $msg);
}
/**
* updateModuleOrder
*
* Updates the order of the modules.
*
* @param array $data
*
* @return array
*/
function updateModuleOrder ($data)
{
if (!is_array($data)) {
return array('error', _('Invalid data.'));
}
// Validate proper order
$orders = array();
foreach ($data as $key => $value) {
$pos = strpos($key, 'order');
if ($pos !== false) {
$orders[] = $value;
}
}
$count1 = count($orders);
$orders = array_unique($orders);
$count2 = count($orders);
// Duplicates found
if ($count1 !== $count2) {
return array('error', _('Cannot have duplicate values for order.'));
}
// Update the order
foreach ($data as $key => $value) {
$pos = strpos($key, 'order');
if ($pos !== false) {
$id = substr($key, 5);
if (!is_numeric($id)) {
return array('error', _('Invalid id given.'));
}
$sql = "UPDATE `sam_module`
SET `order` = ".escape_string($value)."
WHERE `id` = ".escape_string($id);
if (!mysql_query($sql)) {
logSqlError(__FILE__, __LINE__, mysql_error(), $sql);
return array('error', _('Could not update module order.'));
}
}
}
return array('ok', _('Order updated.'));
}
/**
* displayAddForm
*
* Displays the form for adding modules.
*
* @return void
*/
function displayAddForm ()
{
$modules = getModules();
echo '
<div id="right">
<form method="post" action="modules.php">
<fieldset>
<legend>'._('Add New Module').'</legend>
<p>
<label for="type">'._('Type').'</label><br/>
<select class="sel" id="type" name="type">';
if (!in_array(MOD_BLOG, $modules)) {
echo '
<option value="blog">'._('Blog').'</option>';
}
if (!in_array(MOD_DOWNLOAD, $modules)) {
echo '
<option value="downloads">'._('Downloads').'</option>';
}
if (!in_array(MOD_IDEA, $modules)) {
echo '
<option value="ideas">'._('Ideas').'</option>';
}
if (!in_array(MOD_PROGRESS, $modules)) {
echo '
<option value="progress">'._('Progress').'</option>';
}
if (!in_array(MOD_CODE, $modules)) {
echo '
<option value="code">'._('Source Code').'</option>';
}
if (!in_array(MOD_TRACKER, $modules)) {
echo '
<option value="tracker">'._('Tracker').'</option>';
}
if (!in_array(MOD_TRANSLATION, $modules)) {
echo '
<option value="translations">'._('Translations').'</option>';
}
if (!in_array(MOD_WIKI, $modules)) {
echo '
<option value="wiki">'._('Wiki').'</option>';
}
echo '
</select>
</p>
<p>
<input class="sub1" type="submit" id="submit-add" name="submit-add" value="'._('Add').'"/>
or
<a href="modules.php">'._('Cancel').'</a>
</p>
</fieldset>
</form>
</div>';
}
/**
* displayCurrentModules
*
* Displays a table listing the current modules
*
* @param array $message
*
* @return void
*/
function displayCurrentModules ($message = '')
{
// Show messages if any
if (is_array($message)) {
echo '
<div class="'.$message[0].'-alert">
'.$message[1].'
</div>';
}
echo '
<h2>'._('Modules').'</h2>';
// Show Modules
$sql = "SELECT *
FROM `sam_module`
ORDER BY `order`";
$result = mysql_query($sql);
if (!$result) {
$error = _('Could not get module information.');
displaySqlError(__FILE__, __LINE__, mysql_query(), $sql);
return;
}
if (mysql_num_rows($result) <= 0) {
echo '
<p>'._('No modules found.').'</p>';
return;
}
$total = mysql_num_rows($result);
echo '
<form method="post" action="modules.php">
<table id="admin-table" class="data">
<thead>
<tr>
<th class="order">'._('Order').'</th>
<th>'._('Type').'</th>
<th class="check"> </th>
</tr>
</thead>
<tbody>';
// Display each Module row
while ($r = mysql_fetch_array($result)) {
echo '
<tr>
<td class="order">';
echo getOrderSelectBox($r['id'], $total, $r['order']);
echo '
</td>
<td>'.getModuleTypeName($r['type']).'</td>
<td class="check">';
if ($r['type'] != MOD_TRACKER) {
echo '<input type="checkbox" name="chk-delete[]" value="'.$r['id'].'"/>';
}
echo '
</td>
</tr>';
$chk = '';
}
echo '
</tbody>
</table>
<input class="sub1" type="submit" id="submit-delete" name="submit-delete" value="'._('Delete Selected').'"/>
<input class="sub1" type="submit" id="submit-update" name="submit-update" value="'._('Apply Changes').'"/>
</form>';
}