<?php

/**
 * @see MyWeb_Model_Interface
 */
require_once 'MyWeb/Model/Interface.php';

/**
 * Abstraktní třída pro modely
 *
 * @package    MyWebBlog
 * @author     Marian Böhmer
 */
abstract class MyWeb_Model_Abstract extends MyWeb_plugin implements MyWeb_Model_Interface
{
    /**
     * @var Zend_Loader_PluginLoader
     */
    protected static $_pluginLoader;

    /**
     * Objekt úložiště údajů
     * @var Zend_Db_Table
     */
    protected $_storage = null;
    
    /**
     * Název úložiště
     * @var string
     */
    protected $_storageName = null;
    
    /**
     * Objekty formulářů
     * @var array
     */
    protected $_forms = array();
    
    /**
     * Třídy formulářů
     * @var array
     */
    protected $_formClasses = array();
    
    /**
     * Vrátí PluginLoader
     *
     * @return Zend_Loader_PluginLoader
     */
    static public function getLoader()
    {
    	self::addLog('MyWeb_Model_Abstract',1,4,'ABSTRACT');
        self::showMe(self::showLog(),'LOG2');
        // v případě, že PluginLoader neexistuje, ho vytvoří
        if (null === self::$_pluginLoader) {
            require_once 'MyWeb/Loader/ModelLoader.php'; 
            self::$_pluginLoader = new MyWeb_Loader_ModelLoader();
            
            // získá název modulu
            $front  = Zend_Controller_Front::getInstance();
            $module = $front->getRequest()->getModuleName();
            // vloží modul
            self::$_pluginLoader->addModule($module);
        }
        
        // vrátí objekt úložiště údajů
        return self::$_pluginLoader;
    }
    
    /**
     * Načítání třídy modelu
     *
     * @param string $name Název třídy
     * @return MyWeb_Model_Database
     */
    static public function loadModel($name)
    {
    	self::addLog('MyWeb_Model_Abstract',2,4,'ABSTRACT');
        self::showMe(self::showLog(),'LOG2');
    	//tahle funkce načítá model zatímco funkce loadStorgage načítá přímo obraz tabulky to je 
    	//dáno přidáním ke jménu Db_ v loadStorgage
    	
        // načítá třídu modelu a vrátí její instanci
        $name  = ucfirst((string) $name);
        $class = self::getLoader()->load($name);//vrací třídu Zend_Db_Table_Abstract reprezentující tabulku databáze
        return new $class();
    }
    
    /**
     * Načítání úložiště údajů
     *
     * @param string $name Název úložiště
     * @return Zend_Db_Table
     */
    static public function loadStorage($name)
    {
    	self::addLog('MyWeb_Model_Abstract',3,4,'ABSTRACT');
        self::showMe(self::showLog(),'LOG2');
    	// uložiště je Db_ třída
        // načítá úložiště a vrátí jeho instanci
        $name  = 'DbTable_' . ucfirst((string) $name);
        $class = self::getLoader()->load($name);
        return new $class();
    }
    
    /**
     * Vrátí úložiště údajů
     *
     * @return Zend_Db_Table
     */
    public function getStorage()
    {
    	self::addLog('MyWeb_Model_Abstract',4,4,'ABSTRACT');
        self::showMe(self::showLog(),'LOG2');
        // v případě, že objekt úložiště neexistuje, je potřeba ho vytvořit
        if (null === $this->_storage) {
            $this->_storage = self::loadStorage($this->_storageName);
        }
        //***********************************************************************************
        //_storageName se nastavuje az v konkretnim modelu tabulky napr. articles
        //echo $this->_storageName."\n";
        //************************************************************************************
        // vrátí instanci úložiště údajů
        return $this->_storage;
    }
     /**
     * Načítání formuláře
     *
     * @param string $name Název formuláře
     * @param Mabo_Model_Abstract $model Instance modelu
     * @return Zend_Form
     */
    static public function loadForm($name, MyWeb_Model_Abstract $model)
    {
    	self::addLog('MyWeb_Model_Abstract',5,4,'ABSTRACT');
        self::showMe(self::showLog(),'LOG2');
        // načítá úložiště a vrátí jeho instanci
        $name  = 'Form_' . ucfirst((string) $name);
        $class = self::getLoader()->load($name);
        return new $class($model);
    } 
    /**
     * Vrátí formulář
     *
     * @param string $mode Modus
     * @return Zend_Form
     */
    public function getForm($mode = 'insert')
    {
    	self::addLog('MyWeb_Model_Abstract',6,4,'ABSTRACT');
        self::showMe(self::showLog(),'LOG2');
        // otestuje, zda žádaný formulář existuje
        if (!isset($this->_formClasses[$mode])) {
            // vyvolá výjimku
            //require_once 'MyWeb/Model/Exception.php';
            //throw new MyWeb_Model_Exception('Neznámý Formulář');
        }
        // v případě, že objekt formuláře neexistuje, tak ho vytvoří
        if (!isset($this->_forms[$mode])) {
            // inicializuje objekt formuláře a předá mu instanci modelu
            $this->_forms[$mode] = self::loadForm($this->_formClasses[$mode], $this);
        }
        
        // vrátí instanci formuláře
        return $this->_forms[$mode];
    }
}
