View file admincp/plugin_manager.php

File size: 8.83Kb
<?php
// Master Autoindex
// ionutvmi@gmail.com 
// Last Edit: May 2013
// master-land.net

ob_start();

include "../inc/init.php";


$plugins->run_hook("plugin_manager_top");

if(!is_admin()) {
	ob_end_clean();
	header("Location: $set->url");exit;
}
$links[] = mai_img("arr.gif")." <a href='index.php'>$lang->admincp </a>";
$links[] = mai_img("arr.gif")." $lang->plugin_manager";

$plugins->load(true); // we don't run plugins here
$act = $_GET['act'];
$page = (int)$_GET['page'] == 0 ? 1 : (int)$_GET['page'];

// activate
if($act == 'activate'){
	$plug = $_GET['plugin'];
	$active_plugins = unserialize($set->sinfo->active_plugins);
	if(!is_array($active_plugins))
		$active_plugins = array();

	$active_plugins[] = $plug;
	$db->query("UPDATE `".MAI_PREFIX."settings` SET `active_plugins` = '".serialize(array_unique($active_plugins))."'");
	
	if(is_callable($plug."_activate")){
		call_user_func($plug."_activate");
	}
	ob_end_clean();
	header("Location: ?page=$page");
	exit;
}
// deactivate
if($act == 'deactivate'){
	$plug = $_GET['plugin'];
	$active_plugins = unserialize($set->sinfo->active_plugins);
	if(!is_array($active_plugins))
		$active_plugins = array();

	$active_plugins = array_remove_value($active_plugins,$plug);
	
	$db->query("UPDATE `".MAI_PREFIX."settings` SET `active_plugins` = '".serialize(array_unique($active_plugins))."'");
	
	if(is_callable($plug."_deactivate")){
		call_user_func($plug."_deactivate");
	}
		ob_end_clean();
	header("Location: ?page=$page");
	exit;
}

// install
if($act == "install"){
	$plug = $_GET['plugin'];
	if(is_callable($plug."_install")){
		call_user_func($plug."_install");
	}
		ob_end_clean();
	header("Location: ?page=$page");
	exit;

}

// uninstall
if($act == "uninstall"){
	$plug = $_GET['plugin'];
	
	if($_POST['yes']){
		// if it's active
		if(in_array($plug,unserialize($set->sinfo->active_plugins))){
			// we deactivate
			$active_plugins = unserialize($set->sinfo->active_plugins);
			if(!is_array($active_plugins))
				$active_plugins = array();

			$active_plugins = array_remove_value($active_plugins,$plug);
				
			$db->query("UPDATE `".MAI_PREFIX."settings` SET `active_plugins` = '".serialize(array_unique($active_plugins))."'");
			if(is_callable($plug."_deactivate")){
				call_user_func($plug."_deactivate");
			}
		}
		// we uninstall
		if(is_callable($plug."_uninstall")){
			call_user_func($plug."_uninstall");
		}
		ob_end_clean();
		header("Location: ?page=$page");
		exit;
	}else {
	
	$content = "<div class='content'>
	<form action='#' method='post'>
	$lang->are_you_sure <br/>
	<input type='submit' name='yes' value='$lang->yes'> <a href='?'>$lang->cancel</a>
	</form>
	</div>";
	}
	////// settings
}elseif($act == "settings"){
	$content .= "<div class='title'>".htmlentities($_GET['plugin'])." - $lang->settings</div>";
	$plug = $_GET['plugin'];
	
	if($_POST){
        $on_save = true;
        $fail_message = 'fail'; // use this var to store any error message in _on_save()
        if(is_callable($plug."_on_save")){
            $on_save = (bool)call_user_func($plug."_on_save");
        }
        
        if($on_save){
            foreach($_POST as $k => $v){
                if(is_array($v))
                    $value = $db->escape(serialize($v)); 
                else 
                    $value = $db->escape($v); 
                
                $db->query("UPDATE `".MAI_PREFIX."plugins_settings` SET `value`='$value' WHERE `name` = '".$db->escape($k)."'");
            }
        
            $content .= "<div class='green'>$lang->saved </div>";
        } else
            $content .= "<div class='red'>$fail_message </div>";        
	}
	
	
	$data = $db->select("SELECT * FROM `".MAI_PREFIX."plugins_settings` WHERE `plugin` = '".$db->escape($plug)."'");
	// is it active ??
	if(!in_array($plug,unserialize($set->sinfo->active_plugins)) OR !$data){
		ob_end_clean();
		header("Location: ?page=$page");exit;
	}
	$content .= "<form action='#' method='post'>";
	foreach($data as $p){
		$content .="<div class='content".(++$i%2==0 ? "2" : "")."'> <b>$p->title</b><br/><small>$p->description </small><br/>";
		if($p->type == 'yesno'){
			$content .="<select name='$p->name'>
			<option value='0'".($p->value == 0 ? " selected='vmi'" : "").">$lang->no</option>
			<option value='1'".($p->value == 1 ? " selected='vmi'" : "").">$lang->yes</option>
			</select>";
		}
		if($p->type == 'onoff'){
			$content .="<select name='$p->name'>
			<option value='0'".($p->value == 0 ? " selected='vmi'" : "").">$lang->off</option>
			<option value='1'".($p->value == 1 ? " selected='vmi'" : "").">$lang->on</option>
			</select>";
		}
		if($p->type == 'textarea'){
			$content .="<textarea name='$p->name'>".htmlentities($p->value)."</textarea>";
		}
		if($p->type == 'text'){
			$content .="<input type='text' name='$p->name' value='".htmlentities($p->value,ENT_QUOTES)."'>";
		}
		if(preg_match("~select(.+)~i",$p->type)){
			$type=explode("\n",$p->type);
			$content .= "<select name='$p->name'>";
				for($i=1;$i <= count($type); $i++){
					$val = explode("=",$type[$i]);
					if(trim($val[0]) != '')
						$content .= "<option value='".$val[0]."'".($p->value == $val[0] ? " selected='vmi'" : "").">".htmlentities($val[1])."</option>";
				}
			$content .= "</select>";
		}
		if(preg_match("~radio(.+)~i",$p->type)){
			$type=explode("\n",$p->type);
				for($i=1;$i <= count($type); $i++){
					$val = explode("=",$type[$i]);
					if(trim($val[0]) != '')
						$content .= "<input type='radio' name='$p->name' value='".$val[0]."'".($p->value == $val[0] ? " checked='vmi'" : "").">".htmlentities($val[1])."<br/>";
				}
		}
		if(preg_match("~checkbox(.+)~i",$p->type)){
			$type=explode("\n",$p->type);
				for($i=1;$i <= count($type); $i++){
					$val = explode("=",$type[$i]);
					if(trim($val[0]) != '')
						$content .= "<input type='checkbox' name='$p->name[]' value='".$val[0]."'".(in_array($val[0],unserialize($p->value)) ? " checked='vmi'" : "").">".htmlentities($val[1])."<br/>";
				}
		}
		$content .="</div>";
	}
	$content .= "<div class='submit'><input type='submit' value='$lang->save'></div></form>
	<div class='content'><a href='?'>$lang->back</a></div>";
}else {
// plugin list
	include "../lib/array_pagination.class.php";
	include "../lib/pagination.class.php";	
	
	$plugs_list = glob("../plugins/*_plugin.php");
	
	$total_results = count($plugs_list);
	// pagination
	$perpage = $_SESSION['perp'] ? (int)$_SESSION['perp'] : $set->perpage; 
	// $page is defined in the first lines
	if($page > ceil($total_results/$perpage)) $page = ceil($total_results/$perpage);
	$start = ($page-1)*$perpage;

	$s_pages = new pag($total_results,$page,$perpage);
	$show_pages = $lang->pages.": ".$s_pages->pages;	
	
	$a_pag = new array_pagination; 
	$plugs = $a_pag->generate($plugs_list,$perpage);

	foreach($plugs as $plug){
		// grab the plugin name this is why the name of the plugin must be
		// <name>_plugin.php
		$plug =substr(basename($plug),0,-11);

		$content .= "<div class='content".(++$i%2==0 ? "2" : "")."'>";
		if(is_callable($plug."_info")){
			$info = (object)call_user_func($plug."_info");
		}
		$content .=  $info->name !='' ? $info->name : $plug;

		if(is_callable($plug."_uninstall"))
			$uninstall = " - <a href='?act=uninstall&plugin=$plug&page=$page'>$lang->uninstall</a>";
		else
			$uninstall = '';
		if(is_callable($plug."_is_installed")){
			$is_installed = (bool)call_user_func($plug."_is_installed");
		}else
			$is_installed = true;
		
		if($is_installed){
			$is_active = in_array($plug,unserialize($set->sinfo->active_plugins));
			if($is_active){
				// check for settings
				if($db->count("SELECT `name` FROM `".MAI_PREFIX."plugins_settings` WHERE `plugin` = '".$db->escape($plug)."'") > 0)
					$content .= " - <a href='?act=settings&plugin=$plug'>$lang->settings</a> ";			
				$content .= " - <a href='?act=deactivate&plugin=$plug&page=$page'>$lang->deactivate</a>";
			}else
				$content .= " - <a href='?act=activate&plugin=$plug&page=$page'>$lang->activate</a>";
			
			// show uninstall
			$content .= $uninstall;
		} else {
			$content .= " - <a href='?act=install&plugin=$plug&page=$page'>$lang->install</a>";
		}
		
		if($db->count("SELECT `name` FROM `".MAI_PREFIX."plugins_settings` WHERE `plugin` = '".$db->escape($plug)."'") > 0)
			$have_set = true;
		
		$content .= "<br/><small>".($info->author !='' ? "$lang->author ".($info->author_site !='' ? "<a href='$info->author_site'>$info->author</a>" : $info->author)." <br/>" : "")."$info->description </small>";
		$content .= "</div>";
	}
	$content .= "<div class='pages'> $show_pages </div>";

}

include "../header.php";
$tpl->grab("plugin_manager.tpl","plugin_manager");
$tpl->assign("content",$content);
$tpl->display();
$plugins->run_hook("plugin_manager_end");
include "../footer.php";