Tienes razón, pero no quería poner todo porque es largo.
Este es el model:
Código :
class Fichero_oferta_model {
const FICHERO_PATH = 'pub/uploads/fichero_ofertas/';
private $tipos_centro, $tipos_oferta, $nombres_centro;
function __construct(){
$this->tipos_centro = array('COR', 'BAD', 'LIN');
$this->tipos_oferta = array('ALC', 'DAL', 'DIS', 'INT');
$this->nombres_centro = array(
'COR' => 'Córdoba',
'BAD' => 'Badajoz',
'LIN' => 'Linares',
);
}
function get_nombre_centro($tipo_centro){
return $this->nombres_centro[$tipo_centro];
}
function get_nombres_centro(){
return $this->nombres_centro;
}
function get_fichero($tipo_centro, $tipo_oferta){
if( ! in_array($tipo_centro, $this->tipos_centro) )
return false;
if( ! in_array($tipo_oferta, $this->tipos_oferta) )
return false;
return self::FICHERO_PATH . $tipo_centro . '/' . $tipo_oferta . '.zip';
}
function get_ficheros_por_centro($tipo_centro){
if( ! in_array($tipo_centro, $this->tipos_centro) )
return false;
$paths = array();
foreach($this->tipos_oferta as $tipo_oferta){
$paths[$tipo_oferta] = $this->get_fichero($tipo_centro, $tipo_oferta);
}
return $paths;
}
function get_ficheros(){
$paths = array();
foreach($this->tipos_centro as $tipo_centro){
$paths[$tipo_centro] = $this->get_ficheros_por_centro($tipo_centro);
}
return $paths;
}
function get_tipos_centro() { return $this->tipos_centro; }
function get_tipos_oferta() { return $this->tipos_oferta; }
function procesar_files(){
$rns = array();
foreach($this->tipos_centro as $tipo_centro){
$rns[$tipo_centro] = array();
foreach( $this->tipos_oferta as $tipo_oferta){
$k = 'files_' . $tipo_centro . '_' . $tipo_oferta;
$file = $_FILES[$k];
$filepath = $this->get_fichero($tipo_centro, $tipo_oferta);
if( !empty($file) && $file['error'] == 0 ){
if( !is_dir( dirname( $filepath ) ) ) mkdir( dirname($filepath), 0775, true);
if( ! move_uploaded_file($file['tmp_name'], $filepath) )
$rns[$tipo_centro][$tipo_oferta] = new Rn(false, 'No se ha podido subir el fichero');
else
$rns[$tipo_centro][$tipo_oferta] = new Rn(true, 'Se ha recibido el fichero');
}
}
}
}
function descargar($tipo_centro, $tipo_oferta){
if( !in_array($tipo_centro, $this->tipos_centro) ){
header("Content-Type: text/plain;");
die("No hay ningún fichero para actualización");
}
if( !in_array($tipo_oferta, $this->tipos_oferta) ){
header("Content-Type: text/plain;");
die("No hay ningún fichero para actualización");
}
$file = $this->get_fichero($tipo_centro, $tipo_oferta);
if( ! $file || ! file_exists($file) ){
header("Content-Type: text/plain;");
die("No hay ningún fichero para actualización");
}
$filesize = filesize($file);
$filetime = date('d/m/Y H:i:s', filemtime($file));
header("Content-Type: binary/octet-stream");
header("Content-Disposition: attachment; filename=fichero.zip; size=$filesize");
header("Fecha-fichero: $filetime");
header("Size-fichero: " . hfilesize($file));
// depurar(headers_list());
readfile($file);
}
function eliminar($tipo_centro, $tipo_oferta){
if( !in_array($tipo_centro, $this->tipos_centro) )
return new Rn(false, 'No se ha encontrado el tipo de centro');
if( !in_array($tipo_oferta, $this->tipos_oferta) )
return new Rn(false, 'No se ha encontrado el tipo de oferta');
$file = $this->get_fichero($tipo_centro, $tipo_oferta);
if( $file && is_file($file) ) unlink($file);
return new Rn(true, 'Se ha eliminado el fichero correctamente');
}
}
Y este el controller:
Código :
class Fichero_ofertas_controller {
private $core, $layout, $oftm;
function __construct(){
$this->core = Core::instance();
$this->layout = Layout::instance();
$this->oftm = $this->core->load_model('fichero_oferta');
}
function editar(){
$rns = null;
if( POST ){
$rns = $this->oftm->procesar_files();
}
$this->layout->set_data_view('content', 'fichero_ofertas', array(
'tipos_centro' => $this->oftm->get_tipos_centro(),
'nombres_centro' => $this->oftm->get_nombres_centro(),
'tipos_oferta' => $this->oftm->get_tipos_oferta(),
'ficheros' => $this->oftm->get_ficheros(),
'rns' => $rns,
));
$this->layout->render();
}
function descargar($tipo_centro = '', $tipo_oferta = ''){
$this->oftm->descargar($tipo_centro, $tipo_oferta);
}
function eliminar($tipo_centro = '', $tipo_oferta = ''){
$link = 'index.php?a=c&c=fichero_ofertas&m=editar';
if( !POST ) confirmar('¿Está seguro de que desea eliminar el fichero de oferta <b>' . $tipo_oferta . '</b> de <b>' . $this->oftm->get_nombre_centro($tipo_centro) . '</b>?', $link);
$rn = $this->oftm->eliminar($tipo_centro, $tipo_oferta);
notificar($rn->data, $link);
}
}
Y esta la vista
Código :
[code]<form name='frmEditar' method='post' enctype='multipart/form-data'>
<div class='cuadro' style='float: left; min-width: 360px;'>
<h1>Gestión de ficheros de ofertas</h1>
<div id='acordeon'>
<?foreach($tipos_centro as $tipo_centro):?>
<h3><a href='#'>Tipo de centro <?=$nombres_centro[$tipo_centro]?></a></h3>
<div>
<table cellpadding='6' cellspacing='0' border='0' class='form'>
<tr>
<?foreach($tipos_oferta as $index => $tipo_oferta): $file = $ficheros[$tipo_centro][$tipo_oferta]; ?>
<?if( $index > 0 && $index % 2 == 0) echo "</tr><tr>";?>
<td valign='top' style='border: 1px solid #84A0C4; background: <?=$_colors[$tipo_oferta]?> url(<?=LIB?>filtros/filtro_8x23.png) repeat-x 0 0;'>
<b><?=$tipo_oferta?></b><br/>
<div class='mensaje'>
<p>
<?if( !empty($file) && is_file($file) ):?>
Se ha encontrado este fichero:
<div class='cuadro'>
Nombre: <a href='index.php?a=c&c=fichero_ofertas&m=descargar&tipo_centro=<?=$tipo_centro?>&tipo_oferta=<?=$tipo_oferta?>' target='_blank' title='Pulsa aquí para descargarlo'>
<?=$file?>
</a><br/>
Tamaño: <?=hfilesize($file)?><br/>
Última modificación: <?=date('d/m/Y H:i:s', filemtime($file))?>
</div>
<?else:?>
Sin fichero <?=$tipo_oferta?>.
<?endif;?>
</p>
<a href='#' class='btn icon upload lnk-agregar-fichero'>Pulse aquí para subir el fichero <?=$tipo_oferta?></a>
<?if( is_file($file) ):?>
<a class='btn icon eliminar' href='index.php?a=c&c=fichero_ofertas&m=eliminar&tipo_centro=<?=$tipo_centro?>&tipo_oferta=<?=$tipo_oferta?>'>Borrar</a>
<?endif;?>
</div>
<div class='agregar-imagen' style='display:none;'>
<label><b>Subir fichero <?=$tipo_oferta?>:</b></label><br />
<input type='file' name='files_<?=$tipo_centro?>_<?=$tipo_oferta?>' size='30' />
<br />
<a href='#' class='btn icon cancelar lnk-cancelar-fichero'>Pulse aquí para cancelar</a>
</div>
<?if( !empty($rns[$tipo_centro][$tipo_oferta]) ):?>
<div><b><?=$rns[$tipo_centro][$tipo_oferta]->data?></b></div>
<?endif;?>
</td>
<?endforeach;?>
</tr>
</table>
</div>
<?endforeach;?>
</div>
<div style='text-align: right; margin-top: 8px;'>
<a class='btn icon icon guardar' href='javascript:document.forms["frmEditar"].submit();'>Guardar</a>
</div>
</div>
</form>
<script type='text/javascript'>
$(document).ready(function(){
$(".lnk-agregar-fichero").click(function(event){
event.preventDefault();
$(this).parent().hide();
$(this).parent().next().show();
});
$(".lnk-cancelar-fichero").click(function(event){
event.preventDefault();
$(this).parent().hide();
$(this).parent().prev().show();
});
$("#acordeon").accordion();
});
</script>[/code]