Vistas
Ubiquity utiliza Twig como motor de plantillas por defecto (ver Documentación de Twig).
Las vistas se encuentran en la carpeta app/views. Deben tener la extensión .html para ser interpretadas por Twig.
Ubiquity también se puede utilizar con un sistema de vistas PHP, para obtener un mejor rendimiento, o simplemente para permitir el uso de php en las vistas.
Carga
Las vistas se cargan desde los controladores:
1 namespace controllers;
2
3 class Users extends BaseController{
4 ...
5 public function index(){
6 $this->loadView("index.html");
7 }
8 }
9 }
Carga de la vista por defecto
Si se utiliza el método de nomenclatura de vistas por defecto :
La vista por defecto asociada a una acción en un controlador se encuentra en la carpeta views/nombre-controlador/nombre-acción
:
views
│
└ Users
└ info.html
1 namespace controllers;
2
3 class Users extends BaseController{
4 ...
5 public function info(){
6 $this->loadDefaultView();
7 }
8 }
9 }
Carga y paso de variables
Las variables se pasan a la vista con una matriz asociativa. Cada clave crea una variable del mismo nombre en la vista.
1 namespace controllers;
2
3 class Users extends BaseController{
4 ...
5 public function display($message,$type){
6 $this->loadView("users/display.html",["message"=>$message,"type"=>$type]);
7 }
8 }
9 }
En este caso, es útil llamar a Compact para crear un array que contenga variables y sus valores :
1 namespace controllers;
2
3 class Users extends BaseController{
4 ...
5 public function display($message,$type){
6 $this->loadView("users/display.html",compact("message","type"));
7 }
8 }
9 }
Mostrar en vista
A continuación, la vista puede mostrar las variables:
<h2>{{type}}</h2>
<div>{{message}}</div>
Las variables también pueden tener atributos o elementos a los que se puede acceder.
Puede utilizar un punto (.) para acceder a los atributos de una variable (métodos o propiedades de un objeto PHP, o elementos de un array PHP), o la llamada sintaxis de «subíndice» ([]):
{{ foo.bar }}
{{ foo['bar'] }}
Funciones adicionales de Ubiquity
La variable global app
proporciona acceso a funciones predefinidas de Ubiquity Twig:
app
es una instancia deFramework
y proporciona acceso a los métodos públicos de esta clase.
Obtener la versión instalada del framework:
{{ app.version() }}
Devuelve el controlador activo y los nombres de las acciones:
{{ app.getController() }}
{{ app.getAction() }}
Devolver clases envolventes globales :
Para request:
{{ app.getRequest().isAjax() }}
Para sesión
{{ app.getSession().get('homePage','index') }}
véase Framework class in API para más información.
Carga de vistas PHP
Desactive si es necesario Twig en el archivo de configuración borrando la clave templateEngine.
Luego crea un controlador que herede de SimpleViewController
, o SimpleViewAsyncController
si usas Swoole o Workerman:
1 namespace controllers;
2
3 use Ubiquity\controllers\SimpleViewController;
4
5 class Users extends SimpleViewController{
6 ...
7 public function display($message,$type){
8 $this->loadView("users/display.php",compact("message","type"));
9 }
10 }
11 }
Nota
En este caso, las funciones para cargar assets y temas no son compatibles.
Assets
Los Assets corresponden a archivos javascript, hojas de estilo, fuentes, imágenes para incluir en tu aplicación.
Se ubican desde la carpeta public/assets.
Es preferible separar los recursos en subcarpetas por tipo.
public/assets
├ css
│ ├ style.css
│ └ semantic.min.css
└ js
└ jquery.min.js
Integración de archivos css o js :
{{ css('css/style.css') }}
{{ css('css/semantic.min.css') }}
{{ js('js/jquery.min.js') }}
{{ css('https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css') }}
{{ js('https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.js') }}
CDN con parámetros adicionales:
{{ css('https://cdn.jsdelivr.net/npm/foundation-sites@6.5.3/dist/css/foundation.min.css',{crossorigin: 'anonymous',integrity: 'sha256-/PFxCnsMh+...'}) }}
Themes
Nota
Los temas son totalmente inútiles si sólo tienes una presentación que aplicar.
Ubiquity soporta temas que pueden tener sus propios activos y vistas de acuerdo a la plantilla del tema para ser renderizados por el controlador. Cada acción del controlador puede renderizar un tema específico, o pueden utilizar el tema por defecto configurado en el archivo config.php en templateEngineOptions => array("activeTheme" => "semantic")
.
Ubiquity se entrega con 3 temas por defecto : Bootstrap, Foundation** y Semantic-UI**.
Instalar un tema
Con devtools, ejecute :
Ubiquity install-theme bootstrap
El tema instalado es uno de bootstrap, foundation o semantic.
Con webtools, puede hacer lo mismo, siempre que las devtools estén instaladas y accesibles (carpeta Ubiquity añadida en la ruta del sistema) :
Crear un nuevo tema
Con devtools, ejecute :
Ubiquity create-theme myTheme
Creación de un nuevo tema a partir de Bootstrap, Semantic…
Con devtools, ejecute :
Ubiquity create-theme myBootstrap -x=bootstrap
Con webtools :
Funcionamiento y estructura del tema
Estructura
Theme view folder
Las vistas de un tema se encuentran en la carpeta app/views/themes/theme-name.
app/views
└ themes
├ bootstrap
│ └ main
│ ├ vHeader.html
│ └ vFooter.html
└ semantic
└ main
├ vHeader.html
└ vFooter.html
La clase base controlador se encarga de cargar las vistas para definir la cabecera y el pie de cada página :
1 <?php
2 namespace controllers;
3
4 use Ubiquity\controllers\Controller;
5 use Ubiquity\utils\http\URequest;
6
7 /**
8 * ControllerBase.
9 **/
10 abstract class ControllerBase extends Controller{
11 protected $headerView = "@activeTheme/main/vHeader.html";
12 protected $footerView = "@activeTheme/main/vFooter.html";
13
14 public function initialize() {
15 if (! URequest::isAjax ()) {
16 $this->loadView ( $this->headerView );
17 }
18 }
19 public function finalize() {
20 if (! URequest::isAjax ()) {
21 $this->loadView ( $this->footerView );
22 }
23 }
24 }
Theme assets folder
Los assets de un tema se crean dentro de la carpeta public/assets/theme-name
.
La estructura de la carpeta de assets suele ser la siguiente :
public/assets/bootstrap
├ css
│ ├ style.css
│ └ all.min.css
├ scss
│ ├ myVariables.scss
│ └ app.scss
├ webfonts
│
└ img
Cambio del tema activo
Cambio persistente
activeTheme se define en app/config/config.php
con templateEngineOptions => array("activeTheme" => "semantic")
El tema activo puede cambiarse con devtools :
Ubiquity config:set --templateEngineOptions.activeTheme=bootstrap
También puede hacerse desde la página de inicio, o con webtools :
Desde la página de inicio:
Desde Webtools
Este cambio también puede hacerse en tiempo de ejecución :
Desde un controlador :
ThemeManager::saveActiveTheme('bootstrap');
Cambio local no persistente
Para establecer un tema específico para todas las acciones dentro de un controlador, el método más sencillo es anular el método initialize del controlador :
1 namespace controllers;
2
3 use \Ubiquity\themes\ThemesManager;
4
5 class Users extends BaseController{
6
7 public function initialize(){
8 parent::intialize();
9 ThemesManager::setActiveTheme('bootstrap');
10 }
11 }
O si el cambio sólo debe afectar a una acción :
1 namespace controllers;
2
3 use \Ubiquity\themes\ThemesManager;
4
5 class Users extends BaseController{
6
7 public function doStuff(){
8 ThemesManager::setActiveTheme('bootstrap');
9 ...
10 }
11 }
Cambio de tema condicional, independientemente del controlador :
Ejemplo con una modificación del tema en función de una variable pasada en la URL
1use Ubiquity\themes\ThemesManager;
2use Ubiquity\utils\http\URequest;
3
4...
5
6ThemesManager::onBeforeRender(function(){
7 if(URequest::get("th")=='bootstrap'){
8 ThemesManager::setActiveTheme("bootstrap");
9 }
10 });
Compatibilidad con dispositivos móviles
Añadir una herramienta de detección de dispositivos móviles.
|nstalación de MobileDetect:
composer require mobiledetect/mobiledetectlib
En general, es más fácil crear vistas diferentes por dispositivo.
Crear un tema específico para la parte móvil (creando una carpeta views/themes/mobile
y poniendo en ella las vistas específicas para dispositivos móviles).
Es importante en este caso utilizar los mismos nombres de archivo para la parte móvil y la parte no móvil.
También es aconsejable en este caso que todas las cargas de vistas utilicen el espacio de nombres @activeTheme:
$this->loadView("@activeTheme/index.html");
index.html debe estar disponible en este caso en las carpetas views
y views/themes/mobile
.
Detección global de móviles (desde services.php)
1use Ubiquity\themes\ThemesManager;
2
3...
4
5ThemesManager::onBeforeRender(function () {
6 $mb = new \Mobile_Detect();
7 if ($mb->isMobile()) {
8 ThemesManager::setActiveTheme('mobile');
9 }
10});
Detección de configuración regional (desde un controlador)
1use Ubiquity\themes\ThemesManager;
2
3...
4
5 public function initialize() {
6 $mb = new \Mobile_Detect();
7 if ($mb->isMobile()) {
8 ThemesManager::setActiveTheme('mobile');
9 }
10 parent::initialize();
11 }
Vista y carga de assets
Vistas
Para cargar una vista desde la carpeta activeTheme, puede utilizar el espacio de nombres @activeTheme :
1 namespace controllers;
2
3 class Users extends BaseController{
4
5 public function action(){
6 $this->loadView('@activeTheme/action.html');
7 ...
8 }
9 }
Si el activeTheme es bootstrap, la vista cargada es app/views/themes/bootstrap/action.html
.
DefaultView
Si sigues el modelo de nomenclatura de vistas de Ubiquity, la vista cargada por defecto para una acción en un controlador cuando un tema está activo es : app/views/themes/theme-name/controller-name/action-name.html
.
Por ejemplo, si el activeTheme es bootstrap, la vista por defecto para la acción display en el controlador Users debe estar localizada en app/views/themes/bootstrap/Users/display.html
.
1 namespace controllers;
2
3 class Users extends BaseController{
4
5 public function display(){
6 $this->loadDefaultView();
7 ...
8 }
9 }
Nota
Los comandos devtools para crear un controlador o una acción y su vista asociada utilizan la carpeta @activeTheme si hay un tema activo.
Ubiquity controller Users -v
Ubiquity action Users.display -v
Carga de assets
El mecanismo es el mismo que para las vistas: el espacio de nombres @activeTheme
hace referencia a la carpeta public/assets/theme-name/
.
{{ css('@activeTheme/css/style.css') }}
{{ js('@activeTheme/js/scripts.js') }}
{{ img('@activeTheme/img/image-name.png', {alt: 'Image Alt Name', class: 'css-class'}) }}
Si el tema bootstrap está activo, la carpeta de activos es public/assets/bootstrap/
.
Compilación css
Para Bootstrap o foundation, instala sass:
npm install -g sass
A continuación, ejecute desde la carpeta raíz del proyecto:
Para bootstrap:
ssass public/assets/bootstrap/scss/app.scss public/assets/bootstrap/css/style.css --load-path=vendor
Para la fundation:
ssass public/assets/foundation/scss/app.scss public/assets/foundation/css/style.css --load-path=vendor