3. This work is licensed under a Creative Commons
Attribution‐Noncommercial‐Share Alike 3.0
The use of these slides in commercial courses or
trainings is explicitly prohibited
http://creativecommons.org/licenses/by‐nc‐sa/3.0/es/
18. ¿Dónde está el problema?
public function executeIndex(sfWebRequest $request)
{
$criteria = new Criteria();
$criteria‐>add(
JobeetJobPeer::CREATED_AT,
mejor como opción
time() ‐ 86400 * 30,
de configuración
Criteria::GREATER_THAN
);
JobeetJobPeer::doSelect($criteria);
$this‐>listado =
}
21. ¿Dónde está el problema?
Controlador (MVC)
public function executeIndex(sfWebRequest $request)
{
$criteria = new Criteria();
$criteria‐>add(
JobeetJobPeer::CREATED_AT, Modelo (MVC)
time() ‐ 86400 * 30,
Criteria::GREATER_THAN
);
JobeetJobPeer::doSelect($criteria);
$this‐>listado =
}
22. lib/model/JobeetJobPeer.php
Modelo
class JobeetJobPeer extends BaseJobeetJobPeer {
static public function getActiveJobs() {
$criteria = new Criteria();
$criteria‐>add(
self::EXPIRES_AT,
time(),
Criteria::GREATER_THAN
);
return self::doSelect($criteria);
}
}
apps/frontend/modules/job/actions/actions.class.php
Controlador
public function executeIndex(sfWebRequest $request) {
$this‐>jobeet_job_list = JobeetJobPeer::getActiveJobs();
}
23. static public function getActiveJobs()
{
$criteria = new Criteria();
$criteria‐>add(
self::EXPIRES_AT,
time(),
Criteria::GREATER_THAN
);
$criteria‐>addDescendingOrderByColumn(
self::EXPIRES_AT ORDER BY ___ DESC
);
return self::doSelect($criteria);
}
29. lib/model/JobeetJobPeer.php
class JobeetJobPeer extends BaseJobeetJobPeer {
static public function getActiveJobs($max = 10) {
$criteria = new Criteria();
$criteria‐>add( mejor en un archivo
self::EXPIRES_AT, de configuración
time(),
Criteria::GREATER_THAN
);
$criteria‐>setLimit($max);
return self::doSelect($criteria);
}
}
43. DRY (Don’t Repeat Yourself)
A process philosophy aimed at reducing
duplication, particularly in computing.
[…]
When the DRY principle is applied successfully, a modification of
any single element of a system does not change other logically‐
unrelated elements. Additionally, elements that are logically
related all change predictably and uniformly, and are thus kept
in sync.
53. elementos parciales
“trozos de código de plantilla que se
pueden reutilizar en varias plantillas”
Son iguales que las plantillas en todo salvo que
su nombre empieza por un guión bajo (_)
68. test/unit/JobeetTest.php
require_once dirname(__FILE__).'/../bootstrap/unit.php';
$t = new lime_test(6, new lime_output_color());
$t‐>comment('::slugify()');
$t‐>is(Jobeet::slugify('Sensio'), 'sensio',
'::slugify() pasa la cadena de texto a minúsculas');
$t‐>is(Jobeet::slugify('sensio labs'), 'sensio‐labs',
'::slugify() sustituye los espacios en blanco por ‐');
...
95. Crear código HTML del formulario
1.
Definir reglas de validación para los datos
2.
Procesar valores enviados por el usuario
3.
Guardar la información en la base de datos
4.
Mostrar posibles mensajes de error
5.
Volver a mostrar los datos en el formulario
6.
107. class JobeetJobForm extends BaseJobeetJobForm
{
public function configure()
{
...
$this‐>validatorSchema['type'] =
new sfValidatorChoice(array(
'choices' => array_keys(JobeetJobPeer::$types),
));
}
}
108. class JobeetJobForm extends BaseJobeetJobForm
{
public function configure()
{
...
$this‐>widgetSchema‐>setLabels(array(
'category_id' => 'Category',
'is_public' => 'Public?',
'how_to_apply' => 'How to apply?',
));
}
}
109. class JobeetJobForm extends BaseJobeetJobForm
{
public function configure()
{
...
$this‐>widgetSchema['logo'] =
new sfWidgetFormInputFile(array(
'label' => 'Company logo',
));
$this‐>validatorSchema['logo'] =
new sfValidatorFile(array(
'required' => false,
'label' => sfConfig::get('sf_upload_dir').'/jobs',
'mime_types' => 'web_images',
));
}
}
110. sfValidatorFile
Valida que el archivo subido sea una
1.
imagen
Cambia el nombre del archivo por un
2.
valor único
Guarda el archivo en la ruta indicada
3.
Actualiza el valor de la columna logo
4.
111. class JobeetJobForm extends BaseJobeetJobForm
{
public function configure()
{
...
$this‐>widgetSchema‐>setHelp(
'is_public',
'Indica si la oferta de trabajo se puede
publicar en sitios web de afiliados'
);
}
}
117. apps/frontend/modules/job/actions/actions.class.php
executeNew(sfWebRequest $request) {
public function
...
}
executeCreate(sfWebRequest $request) {
public function
...
}
executeEdit(sfWebRequest $request) {
public function
...
}
executeUpdate(sfWebRequest $request) {
public function
...
}
executeDelete(sfWebRequest $request) {
public function
...
}
processForm(sfWebRequest $request, sfForm $form)
protected function
{
...
}
131. $ symfony generate:app jobeet ‐‐escaping‐strategy=on ‐‐csrf‐secret=secreto frontend
XSS
<p>Soy un
<p>Soy un usuario
usuario
malvado</p>
malvado</p>
y voy a meter JS
y voy a meter JS
<script
<script
type=quot;text/javascript
type="text/javas
quot;>document.write(quot;Hol
cript">docume
a!quot;)</script>
nt.write("Hola!&
quot;)</script>