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()); }
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(); }
/** * @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; }
<?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 . ']') . ', ';
//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.i006", "Contenido1"); YuppLoader::load("tests.model.i006", "Recipiente1"); YuppLoader::load("tests.model.i006", "Vaso1"); // Sin esto al hacer reload no carga DatabaseMySQL YuppLoader::refresh(); class ModelI006Test { public function runTest() { $this->test1(); $this->test2(); $this->test3(); } private function test1() { PersistentManager::getInstance()->generateAll(); echo YuppConventions::tableName('Contenido1') . "<br/>"; echo YuppConventions::tableName('Recipiente1') . "<br/>";
//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.i005", "Contenido"); YuppLoader::load("tests.model.i005", "Recipiente"); YuppLoader::load("tests.model.i005", "Vaso"); // Sin esto al hacer reload no carga DatabaseMySQL YuppLoader::refresh(); class ModelI005Test { public function runTest() { $this->test1(); $this->test2(); $this->test3(); $this->test4(); } private function test1() { PersistentManager::getInstance()->generateAll(); echo YuppConventions::tableName('Contenido') . "<br/>";
<?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 $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>
<?php /** * Clase modelo para el test 002. */ YuppLoader::load('tests.model.002', 'Nariz'); class Cara extends PersistentObject { function __construct($args = array(), $isSimpleInstance = false) { $this->setWithTable('test_002_cara'); $this->addAttribute('color', Datatypes::TEXT); $this->addHasOne('nariz', 'Nariz'); $this->addConstraints('color', array(Constraint::inList(array('blanco', 'negro', 'pardo')), Constraint::nullable(true))); 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__; } }
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.
<?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) )
<?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.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__; } }
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); }
<?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')); }
<?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); }
<?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();
* $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);
<?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
<?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);
/** * 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; }
// Manejador de errores de ASSERT para mostrar mensajes de error: // Active assert and make it quiet //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/>"; /**
/** * 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; }
/** * @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... }
<?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);
<?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);
public function evaluate($value) { YuppLoader::load('core.basic', 'YuppDateTime'); return YuppDateTime::checkMySQLDateTime($value); }