public static function toPO($xmlstr, XSLTProcessor $xslt = NULL)
 {
     if ($xslt != NULL) {
         //$doc = DOMDocument::loadXML($xmlstr);
         $doc = new DOMDocument();
         $doc->loadXML($xmlstr, LIBXML_NOCDATA);
         // TEST: hay 252
         $xpath = new DOMXPath($doc);
         $nodelist = $xpath->query('//cuerpo/personas/persona');
         echo 'Hay ' . $nodelist->length . ' nodos persona<br/>';
         $xmlstr = $xslt->transformToXML($doc);
     }
     if ($xmlstr === NULL) {
         echo 'la transformacion retorna NULL<br/>';
         return null;
     }
     // DEBUG
     //FileSystem::write('archivo_transformado_alta_pac.xml', $xmlstr);
     // Tengo que cargar todas las clases de la aplicacion actual porque
     // se como se llaman, pero no se donde estan.
     YuppLoader::forceReload();
     YuppLoader::loadModel();
     // FIXME: no carga las clases del imp!
     //print_r(YuppLoader::getLoadedClasses());
     // Parseo el XML (deberia tener el formato de toXML)
     $xml = simplexml_load_string($xmlstr);
     // TEST: hay 252!
     $arr = $xml->xpath('//IMPPersona ');
     echo "En el transformado hay " . count($arr) . " personas<br/>";
     // Referencias a paths con objetos para resolver referencias por loops
     $pathObj = new ArrayObject();
     // ***
     // TODO: ver si el nodo raiz es un objeto simple o una coleccion.
     // <personas type="collection" of="IMPPersona">
     if (!empty($xml['type']) && $xml['type'] == 'collection') {
         // TEST:
         // 252 nodos!
         echo count($xml->children()) . "<br/>";
         // nodes, parentAttr, path, pathObj
         $list_po = self::toPOCollection($xml->children(), '/' . $xml->getName(), $pathObj);
         // TEST: error hay 381 personas!
         echo "Hay " . count($list_po) . " en la lista de PO<br/>";
         return $list_po;
     }
     // Para el primer nodo, la clase es el nombre del elemento
     $class = $xml->getName();
     $po = self::toPOSingle($class, $xml, '', -1, $pathObj);
     // TODO: no necesito loop detection para no entrar en loops infinitos,
     // lo necesito para resolver referencias a nodos, y reflejarlo en el PO que estoy creando.
     //$loopDetection = new ArrayObject();
     //self::toXMLSingle( $po, $xml_dom, $xml_dom, $recursive, $loopDetection );
     /*
     if ($xslt === NULL)
        return $xml_dom->saveXML();
     else
        return $xslt->transformToXML( $xml_dom );
     */
     //print_r($pathObj);
     return $po;
 }
 public function showJSONAction()
 {
     $persona = Persona::get($this->params['id']);
     YuppLoader::load('core.persistent.serialize', 'JSONPO');
     return $this->renderString(JSONPO::toJSON($persona, true));
     //return $this->renderString( $persona->toXML(true) );
 }
 function httpTestAction()
 {
     YuppLoader::load('core.http', 'HTTPRequest');
     $url = 'http://www.imdb.com/find?s=all';
     $req = new HTTPRequest();
     $req->setTimeOut(5);
     $res = $req->HTTPRequestPost($url, array('q' => 'The+Matrix'));
     return $this->renderString($res->getBody());
 }
Exemplo n.º 4
0
 public function apply($app, $controller, $action)
 {
     YuppLoader::load('twitter.model', 'TUser');
     $user = TUser::getLogged();
     if ($user == NULL) {
         $this->flash['message'] = "Ups, you can't do that, please login...";
         return $this->redirect(array('app' => 'twitter', 'controller' => 'user', 'action' => 'login'));
     }
     return true;
 }
 public function testSaveSimple()
 {
     //Logger::getInstance()->on();
     YuppLoader::load('core.support', 'Timer');
     $timer = new Timer();
     $timer->start();
     $bot = new Botella(array("material" => "vidrio", "capacidad" => 1.5, "tapaRosca" => true));
     $this->assert($bot->save(), 'Test guardar 1 ' . print_r($bot->getErrors(), true));
     $timer->stop();
     echo 'Time: ' . $timer->getElapsedTime() . '<br/>';
     //Logger::getInstance()->off();
 }
Exemplo n.º 6
0
 /**
  * @param appControllerFiltersInstance instancia de AppControllerFilters, puede ser NULL.
  */
 public function execute($appControllerFiltersInstance)
 {
     // TODO: se le podria pasar el context como parametro porque en el llamador ya lo tengo, ahorro tener que pedirlo aca.
     $ctx = YuppContext::getInstance();
     $app = $ctx->getApp();
     $controller = $ctx->getController();
     $action = $ctx->getAction();
     // Lo que se retorna de una accion de un controller o el command de un filtro cuando falla.
     $model_or_command = NULL;
     $command = NULL;
     // Comando que voy a retornar.
     // ===================================================
     // Before y After filters para acciones de controllers
     $beforeFilters = $appControllerFiltersInstance !== NULL ? $appControllerFiltersInstance->getBeforeFilters() : array();
     $afterFilters = $appControllerFiltersInstance !== NULL ? $appControllerFiltersInstance->getAfterFilters() : array();
     $filters = new YuppControllerFilter($beforeFilters, $afterFilters);
     // FIXME: no llamar sino hay beforeFilters
     // Ejecucion de los before filters, true si pasan o un ViewCommand si no.
     $bf_res = $filters->before_filter($app, $controller, $action, $this->params);
     // ===================================================
     // Sino pasa el beforeFilter
     // ===================================================
     if ($bf_res !== true) {
         Logger::getInstance()->log("Resultado del filter NO ES TRUE!!!");
         if (!$bf_res instanceof ViewCommand) {
             throw new Exception("After filter no retorna ViewCommand, retorna " . get_class($bf_res));
         }
         $command = $bf_res;
         return $command;
     }
     // ===================================================
     // Ejecuta accion del controllador
     YuppLoader::load('core.app', 'App');
     $app = App::getCurrent();
     $command = $app->execAction($controller, $action, $this->params);
     // FIXME: no llamar sino hay afterFilters
     // ===================================================
     // after filters
     // Ejecucion de los after filters, true si pasan o un ViewCommand si no.
     $af_res = $filters->after_filter($app, $controller, $action, $this->params, $command);
     if ($af_res !== true) {
         if (get_class($af_res) !== 'ViewCommand') {
             throw new Exception("After filter no retorna ViewCommand, retorna " . get_class($af_res));
         }
         $command = $af_res;
         // Retorna el ViewCommand del after filter.
     }
     // ===================================================
     return $command;
 }
Exemplo n.º 7
0
<?php

/**
 * Clase modelo para el test M003.
 */
YuppLoader::load('tests.model.m003', 'Dedo');
class Mano extends PersistentObject
{
    function __construct($args = array(), $isSimpleInstance = false)
    {
        $this->setWithTable("test_m003_mano");
        $this->addHasMany('dedos', 'Dedo');
        // La unica diferencia con respecto al test i005
        $this->addAttribute("tamanio", Datatypes::TEXT);
        $this->addConstraints("tamanio", array(Constraint::inList(array("grande", "mediana", "chica"))));
        parent::__construct($args, $isSimpleInstance);
    }
    // Nueva para late static binding, usando solo esta se podrian borrar todas las otras operaciones
    public static function sgetClass()
    {
        return __CLASS__;
    }
}
<?php

YuppLoader::load('tests.model.dobleHasManyB', 'AClass');
class BClass extends PersistentObject
{
    function __construct($args = array(), $isSimpleInstance = false)
    {
        $this->setWithTable('test_hmb_bclass');
        $this->addAttribute('attrBClass', Datatypes::TEXT);
        $this->addHasOne('a1', 'AClass', 'rel1');
        // rel bidir con AClass.rolb1
        $this->addHasMany('a2', 'AClass', self::HASMANY_COLLECTION, 'rel2');
        // rel bidir con AClass.rolb2
        parent::__construct($args, $isSimpleInstance);
    }
    // Nueva para late static binding, usando solo esta se podrian borrar todas las otras operaciones
    public static function sgetClass()
    {
        return __CLASS__;
    }
}
<?php

/**
 * Serializa a XML instancias de PersistentObject.
 * 
 * @author Pablo Pazos Gutierrez <*****@*****.**>
 */
YuppLoader::load('core.persistent', 'PersistentObject');
class JSONPO
{
    // FIXME: loopDetection se basa en que el objeto tenga id, si no esta salvado no podria convertirlo a JSON.
    //        lo que se puede hacer es que cada objeto siempre tenga un identificador de instancia en memoria aunque no este salvado en la base.
    // http://code.google.com/p/yupp/issues/detail?id=135
    // TODO: test
    public static function toJSONArray($list = array(), $recursive = false, $attr = '', $loopDetection = NULL, $currentPath = '')
    {
        if ($loopDetection === NULL) {
            $loopDetection = new ArrayObject();
        }
        if (count($list) == 0) {
            return '[]';
        }
        $json = '[';
        // Mismo codigo que en hasMany de toJSON
        $idx = 0;
        // Se usa para la referencia por loop en la JSON path
        foreach ($list as $obj) {
            // TODO: ver si obj es PO
            if (!in_array($obj->getClass() . '_' . $obj->getId(), (array) $loopDetection)) {
                if (!empty($attr)) {
                    $json .= self::toJSON($obj, $recursive, $loopDetection, $currentPath . '.' . $attr . '[' . $idx . ']') . ', ';
<?php

YuppLoader::load('twitter.model', 'TUser');
YuppLoader::load('twitter.model', 'Message');
class MessageController extends YuppController
{
    /*
    public function indexAction()
    {
       return $this->renderString("Bienvenido a su nueva aplicacion!");
    }
    */
    /*
     * FIXME: deberia ser ajax...
     */
    public function sendMessageAction()
    {
        if (isset($this->params['doit'])) {
            $user = TUser::getLogged();
            $message = new Message($this->params);
            $message->setCreatedBy($user);
            if (!$message->save()) {
                $this->flash['error'] = 'twitter.message.sendMessage.error';
                $messages = Message::getTimeline($user);
                $this->params['messages'] = $messages;
                $this->params['user'] = $user;
                return $this->render('../user/timeline');
            }
            // go back to my timeline
            return $this->redirect(array('controller' => 'user', 'action' => 'timeline'));
        }
 public function evaluate($value)
 {
     YuppLoader::load('core.basic', 'YuppDateTime');
     return YuppDateTime::checkMySQLDateTime($value);
 }
Exemplo n.º 12
0
<?php

YuppLoader::load('tests.model.i006', 'Recipiente1');
/**
 * Clase modelo para el test I006.
 */
class Vaso1 extends Recipiente1
{
    function __construct($args = array(), $isSimpleInstance = false)
    {
        $this->setWithTable("test_i006_vaso1");
        $this->addAttribute("marca", Datatypes::TEXT);
        // TODO: seria bueno probar una Constraint de que el volumen
        // del contenido no pueda ser mayor que la capacidad del recipiente.
        $this->addHasOne("contenido", "Contenido1");
        parent::__construct($args, $isSimpleInstance);
        // WARNING:
        // para definir una restriccion sobre un atributo de la superclase,
        // debe inicializarse la superclase primero.
        $this->addConstraints("material", array(Constraint::maxLength(30), Constraint::blank(false), Constraint::inList(array("vidrio", "plastico"))));
        $this->addConstraints("marca", array(Constraint::nullable(true)));
        /*
        $this->constraints = array (
           "material" => array (
              Constraint :: maxLength(30),
              Constraint :: blank(false),
              Constraint :: inList( array("vidrio","plastico") ) // TODO: probar si se verifican estas restricciones para Vaso o si se verifican las de Recipiente...
           ),
           "marca" => array (
              Constraint :: nullable(true)
           )
Exemplo n.º 13
0
<?php

$m = Model::getInstance();
YuppLoader::load('core.mvc', 'DisplayHelper');
YuppLoader::loadScript('apps.twitter', 'Messages');
?>
<html>
  <head>
    <?php 
echo h('css', array('app' => 'twitter', 'name' => 'twitter.bootstrap'));
?>
    <style type="text/css">
      body {
        padding: 10px;
      }
      form {
         padding: 10px;
         width: 430px;
      }
      .alert {
        margin: 10px 0;
      }
      .form-actions {
        margin-bottom: 0px;
        padding-bottom: 0px;
      }
      .well .top-action {
        text-align:right;
      }
    </style>
  </head>
Exemplo n.º 14
0
<?php

YuppLoader::load('tests.model.issue37', 'BBB');
class AAA extends PersistentObject
{
    function __construct($args = array(), $isSimpleInstance = false)
    {
        $this->setWithTable('test_issue37_aaa');
        $this->addHasMany('bs', 'BBB');
        parent::__construct($args, $isSimpleInstance);
    }
    // Nueva para late static binding, usando solo esta se podrian borrar todas las otras operaciones
    public static function sgetClass()
    {
        return __CLASS__;
    }
}
Exemplo n.º 15
0
Arquivo: index.php Projeto: fkali/yupp
DateTimeZone timezone_open ( string $timezone )
date_timezone_set ( DateTime $object, DateTimeZone $timezone );
date_timezone_set( date_create('now'), timezone_open('America/Montevideo') );
*/
// ===========================================================================
// FIX: para llamadas a date() para PHP 5.2.10
//bool date_default_timezone_set ( string $timezone_identifier )
// TODO: que la timezone se especifique en la configuracion
date_default_timezone_set('America/Montevideo');
// ===========================================================================
YuppLoader::load('core.web', 'RequestManager');
YuppLoader::load('core.mvc', 'YuppController');
// Se usa en cada controlador que lo extiende.
YuppLoader::load('core.mvc', 'Helpers');
// Usado para acceder a la funcion h()
YuppLoader::load('core.utils', 'Logger');
//[SCRIPT_NAME] => /Persistent/index.php
// Dejo algunas variables globales utiles:
/*
 * Directorio base de la aplicacion, donde se encuentra EntryPoint,
 * desde el cual se pueden calcular URLs relativas y absolutisarlas
 * concatenandoles el base_dir. Necesario para el helper de links.
 */
$_base_dir = substr($_SERVER['SCRIPT_NAME'], 0, strrpos($_SERVER['SCRIPT_NAME'], '/'));
$lg = Logger::getInstance();
$lg->setFile('log.log');
$lg->on();
// TODO: considerar el language de la app
$ctx = YuppContext::getInstance();
$locale = $ctx->setLocale('en');
// Hace el request y catchea por posibles errores.
Exemplo n.º 16
0
 * $list: lista con objetos a mostrar
 * Codigo copiado de DisplayHelper.display_list
 */
$ins = new $class();
// Instancia para saber nombres de columnas...
$attrs = $ins->getAttributeTypes();
$hmattrs = $ins->getHasMany();
$ctx = YuppContext::getInstance();
$m = Model::getInstance();
$app = $m->get('app');
// Cuando se genera por la ap "core", viene "app" como parametro.
if (!isset($app)) {
    $app = $ctx->getApp();
}
// Cuando se genera por una app que no es "core"
YuppLoader::load('core.app', 'App');
$theApp = new App($app);
?>
<script type="text/javascript">
var td = null;
function callback(data, textStatus, jqXHR)
{
   //$('#content').html(data);
   td.html(data);
   // textStatus: success
   // jqXHR: XMLHttpRequest
   // alert(jqXHR.getAllResponseHeaders());
}
function before (tdid)
{
   td = $('#'+tdid);
 public function testXML()
 {
     $cara = new Cara(array("color" => "blanco", "nariz" => new Nariz(array("tamanio" => "mediana"))));
     YuppLoader::load('core.persistent.serialize', 'XMLPO');
     echo XMLPO::toXML($cara, true, true);
 }
Exemplo n.º 18
0
<?php

/**
 * @author Pablo Pazos Gutierrez (pablo.swp@gmail.com)
 */
YuppLoader::load('core.layout', 'LayoutManager');
YuppLoader::load('core.support', 'Timer');
YuppLoader::load('core', 'Yupp');
YuppLoader::load('core.support', 'YuppContext');
YuppLoader::load('core.config', 'YuppConfig');
YuppLoader::load('core.routing', 'Router');
YuppLoader::load('core.routing', 'YuppControllerFilter');
YuppLoader::load('core.routing', 'Executer');
YuppLoader::load('core.mvc', 'Model');
/*
 * Implementa el proceso y control de generacion de paginas a partir del request.
 * Proceso de urls, verificacion de permisos, ejecucion de acciones, pasarle modelo al view, render del view, etc.
 */
class RequestManager
{
    private function __construct()
    {
    }
    // El punto de entrada le envia el request como parametro (no accedo de forma global!)
    public static function doRequest()
    {
        global $_base_dir;
        // TODO: que el mostrar el tiempo de proceso sea configurable.
        //$tiempo_inicio = microtime(true);
        $timer_process = new Timer();
        $timer_process->start();
<?php

YuppLoader::load('tests.model.dirtyBit', 'Class3');
class Class2 extends PersistentObject
{
    function __construct($args = array(), $isSimpleInstance = false)
    {
        $this->setWithTable('test_dirty_bit_class2');
        $this->belongsTo = array('Class1');
        $this->addAttribute('attr21', Datatypes::TEXT);
        $this->addAttribute('attr22', Datatypes::DATE);
        $this->addAttribute('attr23', Datatypes::INT_NUMBER);
        $this->addHasOne('class3', 'Class3');
        parent::__construct($args, $isSimpleInstance);
    }
    // Nueva para late static binding, usando solo esta se podrian borrar todas las otras operaciones
    public static function sgetClass()
    {
        return __CLASS__;
    }
}
 public function getNewsFromTwitterAction()
 {
     YuppLoader::load('core.http', 'HTTPRequest');
     $req = new HTTPRequest();
     $req->setTimeOut(20);
     $res = $req->HTTPRequestGet('http://api.twitter.com/1/statuses/user_timeline.json?screen_name=ppazos&trim_user=1');
     //print_r($req);
     //print_r($res);
     if ($res->getStatus() == '200') {
         $json = $res->getBody();
     } else {
         $json = '[]';
     }
     header('Content-Type: application/json');
     return $this->renderString($json);
 }
Exemplo n.º 21
0
<?php

$m = Model::getInstance();
global $_base_dir;
YuppLoader::load('core.mvc', 'DisplayHelper');
?>
<html>
  <head>
    <?php 
echo h('js', array("name" => "jquery/jquery-1.7.1.min"));
?>
    <style>
      body {
         font-family: arial, verdana, tahoma;
         font-size: 12px;
         background-color: #efefef;
      }
      table {
         border: 1px solid #000;
         /* spacing: 0px; */
         border-collapse: separate;
         border-spacing: 0px;
      }
      th {
         border-bottom: 1px solid #ddd;
         padding: 5px;
         background-color: #ddd;
         color: #000;
         background: #fff url(<?php 
echo $_base_dir;
?>
<?php

/**
 * Clase que implementa la carga de datos en cascada. Esta clase no implementa la logica de carga, 
 * dice que funciones y en que orden se llaman a las funciones de carga del PersistentManager.
 * 
 * Created on 29/03/2008
 * Modified on 30/05/2008
 * 
 * @name core.persistent.CascadeLoadStrategy.class.php
 * @author Pablo Pazos Gutierrez <*****@*****.**>
 * @version v0.9.0
 * @package core.persistent
 * 
 */
YuppLoader::loadInterface("core.persistent", "POLoader");
class CascadeLoadStrategy implements POLoader
{
    private $manager;
    // PersistentManager
    /**
     * Se le setea el manager que tiene definidas las funciones necesarias para cargar objetos.
     * Se puede ver esto como una instancia del patron IOC.
     * @param PersistentManager $manager
     */
    public function setManager($manager)
    {
        $this->manager = $manager;
    }
    /**
     * Carga las intancias asociadas correspondientes al atributo hasMany $attr del objeto $obj ya dentro del objeto.
<?php

YuppLoader::load('core.testing', 'TestCase');
YuppLoader::load('tests.model.A004', 'Pagina');
class TestCaseA004 extends TestCase
{
    private $bot;
    public function run()
    {
        // $this->test1(); // Verifica generacion de tablas
        //$this->test2(); // Genera arbol de subpaginas para salvar en cascada
        $this->testSalvadoEnCascadaConLoop();
        // Genera p1->p2->p3->p1 con hasManys y salva p1 en cascada
        //$this->reset();
    }
    public function test1()
    {
        PersistentManager::getInstance()->generateAll();
        echo YuppConventions::tableName('Pagina') . "<br/>";
        /**
         * Resultado>
         * 
         * CREATE TABLE test_a004_pagina (id INT(11) DEFAULT 1 PRIMARY KEY, titulo VARCHAR(255) NULL, contenido MEDIUMTEXT NULL, class TEXT NOT NULL, deleted BOOL NOT NULL, owner_id INT(11) NULL);
         * 
         * CREATE TABLE test_a004_pagina_subpages_test_a004_pagina (id INT(11) DEFAULT 1 PRIMARY KEY, owner_id INT(11) NOT NULL, ref_id INT(11) NOT NULL, type INT(11) NOT NULL, deleted BOOL NOT NULL, class TEXT NOT NULL, ord INT(11) NULL);
         * 
         * ALTER TABLE test_a004_pagina_subpages_test_a004_pagina ADD FOREIGN KEY (owner_id) REFERENCES test_a004_pagina(id);
         * 
         * ALTER TABLE test_a004_pagina_subpages_test_a004_pagina ADD FOREIGN KEY (ref_id) REFERENCES test_a004_pagina(id);
         * 
         * ALTER TABLE test_a004_pagina ADD FOREIGN KEY (owner_id) REFERENCES test_a004_pagina(id);
Exemplo n.º 24
0
<?php

YuppLoader::load("core", "FileSystem");
class Logger
{
    // TODO: En lugar de solo poder apagar y prender el log, quiero poder mostrar por niveles, o sea
    //       apagar los de menos nivel y poder ver los de mas nivel, asi puedo debugear por capa o por
    //       importancia del modulo.
    private $active = false;
    private static $instance = NULL;
    // Para guardar logs en archivo.
    private $file = NULL;
    public function setFile($filename)
    {
        $this->file = $filename;
    }
    // Para guardar arbol de logs =======
    // Matrix cant. llamadas / nivel
    private $buffer = array();
    private $currentIndex = 0;
    const LEVEL_KEY_PO = "persistent_object";
    // Index 0
    const LEVEL_KEY_PM = "persistent_manager";
    // Index 1
    const LEVEL_KEY_DAL = "persistent_dal";
    // Index 2
    const LEVEL_KEY_DB = "persistent_db";
    // Index 3
    // $index que se le pasa a add.
    const LEVEL_PO = 0;
    // Index 0
Exemplo n.º 25
0
//assert_options(ASSERT_ACTIVE, 1);
//assert_options(ASSERT_WARNING, 1);
//assert_options(ASSERT_QUIET_EVAL, 1);
// Create a handler function
function my_assert_handler($file, $line, $code)
{
    echo "<hr>Assertion Failed:\r\n        File '{$file}'<br />\r\n        Line '{$line}'<br />\r\n        Code '{$code}'<br /><hr />";
}
// Set up the callback
assert_options(ASSERT_CALLBACK, 'my_assert_handler');
// ===============================================================
// EMPIEZA CODIGO DEL TEST
// ===============================================================
YuppLoader::load("tests.model.m010", "M010_Persona");
// Sin esto al hacer reload no carga DatabaseMySQL
YuppLoader::refresh();
class ModelM010Test
{
    public function runTest()
    {
        $this->test1();
        $this->test2();
        $this->test3();
    }
    private function test1()
    {
        PersistentManager::getInstance()->generateAll();
        echo YuppConventions::tableName('M010_Persona') . "<br/>";
        /**
         * Resultado>
         * 
Exemplo n.º 26
0
 /**
  * Genera una TestSuite con los TestCase definidos para esta aplicacion.
  */
 public function loadTests()
 {
     $dir = dir($this->path . '/tests');
     $testCases = array();
     // Recorre directorio de la aplicacion
     while (false !== ($test = $dir->read())) {
         //echo $test.'<br/>';
         // Se queda solo con los nombres de los directorios
         if (is_file($this->path . '/tests/' . $test) && String::endsWith($test, 'class.php')) {
             $testCases[] = $test;
         }
     }
     // Crea instancias de las clases testcase
     $suite = new TestSuite();
     foreach ($testCases as $testCaseFile) {
         $fi = FileNames::getFilenameInfo($testCaseFile);
         $clazz = $fi['name'];
         //print_r($fi);
         YuppLoader::load($fi['package'], $clazz);
         $suite->addTestCase(new $clazz($suite));
     }
     return $suite;
 }
Exemplo n.º 27
0
 /**
  * @param String appName
  * @param Array datasource puede servir para usar distintos datasources para distintas pruebas mas alla de los 3 modos de ejecucion. 
  */
 public function __construct($appName, $datasource = NULL)
 {
     Logger::getInstance()->log("DAL::construct");
     // ===============================================
     $cfg = YuppConfig::getInstance();
     // TODO: pasarle el nombre de la app actual.
     // FIXME: esto no funciona si la app es "core",
     //        y trabajo con distintas apps, por ejemplo
     //        al generar todas las tablas en las dbs.
     //        Necesito pasarle como parametro al constructor
     //        de DAL el nombre de la app para la cual quiero
     //        el datasource, y que sea PM el que obtenga el
     //        appName correcto, sea del contexto o porque genere
     //        las tablas para una app particular.
     //$ctx = YuppContext::getInstance();
     //$appName = $ctx->getApp();
     $this->appName = $appName;
     //      Logger::getInstance()->on();
     //      Logger::getInstance()->log("DAL __construct appName: $appName");
     //      Logger::getInstance()->off();
     if ($datasource == NULL) {
         $datasource = $cfg->getDatasource($appName);
     }
     // FIXME: Esto es solo para mysql y postgres =====
     $this->url = $datasource['url'];
     $this->user = $datasource['user'];
     $this->pass = $datasource['pass'];
     $this->database = $datasource['database'];
     // ===============================================
     // Constructor por configuracion del dbms
     // OBS: cada vez que agregue un soporte nuevo tengo que agregar la opcion al switch.
     // FIXME: que la configuracion use directamente los nombres de las clases de DB para ahorrar el switch.
     // TODO: deberia tener una fabrica con esto adentro, y la fabrica tal vez deberia cargar
     // las clases automaticamente en lugar de ir agregando cada tipo de conector en el switch.
     //switch( $cfg->getDatabaseType() )
     switch ($datasource['type']) {
         case YuppConfig::DB_MYSQL:
             YuppLoader::load("core.db", "DatabaseMySQL");
             $this->db = new DatabaseMySQL();
             break;
         case YuppConfig::DB_SQLITE:
             YuppLoader::load("core.db", "DatabaseSQLite");
             $this->db = new DatabaseSQLite();
             break;
         case YuppConfig::DB_POSTGRES:
             YuppLoader::load("core.db", "DatabasePostgreSQL");
             $this->db = new DatabasePostgreSQL();
             break;
         case YuppConfig::DB_SQLSRV:
             YuppLoader::load("core.db", "DatabaseSQLServer");
             $this->db = new DatabaseSQLServer();
             break;
         default:
             throw new Exception('datasource type no soportado: ' . $datasource['type']);
     }
     // TODO: que dmbs desde config, perfecto para factory pattern.
     $this->db->connect($this->url, $this->user, $this->pass, $this->database);
     // TODO: POR AHORA LOS DATOS PARA ACCEDER A LA BD SE CONFIGURAR AQUI...
 }
Exemplo n.º 28
0
 /**
  * clazz es el nombre de una clase de modelo (tambien puede ser PersistentObject).
  * Devuelve una estructura multiple con los nombres de todas las clases que heredan de clazz (hijas, nietas, etc)
  */
 public static function getAllSubclassesOf($clazz)
 {
     //echo "<h1>ModelUtils.getAllSubclassesOf $clazz</h1>";
     //Logger::struct( get_declared_classes(), "Declared classes ".__FILE__." ".__LINE__ );
     // Esto en realidad se deberia hacer con getLoadedModelClasses
     // porque ModelUtils es para resolver temas de las clases del modelo.
     //$loadedClasses = YuppLoader::getLoadedClasses();
     // Como las clases cargadas dependen de la aplicacion,
     // me ancargo de cargar todas las clases de la aplicacion
     // actual para obtener correctamente las subclases.
     // Mismo codigo que getSubclassesOf.
     $ctx = YuppContext::getInstance();
     $appName = $ctx->getApp();
     if ($appName == 'core') {
         // Si no se cargaron todas las clases y no se pasa el nombre de la app, no devuelve realmente todas las subclases, solo las que estan cargadas.
         YuppLoader::loadModel();
         // Carga el modelo de todas las aplicaciones
     } else {
         // TODO: metodo para cargar todas las clases del modelo de una aplicacion.
         $classes = array();
         // FIXME: Mismo codigo que CoreController.dbStatus
         YuppLoader::load('core.app', 'App');
         // Puede no estar cargada
         $app = new App($appName);
         $modelClassFileNames = $app->getModel();
         // Logger::struct( $modelClassFileNames, "modelClassFileNames ".__FILE__." ".__LINE__ );
         $modelClassFileNames = self::array_flatten($modelClassFileNames);
         $fn = new FileNames();
         foreach ($modelClassFileNames as $classFileName) {
             $fileInfo = $fn->getFileNameInfo($classFileName);
             YuppLoader::load($fileInfo['package'], $fileInfo['name']);
         }
     }
     $loadedClasses = YuppLoader::getLoadedModelClasses();
     $res = array();
     foreach ($loadedClasses as $loadedClass) {
         if (class_exists($loadedClass) && is_subclass_of($loadedClass, $clazz)) {
             $res[] = $loadedClass;
         }
     }
     return $res;
 }
Exemplo n.º 29
0
<?php

$m = Model::getInstance();
$users = $m->get('users');
YuppLoader::load('apps.twitter.helpers', 'THelpers');
?>
<html>
  <layout name="twitter" />
  <head>
    <style type="text/css">
      .user-result {
        width: 150px;
        display: inline-block;
        align: left;
        margin-bottom: 5px;
      }
      .user-result img {
        vertical-align: middle;
        margin-right: 5px;
      }
    </style>
  </head>
  <body>
    <div class="well">
      <legend>Search result:</legend>
        <!-- search result -->
        <?php 
foreach ($users as $user) {
    echo '<div class="user-result">';
    // TODO: template para mostrar cada usuario
    THelpers::gravatar(40, $user);
<?php

YuppLoader::load('core.testing', 'TestCase');
YuppLoader::load('tests.model.m003', 'Mano');
YuppLoader::load('tests.model.m003', 'Dedo');
YuppLoader::load('core.persistent.serialize', 'XMLPO');
YuppLoader::load('core.persistent.serialize', 'JSONPO');
class TestCaseM003 extends TestCase
{
    public function run()
    {
        $this->test1();
        $this->reset();
    }
    public function test1()
    {
        $mano = new Mano(array("tamanio" => "grande", "dedos" => array(new Dedo(array("uniaLarga" => true)), new Dedo(array("uniaLarga" => true)), new Dedo(array("uniaLarga" => false)))));
        $dedos = $mano->getDedos();
        foreach ($dedos as $dedo) {
            $dedo->setMano($mano);
        }
        //Logger::getInstance()->on();
        $this->assert($mano->save(), 'TestCaseM003: Test salvar mano y dedos ' . print_r($mano->getErrors(), true), array('mano' => print_r($mano, true)));
        //Logger::getInstance()->off();
        // Debe fallar el save porque hay datos erroneos
        $this->assert(true, 'TestCaseM003: Test generar XML ' . print_r(XMLPO::toXML($mano, true, true), true));
        $this->assert(true, 'TestCaseM003: Test generar JSON ' . print_r(JSONPO::toJSON($mano, true), true));
    }
    public function reset()
    {
        $mano = Mano::get(1);