<?php
// vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker:
/**
 * Base para página simple del multi-formulario para capturar caso 
 * (captura_caso.php). 
 *
 * PHP version 5
 *
 * @category  SIVeL
 * @package   SIVeL
 * @author    Vladimir Támara <vtamara@pasosdeJesus.org>
 * @copyright 2005 Dominio público. Sin garantías.
 * @license   http://creativecommons.org/licenses/publicdomain/ Dominio Público. Sin garantías.
 * @version   $Id: PagBaseSimple.php,v 1.28 2009/05/03 12:23:21 vtamara Exp $
 * @link      http://sivel.sf.net
 */

/**
 * Base para página simple del multi-formulario para capturar caso 
 */

require_once 'HTML/QuickForm/Page.php';
require_once 'aut/aut.php';
require_once 'misc.php';
require_once 'aut/conf.php';

/** 
 * Clase base para subformularios de una sóla página
 *
 * @category SIVeL
 * @package  SIVeL
 * @author   Vladimir Támara <vtamara@pasosdeJesus.org>
 * @license  http://creativecommons.org/licenses/publicdomain/ Dominio Público.
 * @link     http://sivel.sf.net/tec
 */
abstract class PagBaseSimple extends HTML_QuickForm_Page
{

    /** Titulo que aparecerá en formulario */
    var $titulo = '';

    /** Nombre de una clase DataObject característica de este formulario */
   var $clase_modelo = 'caso';

   /** 
    * Definimos variables para subformularios (a su vez descendientes de
    * DB_DataObject_FormBuilder).
    * Convención sugerida: que comienzan con la letra b 
    */
    var $bcaso = null;

    /** Inicializa variables de la clase extrayendo datos de la base.
     * Puede mejorarse manteniendo información en var. de sesión 
     * (actualizada con operaciones)
     * para que no tener que consultar la base de datos siempre.
     *
     * @param bool $cargaCaso  decide si se carga o no el caso de la B.D 
     * @param bool $retArreglo indica si debe retornar un arreglo con 
     * base de datos, objeto dcaso e identificación o sólo 
     * base de datos.
     *
     * @return mixed Puede ser bien conexión a base de daotos o bien
     * un arreglo con base, objeto dcaso e identificación de caso (depende
     * del parámetro $retArreglo
     */
    function iniVar($cargaCaso = true, $retArreglo = false)
    {
        $dcaso = DB_DataObject::factory('caso');
        if (PEAR::isError($dcaso)) {
            die($dcaso->getMessage());
        }
        $db =& $dcaso->getDatabaseConnection();

        $idcaso = null;
        if ($cargaCaso) {
            $idcaso =& $_SESSION['basicos_id'];
            if (!isset($idcaso) || $idcaso == null) {
                die("Bug: idcaso no debería ser null");
            }   
            $dcaso->id = $idcaso;
            if (($e = $dcaso->find()) != 1 && 
                $idcaso != $GLOBALS['idbus']) {
                die("Se esperaba un sólo registro, pero se encontraron $e.");
            }
            $dcaso->fetch();
        }

        $this->bcaso =& DB_DataObject_FormBuilder::create($dcaso,
            array('requiredRuleMessage' => $GLOBALS['mreglareq'],
            'ruleViolationMessage' => $GLOBALS['mreglavio'] ));

        if ($retArreglo) {
            return array($db, $dcaso, $idcaso);
        } else {
            return $db;
        }
    } 


    /** Constructora
     *
     * @param string $nomForma es nombre del formulario
     * @param string $mreq     Mensaje para campos requeridos
     * @param string $titulo   Título de la página
     *
     * @return void
     */
    function PagBaseSimple($nomForma, $mreq, $titulo) 
    {
        $this->HTML_QuickForm_Page($nomForma, 'post', '_self', null);
        $this->setRequiredNote($mreq);
        $this->titulo = $titulo;

        if (isset($_SESSION['forma_modo']) && 
            $_SESSION['forma_modo'] == 'busqueda') {
            $this->addAction('busqueda', new Busqueda());
        }
    }


    /** 
     * Agrega elementos particulares del formulario
     *
     * @param handle  &$db    Conexión a base de datos
     * @param integer $idcaso Identificación del caso
     *
     * @return void
     */
    abstract function formularioAgrega(&$db, $idcaso);


    /** 
    * Establece valores por defecto cuando se requiere para presentar
    * en el formulario.
    *
    * @param handle  &$db    Conexión a base de datos
    * @param integer $idcaso Identificación del caso
    *
    * @return void
    */
    abstract function formularioValores(&$db, $idcaso);


    /** 
     * Construye elementos del formulario 
     *
     * @return object Formulario
     */
    function buildForm()
    {
        $this->_formBuilt = true;
        $this->_submitValues = array();
        $this->_defaultValues = array();
   
        $cm = "b".$this->clase_modelo;
        if (!isset($cm) || $cm == null || !isset($this->$cm) || 
            $this->$cm == null) {
            $db = $this->iniVar();
        } else {
            $db = $this->$cm->_do->getDatabaseConnection();
            if (PEAR::isError($db)) {
                die($cm . " - " . $db->getMessage());
            }
        }
        $idcaso = $_SESSION['basicos_id'];
        $this->controller->creaTabuladores($this, array('class' => 'flat'));


        $comp = isset($_SESSION['forma_modo']) && 
            $_SESSION['forma_modo'] == 'busqueda' && 
            $idcaso == $GLOBALS['idbus'] ? 
            'Consulta' : 'Caso ' . $idcaso; 

        $e =& $this->addElement('header', null, '<table width = "100%">' .
            '<th align = "left">' . $this->titulo .
            '</th><th algin = "right">' .
            $comp . "</th></table>");

        $this->formularioAgrega($db, $idcaso); 

        $this->controller->creaBotonesEstandar($this);
    
        $this->setDefaultAction('siguiente');

        // OJO Mejor cambiar valores después de crear formulario, si
        // se hace antes molesta.
        $this->formularioValores($db, $idcaso); 
    }


    /** 
     * Elimina de la base, datos asociados a un caso y presentados por este
     * formulario.
     *
     * @param handle  &$db    conexión a base de datos
     * @param integer $idcaso Número de caso
     *
     * @return void
     */
    abstract static function eliminaDep(&$db, $idcaso);

    /**
     * Verifica y salva datos.
     * Típicamente debe validar datos, preprocesar de requerirse,
     * procesar con función process y finalmente registrar evento con función
     * funcionario_caso
     *
     * @param array &$valores Valores enviados por el formulario.
     *
     * @return void
     */
    function procesa(&$valores) 
    {
        // Verifica si es vacio

        if (!$this->validate()) {
            return false;
        }

        if (!isset($valores['evita_csrf']) || 
            $valores['evita_csrf'] != $_SESSION['sin_csrf']) {
            die("Datos enviados no pasaron verificación CSRF (" .
                $_SESSION['sin_csrf'] . ", ".$valores['evita_csrf'] . ")");
        }

        // Reglas de integridad referencial

        $db = $this->iniVar();

        // Preprocesamiento

        // Procesamiento
        $ret = $this->process(array(&$this->bcaso, 'processForm'), false);
        if (PEAR::isError($ret)) {
            die($ret->getMessage());
        }

        // Otros

        funcionario_caso($_SESSION['basicos_id']);
        return  $ret;
    }

    /** 
     * Llena una consulta de acuerdo a datos del formulario cuando
     * está en modo busqueda.  
     * <b>SELECT caso.id FROM $t WHERE $w</b>
     *
     * @param string &$w       Condiciones de consulta exterior
     * @param string &$t       Tablas de consulta exterior
     * @param object &$dCaso   Objeto con Caso donde están datos de busqueda.
     * @param string &$subcons Consulta interior (si no es vacía hacer UNION)
     *
     * @return void
     */
    abstract function datosBusqueda(&$w, &$t, &$dCaso, &$subcons);

}

?>
