SlideShare a Scribd company logo
1 of 49
Download to read offline
Conociendo Bolt CMS
Asier Marqués @asiermarques
Sobre mí
Asier Marqués
@asiermarques
linkedin/in/asier
Demo
Content Types
Content Types
news:
name: News
singular_name: NewsItem
slug: news
singular_slug: news-detail
fields:
title:
type: text
class: large
slug:
type: slug
uses: title
image:
type: image
text:
type: html
height: 300px
record_template: newsitem.twig
listing_template: news.twig
Relaciones
news:
name: News
singular_name: NewsItem
fields:
[..]
relations:
authors:
multiple: false
label: Select an author
order: -id
[..]
Taxonomías
• Tags
• Categories
• Grouping
Taxonomías
tipo_motor:
slug: tipo-motores
singular_slug: tipo-motor
behaves_like: grouping
options: [ diesel, gasolina ]
Taxonomías
{% if record.taxonomy.tags is defined %}
{% for tag in record.taxonomy.tags %}
{{ tag }}<br>
{% endfor %}
{% endif %}
Menús
Menús
main:
- label: Inicio
title: Etiqueta title del menú
path: homepage
class: first
- path: entry/1
label: Artículo destacado
submenu:
- […]
Menús
{{ menu('foo', '_menu_foo.twig') }}
Rutas
Rutas por defecto
• /{content-type-plural} -> listado de contenidos
• /{content-type-singular}/{slug} -> detalle de
contenido
Rutas por defecto
/libros -> listado de contenidos de tipo libro
1. Si está configurado un archivo twig en el
listing_template para ese tipo de contenido, se usa este.
2. Si no, buscará el archivo libros.twig por convención
3. Si no, se buscará el parámetro listing_template en la
configuración general del config.yml.
4. Si no ha encontrado nada de lo anterior, utilizará el
archivo listing.twig.
Personalizando rutas
Las rutas por defecto para las páginas serían:
/pages/{slug_de_la_página}
Para que sean solamente el /slug_de_la_página configuraríamos en el routing:
ruta_de_páginas:
path: /{slug_de_la_página}
defaults:
_controller: ‘BoltControllersFrontend::record'
contenttypeslug: 'page'
contenttype: pages
Rutas personalizadas
nombre_de_la_ruta:
path: /{parameter}/
defaults:
_controller: ‘Controlador::método’
_before: 'before' # optional
_after: 'after' # optional
requirements:
parameter: required-regexp
host: hostname # optional
contenttype: contenttype # optional
Controladores por defecto
• BoltControllersFrontend::record
• BoltControllersFrontend::template
Frontend::template
pagina_estatica:
path: /about
defaults:
_controller: 'BoltControllersFrontend::template',
template: 'about'
Templates
{% include '_header.twig' %}
<article>
<h1><a href="{{ content.link }}">{{ content.title }}</a></h1>
{% if content.image!="" %}
<img src="{{ content.image|thumbnail(320, 240) }}">
{% endif %}
{{ content.body }}
Posted by {{ content.user.displayname }}
on {{ content.datecreated|date("M d, ’y")}}
</article>
{% include '_footer.twig' %}
{% for content in records %}
<h1><a href="{{ content.link }}">{{ content.title }}</a></h1>
{{ page.video.responsive }}
{{ page.geolocation.latitude }},
{{ page.geolocation.longitude }}
{% for content_related in content.related_contents %}
<h2>{{content_related.title}}</h2>
{% endfor %}
{% endfor %}
{% for content in records %}
<h1><a href="{{ content.link }}">{{ content.title }}</a></h1>
{% for image in content.slider %}
<a href="{{ image.filename|image }}">
<img src="{{ image.filename|thumbnail(100,100) }}">
</a>
{% endfor %}
{% endfor %}
Malas prácticas
Recuperar una página:
{% setcontent about = 'page/about' %}
{{ about.title }}
Recuperar las 4 últimas entradas de un contenido:
{% setcontent records = 'books/latest/5' %}
Live editor
Live Editor
En la configuración se activa con:
liveeditor: true
En Twig basta con indicar de esta forma
<h1 data-bolt-field=“title">
{{ record.title }}
</h1>
Extensiones
Crear extensión
Las extensiones se basan son personalizaciones del
Bolt Extension Starter https://github.com/bolt/bolt-
extension-starter
composer create-project --no-install bolt/bolt-extension-starter <extensión>
namespace BoltExtensionYourNameExtensionName;
use BoltApplication;
use BoltBaseExtension;
class Extension extends BaseExtension
{
public function initialize()
{
$this->addCss('assets/extension.css');
$this->addJavascript('assets/start.js', true);
}
public function getName()
{
return "ExtensionName";
}
}
Añadir un filtro para twig
function initialize(){
$this->addTwigFunction(
'EUR2USD',
'convertEuroToUSD'
);
}
//en twig
{{ number|EUR2USD }}
Añadir un html a la vista
function initialize(){
$this->addSnippet(
'endofbody',
'<!-- un código HTML -->'
);
}
Añadir un html a la vista
startofhead - after the <head>-tag.
aftermeta - after the last <meta [..] >-tag.
aftercss - after the last <link [..] >-tag.
beforejs - before the first <script [..] >-tag.
afterjs - after the last <script [..] >-tag.
endofhead - before the </head>-tag.
startofbody - after the <body>-tag.
endofbody - before the </body>-tag.
endofhtml - before the </html>-tag.
afterhtml - after the </html>-tag.
Eventos
preSave
postSave
preDelete
postDelete
Eventos
$app[‘dispatcher']->addListener(
BoltEventsStorageEvents::POST_SAVE,
‘postSaveCallback'
);
function postSaveCallback(BoltEventsStorageEvent $event){
$id = $event->getId();
invalidarCache( $id );
}
Field Types
Crear un nuevo Field Type
class Extension extends BaseExtension{
public function __construct(Application $app)
{
parent::__construct($app);
$this->app[‘config']->getFields()->addField( new ColourPickField() );
if ($this->app['config']->getWhichEnd()=='backend') {
$this->app['htmlsnippets'] = true;
$this->app['twig.loader.filesystem']->prependPath(__DIR__."/twig");
}
}
public function initialize() {
$this->addCss('assets/colourpicker.css');
$this->addJavascript('assets/colourpicker.js', true);
}
public function getName()
{
return "colourpicker";
}
}
class ColourPickField implements FieldInterface{
public function getName()
{
return 'colourpicker';
}
public function getTemplate()
{
return '_colourpicker.twig';
}
public function getStorageType()
{
return 'text';
}
public function getStorageOptions()
{
return array('default'=>'');
}
}
{% set attr_opt = {
class: field.class|default(''),
name_id: key,
required: field.required|default(false),
readonly: field.readonly|default(false)
}%}
<fieldset class="colourpicker">
<div class="col-sm-12">
<div>
<label class="control-label">{{field.label|default(key)}}</label>
</div>
<select data-colourpicker {{ macro.attr(attr_opt) }}>
{% for key, value in field.values %}
{% set isSelected = (key == context.content.get(key|capitalize)) %}
<option value=“{{key}}"
{% if isSelected %} selected="selected"{% endif %}>
{{value}}
</option>
{% endfor %}
</select>
</div>
</fieldset>
content_type:
type: colourpicker
label: “Elige un color"
values:
"#000": Negro
"#E1E1E1": Gris claro
"#444": Gris
"#FF0011": Rojo
Crear un nuevo Field Type
Servicios internos
Servicios internos
• $app[‘db’] -> Doctrine DBAL
• $app[‘mailer’] -> SwifMailer
• $app[‘logger.system’] -> Monolog
• $app[‘twig’]
Servicios internos
• $app[‘config']
• {{ dump(config.get('general/homepage_template')) }}
• $app[‘config']->get('general/homepage_template')
• $app[‘users’]
• Bolt/Users.php (Modelo de Usuarios)
i18n
i18n e i10n
• La i18n del contenido no se soporta por
defecto :(
• La i18n de la interfaz se consigue con una
extensión llamada labels https://github.com/bolt/
labels
Asier Marqués
@asiermarques
linkedin.com/in/asier
Gracias!

More Related Content

What's hot

jQuery - Javascript para quem não sabe Javascript
jQuery - Javascript para quem não sabe JavascriptjQuery - Javascript para quem não sabe Javascript
jQuery - Javascript para quem não sabe JavascriptNando Vieira
 
Introduction à Marionette
Introduction à MarionetteIntroduction à Marionette
Introduction à MarionetteRaphaël Lemaire
 
Intro to jQuery UI
Intro to jQuery UIIntro to jQuery UI
Intro to jQuery UIappendTo
 
JavascriptMVC
JavascriptMVCJavascriptMVC
JavascriptMVC4lb0
 
Php codigos interfaces fredy guzman cusihunca
Php codigos interfaces   fredy guzman cusihuncaPhp codigos interfaces   fredy guzman cusihunca
Php codigos interfaces fredy guzman cusihuncaTigger_Fred
 
Migrating Legacy Web Applications to AngularJS
Migrating Legacy Web Applications to AngularJSMigrating Legacy Web Applications to AngularJS
Migrating Legacy Web Applications to AngularJSBTI360
 
A slew of AACM 50th anniversary celebrations this weekend
A slew of AACM 50th anniversary celebrations this weekendA slew of AACM 50th anniversary celebrations this weekend
A slew of AACM 50th anniversary celebrations this weekendchicagonewsyesterday
 
Php & mysql
Php & mysqlPhp & mysql
Php & mysqlola98z
 
Working With Ajax Frameworks
Working With Ajax FrameworksWorking With Ajax Frameworks
Working With Ajax FrameworksJonathan Snook
 

What's hot (20)

Index2
Index2Index2
Index2
 
jQuery - Javascript para quem não sabe Javascript
jQuery - Javascript para quem não sabe JavascriptjQuery - Javascript para quem não sabe Javascript
jQuery - Javascript para quem não sabe Javascript
 
Wek14 mysql 2
Wek14 mysql 2Wek14 mysql 2
Wek14 mysql 2
 
Macdom html preprocesor
Macdom html preprocesorMacdom html preprocesor
Macdom html preprocesor
 
Service Workers
Service WorkersService Workers
Service Workers
 
Jquery2
Jquery2Jquery2
Jquery2
 
Get more votes!
Get more votes!Get more votes!
Get more votes!
 
Introduction à Marionette
Introduction à MarionetteIntroduction à Marionette
Introduction à Marionette
 
Intro to jQuery UI
Intro to jQuery UIIntro to jQuery UI
Intro to jQuery UI
 
JavascriptMVC
JavascriptMVCJavascriptMVC
JavascriptMVC
 
Advanced JQuery
 Advanced JQuery Advanced JQuery
Advanced JQuery
 
Php codigos interfaces fredy guzman cusihunca
Php codigos interfaces   fredy guzman cusihuncaPhp codigos interfaces   fredy guzman cusihunca
Php codigos interfaces fredy guzman cusihunca
 
Web App Mvc
Web App MvcWeb App Mvc
Web App Mvc
 
Migrating Legacy Web Applications to AngularJS
Migrating Legacy Web Applications to AngularJSMigrating Legacy Web Applications to AngularJS
Migrating Legacy Web Applications to AngularJS
 
A slew of AACM 50th anniversary celebrations this weekend
A slew of AACM 50th anniversary celebrations this weekendA slew of AACM 50th anniversary celebrations this weekend
A slew of AACM 50th anniversary celebrations this weekend
 
Add tag shortcode
Add tag shortcodeAdd tag shortcode
Add tag shortcode
 
jQuery入門
jQuery入門jQuery入門
jQuery入門
 
Index1
Index1Index1
Index1
 
Php & mysql
Php & mysqlPhp & mysql
Php & mysql
 
Working With Ajax Frameworks
Working With Ajax FrameworksWorking With Ajax Frameworks
Working With Ajax Frameworks
 

More from Asier Marqués

Desarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando SymfonyDesarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando SymfonyAsier Marqués
 
Creando Productos SaaS
Creando Productos SaaSCreando Productos SaaS
Creando Productos SaaSAsier Marqués
 
WordCamp Cantabria - Código mantenible con WordPress
WordCamp Cantabria  - Código mantenible con WordPressWordCamp Cantabria  - Código mantenible con WordPress
WordCamp Cantabria - Código mantenible con WordPressAsier Marqués
 
Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Asier Marqués
 
Ejecución de servicios digitales y negocios en Internet
Ejecución de servicios digitales y negocios en InternetEjecución de servicios digitales y negocios en Internet
Ejecución de servicios digitales y negocios en InternetAsier Marqués
 
Desarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsDesarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsAsier Marqués
 
Presentación de la plataforma abierta Ubiqarama.org
Presentación de la plataforma abierta Ubiqarama.orgPresentación de la plataforma abierta Ubiqarama.org
Presentación de la plataforma abierta Ubiqarama.orgAsier Marqués
 
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1Asier Marqués
 
Albero tech Day - De web a móvil con xamarin
Albero tech Day - De web a móvil con xamarinAlbero tech Day - De web a móvil con xamarin
Albero tech Day - De web a móvil con xamarinAsier Marqués
 
Bilbostack 2014: De web a móvil con Xamarin
Bilbostack 2014: De web a móvil con XamarinBilbostack 2014: De web a móvil con Xamarin
Bilbostack 2014: De web a móvil con XamarinAsier Marqués
 
APIs REST #devfestBilbao
APIs REST #devfestBilbaoAPIs REST #devfestBilbao
APIs REST #devfestBilbaoAsier Marqués
 
Silex para aplicaciones web MVC
Silex para aplicaciones web MVCSilex para aplicaciones web MVC
Silex para aplicaciones web MVCAsier Marqués
 
Servicios REST - PucelaTechDay
Servicios REST - PucelaTechDayServicios REST - PucelaTechDay
Servicios REST - PucelaTechDayAsier Marqués
 
Desarrollo de aplicaciones Windows8 para desarrolladores de internet
Desarrollo de aplicaciones Windows8 para desarrolladores de internetDesarrollo de aplicaciones Windows8 para desarrolladores de internet
Desarrollo de aplicaciones Windows8 para desarrolladores de internetAsier Marqués
 
BilboStack - Php en el 2012
BilboStack - Php en el 2012BilboStack - Php en el 2012
BilboStack - Php en el 2012Asier Marqués
 
4VisionsManager en WebDevBilbao
4VisionsManager en WebDevBilbao4VisionsManager en WebDevBilbao
4VisionsManager en WebDevBilbaoAsier Marqués
 
Proyectos fallidos: Rooms.fm en #webdevbilbao
Proyectos fallidos: Rooms.fm en #webdevbilbaoProyectos fallidos: Rooms.fm en #webdevbilbao
Proyectos fallidos: Rooms.fm en #webdevbilbaoAsier Marqués
 
Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Asier Marqués
 

More from Asier Marqués (20)

Desarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando SymfonyDesarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando Symfony
 
Creando Productos SaaS
Creando Productos SaaSCreando Productos SaaS
Creando Productos SaaS
 
WordCamp Cantabria - Código mantenible con WordPress
WordCamp Cantabria  - Código mantenible con WordPressWordCamp Cantabria  - Código mantenible con WordPress
WordCamp Cantabria - Código mantenible con WordPress
 
PHP en el 2015
PHP en el 2015PHP en el 2015
PHP en el 2015
 
Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Código mantenible, en Wordpress.
Código mantenible, en Wordpress.
 
Ejecución de servicios digitales y negocios en Internet
Ejecución de servicios digitales y negocios en InternetEjecución de servicios digitales y negocios en Internet
Ejecución de servicios digitales y negocios en Internet
 
Desarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsDesarrollo de Mobile Web Apps
Desarrollo de Mobile Web Apps
 
Presentación de la plataforma abierta Ubiqarama.org
Presentación de la plataforma abierta Ubiqarama.orgPresentación de la plataforma abierta Ubiqarama.org
Presentación de la plataforma abierta Ubiqarama.org
 
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
 
Albero tech Day - De web a móvil con xamarin
Albero tech Day - De web a móvil con xamarinAlbero tech Day - De web a móvil con xamarin
Albero tech Day - De web a móvil con xamarin
 
Bilbostack 2014: De web a móvil con Xamarin
Bilbostack 2014: De web a móvil con XamarinBilbostack 2014: De web a móvil con Xamarin
Bilbostack 2014: De web a móvil con Xamarin
 
APIs REST #devfestBilbao
APIs REST #devfestBilbaoAPIs REST #devfestBilbao
APIs REST #devfestBilbao
 
Silex para aplicaciones web MVC
Silex para aplicaciones web MVCSilex para aplicaciones web MVC
Silex para aplicaciones web MVC
 
Servicios REST - PucelaTechDay
Servicios REST - PucelaTechDayServicios REST - PucelaTechDay
Servicios REST - PucelaTechDay
 
Desarrollo de aplicaciones Windows8 para desarrolladores de internet
Desarrollo de aplicaciones Windows8 para desarrolladores de internetDesarrollo de aplicaciones Windows8 para desarrolladores de internet
Desarrollo de aplicaciones Windows8 para desarrolladores de internet
 
REST - deSymfony2012
REST - deSymfony2012REST - deSymfony2012
REST - deSymfony2012
 
BilboStack - Php en el 2012
BilboStack - Php en el 2012BilboStack - Php en el 2012
BilboStack - Php en el 2012
 
4VisionsManager en WebDevBilbao
4VisionsManager en WebDevBilbao4VisionsManager en WebDevBilbao
4VisionsManager en WebDevBilbao
 
Proyectos fallidos: Rooms.fm en #webdevbilbao
Proyectos fallidos: Rooms.fm en #webdevbilbaoProyectos fallidos: Rooms.fm en #webdevbilbao
Proyectos fallidos: Rooms.fm en #webdevbilbao
 
Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2
 

Introducción a Bolt