Skip to content

Instantly share code, notes, and snippets.

@demonio

demonio/index.phtml

Last active Aug 29, 2020
Embed
What would you like to do?
Sube, instala y desinstala módulos para KumbiaPHP

KumbiaPHP System Modules

  • Crea la carpeta modules en tu aplicación (APP_PATH . app/modules/).
  • Situa un archivo comprimido en .ZIP en esa carpeta con los siguiente requisitos:
    • Todos los archivos deben mantener la misma estructura del framework KumbiaPHP.
    • Si tu modulo usa base de datos, el archivo comprimido tambien debe contener una carpeta llamada config con un archivo .SQL con el mismo nombre que el modulo.
    • Debe existir un controlador con el mismo nombre que el modulo en la carpeta admin con la acción install y uninstall como en el ejemplo de abajo.
  • Situa estos tres archivos en su lugar (app/controllers/admin/modules_controller.php, app/models/modules.php y app/views/admin/modules/index.phtml) y ejecuta este sitema de modulos desde tu app en el navegador (/admin/modules).
    public function install()
    {
        $sql = file_get_contents(APP_PATH . 'config/permisos.sql');
        (new ActRecord)->sql($sql);
		exit( Redirect::to("admin/modules") );
	}
	
    public function uninstall()
    {
		$files = array
		(
			'config/permisos.sql',
			'controllers/admin/permisos_controller.php',
			'models/tp_permisos.php',
			'views/admin/permisos/index.phtml',
		);
		
		foreach ($files as $file)
		{
			$filename  = APP_PATH . $file;
			unlink($filename);
		}
		
		$sql = "DROP TABLE tp_permisos";
        (new ActRecord)->sql($sql);
		exit( Redirect::to("admin/modules") );
    }
<fieldset>
<legend><?=ucfirst($controller_name)?></legend>
<div>
<label>Filter:</label>
<input class="js-filter" data-to=".list li" type="text" />
</div>
<ul>
<?php foreach($modules as $module) :
$filename = str_replace('.zip', '', basename($module) ); ?>
<li>
<a href="/<?=$admin_folder?>/modules/index/<?=$filename?>"><?=$filename?></a>
</li>
<?php endforeach; ?>
</ul>
</fieldset>
<?php if ($module_selected) : ?>
<fieldset>
<legend><?=$module_selected; ?> module</legend>
<div><?php if ($module_readme) echo $module_readme; ?></div>
<div>
<?php if ( ! $module_installed) { ?>
<a href="/<?=$admin_folder?>/modules/install/<?=$module_selected?>">Instalar</a>
<?php } else { ?>
<a href="/<?=$admin_folder?>/modules/uninstall/<?=$module_selected?>">Desinstalar</a>
<?php } ?>
</div>
</fieldset>
<?php endif; ?>
<fieldset>
<legend>Upload a module.zip</legend>
<form action="/<?=$admin_folder?>/modules/upload" enctype="multipart/form-data" method="post">
<input name="module" type="file" />
<button name="action" type="submit" value="upload">Subir</button>
</form>
</fieldset>
<?php
/**
*/
class Modules
{
public $server_remoto = 'http://kumo.infoclick.es/modules.php';
public function uninstall($module)
{
@unlink(APP_PATH . "modules/$module.zip");
}
public function install($module)
{
$local = APP_PATH . "modules/$module.zip";
$remoto = file_get_contents("http://kumo.infoclick.es/modules/$module.zip");
file_put_contents($local, $remoto);
$zip = new ZipArchive;
if ($zip->open($local) === TRUE)
{
$zip->extractTo(APP_PATH);
$zip->close();
}
}
public function read()
{
$modules = [];
$modules = unserialize( file_get_contents('http://kumo.infoclick.es/modules.php') );
return $modules;
}
public function isInstalled($module)
{
return is_readable(APP_PATH . "modules/$module.zip") ? 1 : 0;
}
public function readme($module='')
{
$file = APP_PATH . "views/admin/$module/readme.phtml";
if ( is_readable($file) ) return file_get_contents($file);
}
public function upload($module)
{
$in_local = move_uploaded_file($module['tmp_name'], APP_PATH . "modules/{$module['name']}");
if ($in_local)
{
$fc = file_get_contents(APP_PATH . "modules/{$module['name']}");
$file = array('filename'=>$module['name'], 'filecontents'=>$fc);
$this->sendPost($this->server_remoto, $file);
}
return str_replace('.zip', '', $module['name']);
}
public function sendPost($url, $post_data)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
curl_close($ch);
}
}
<?php
/**
*/
class ModulesController extends AdminController
{
public $admin_folder = 'admin';
public function index($module='')
{
$this->modules = (new Modules)->read();
$this->module_selected = $module;
$this->module_installed = (new Modules)->isInstalled($module);
$this->module_readme = (new Modules)->readme($module);
}
public function uninstall($module)
{
(new Modules)->uninstall($module);
exit( Redirect::to("$this->admin_folder/$module/uninstall") );
}
public function install($module)
{
(new Modules)->install($module);
exit( Redirect::to("$this->admin_folder/$module/install") );
}
public function upload()
{
$module = (new Modules)->upload($_FILES['module']);
exit( Redirect::to("$this->admin_folder/modules/index/$module") );
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment