La Drupal Camp de Barcelona ya está más cerca y ya se empieza a notar el movimiento en el grupo.
Por mi parte he preparado un par de logos


y además un pequeño boceto de “como veo” el sitio en esta dirección
Son solo bocetos para empezar a tomar ideas, Miren (@merisu) de Investic se ha “currado” tambien 5 logos
Esto marcha
Pues parece ser que ya se está “aclarando” todo respecto a la próxima DrupalCamp en Barcelona, por lo pronto ya hay fechas:
Fechas: 26 (tarde) – 28 (mañana) de febrero de 2010
Lugar: Citilab de Cornellà de Llobregat
Además se ha abierto una wiki para poder colaborar con el evento
Tags: barcelona, drupalcamp, españa
Drupal, Estándares Web, Software Libre »
Hace unos días tuve un “problemilla” preparando una página con el módulo VIEWS2 de Drupal. Nunca me habia pasado, pero es que normalmente usaba Row Style->Node y modificaba la salida con Contemplate o directamente en node-tipo.tpl.php, pero para este sitio usé Row Style->Fields ya que es mucho más cómodo y rápido (estaba mal acostumbrado con VIEWS1)
El problema en cuestión es que cuando pones como link el titulo del nodo, genera un atributo “alt” dentro de la etiqueta “a” con lo cual no respeta las recomendaciones de la W3C. Menos mal que ahí esta la comunidad drupal y la gente comparte sus problemas para encontrarles solución, en este caso, a traves de este parche en el archivo modules/node/views_handler_field_node.inc de views:
--- modules/node/views_handler_field_node.inc 2009-07-20 11:46:19.000000000 +0100
+++ modules/node/views_handler_field_node_NEW.inc 2009-07-20 11:46:49.000000000 +0100
@@ -45,7 +45,6 @@ class views_handler_field_node extends v
if (!empty($this->options['link_to_node']) && $data !== NULL && $data !== '') {
$this->options['alter']['make_link'] = TRUE;
$this->options['alter']['path'] = "node/" . $values->{$this->aliases['nid']};
- $this->options['alter']['alt'] = check_plain($data);
}
return $data;
}
pd: cada vez estoy más contento de usar software libre y por supuesto de drupal
Drupal, Estándares Web, General, Personal, Software Libre »
No es que haya “desconectado” mucho la verdad, pero si que me lo he tomado con mucho “relax”, además, por un par de proyectos en los que las fuentes[tipos de letra] son importantes estoy con este post.
Siempre que me ponía a desarrollar una web, la parte a la que le daba menos importancia, era la de elegir las fuentes que usaría, siempre hacia lo mismo, titulos en gif/png (cuando era necesario) y el cuerpo en Verdana,Arial,Trebuchet (más o menos
) sin tener en cuenta ni el sistema operativo, ni el dispositivo ni nada… que equivocado estaba. Si bien, es cierto que hay unas fuentes “seguras” con el avance de los navegadores y la tecnología ese puede ya ser un problema del pasado
Hace poco me pidieron preparar un web con una fuente muy específica ( puñe… Comic Sans
) y casi todo el mundo me había dicho/habia leido que esa fuente estaba entre las seguras, y cierto es, “casi” todo el mundo la tiene… pero yo NO… empezamos mal, pensé primero en @font-face, genial, muy sencillo de implementar… pero solo para navegadores modernos. (al cliente no creo que le hubiera importado, pero a mi si
) Recorde entonces sIFR, pero el flash y yo no nos llevamos muy bien, pero gracias a una conversación en Twitter de nothnk y de lmmartin, descubri cufón, lo que estaba buscando
En drupal existe un modulo que me ha funcionado perfectamente, solo que la fuente la he tenido que poner en /sites/all/libraries/cufon-fonts ya que no me funcionaba en el directorio del theme, será porque es una beta
pd: lo mejor creo que es combinar cufón y @font-face
Ya se encuentra en la web de tractis, un enlace al componente además de una entrada en su blog
Si hace solo unos días comentaba como integrar Tractis Identity Verifications con CakePHP ahora le toca el turno a como usarlo con el componente Auth (sistema de autenticación de usuarios)
Se supone que ya está preparada todo la aplicación para el uso de Auth, solo explicaré los cambios que hay que hacer para poder usarlo con Tractis:
En la tabla de usarios hay que incluir 2 tablas más:
ALTER TABLE `users` ADD `tracdni` VARCHAR(15) NULL ;
y la tabla username (si no estaba)
ALTER TABLE `users` ADD `username` VARCHAR(250) NULL ;
El modulo tractis.php lo he modificado, incluyendo en el la validación de usuario:
function iniciar()
{
$_GET['api_key'] = API_KEY;
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $_GET);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, 'https://www.tractis.com/data_verification');
curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status==200) {
$user_data = array(
'name' => $_GET['tractis:attribute:name'],
'dni' => $_GET['tractis:attribute:dni'],
'issuer' => $_GET['tractis:attribute:issuer'],
);
return $user_data;
} else {
return false;
}
}
si no esta logeado busca el usuario con los datos recibidos de tractis en este caso he usado el dni, y si no existe lo crea nuevo con una contraseña aleatoria(__randomString) y lo autoriza
function validartractis($usuario, $auth, $tabla){
if(!$auth->user()):
$user_record =
$tabla->find('first', array(
'conditions' => array('tracdni' => $usuario['dni']),
'fields' => array('User.tracdni', 'User.username', 'User.password'),
'contain' => array()
));
if(empty($user_record)):
$user_record['tracdni'] = $usuario['dni'];
$user_record['realname'] = $usuario['name'];
$user_record['trpassword'] = $this->__randomString();
$user_record['password'] = $auth->password($user_record['trpassword']);
$tabla->create();
$tabla->save($user_record);
endif;
//change the Auth fields
$auth->fields = array('username' => 'tracdni', 'password' => 'password');
//log in the user with tractis credentials
$auth->login($user_record);
endif;
}
private function __randomString($minlength = 20, $maxlength = 20, $useupper = true, $usespecial = false, $usenumbers = true){
$charset = "abcdefghijklmnopqrstuvwxyz";
if ($useupper) $charset .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if ($usenumbers) $charset .= "0123456789";
if ($usespecial) $charset .= "~@#$%^*()_+-={}|][";
if ($minlength > $maxlength) $length = mt_rand ($maxlength, $minlength);
else $length = mt_rand ($minlength, $maxlength);
$key = '';
for ($i=0; $i<$length; $i++){
$key .= $charset[(mt_rand(0,(strlen($charset)-1)))];
}
return $key;
}
La llamada a la clase se hace desde el users_controller
function tractis()
{
$idtractis = $this->Tractis->iniciar();
if ($idtractis) {
$this->Tractis->validartractis($idtractis, $this->Auth, $this->User);
$this->set('userdata', $idtractis);
$this->redirect($this->Auth->redirect());
} else {
$this->Session->setFlash('Idenficacion no realizada');
}
}
incluyendo en el formulario (login.ctp) una llamada a la identificación
echo $form->create(null, array('url' => 'https://www.tractis.com/verifications'));
echo $form->input(null,array('type'=>'hidden', 'name'=>'api_key', 'value'=>API_KEY));
echo $form->input(null,array('type'=>'hidden', 'name'=>'notification_callback', 'value'=>URL_OK));
echo $form->submit('Identificate', array('name'=>'commit'));
// OPCIONAL: el campo public_verification es opcional
echo $form->input(null,array('type'=>'hidden', 'name'=>'public_verification', 'value'=>true));
echo $form->end();
En definitiva, el modulo completo [controllers/components/tractis.php] quedaría de la forma:
/* Constantes */
define('API_KEY', '');
define('URL_OK', '');
class TractisComponent extends Object
{
var $status;
function iniciar()
{
$_GET['api_key'] = API_KEY;
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $_GET);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, 'https://www.tractis.com/data_verification');
curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status==200) {
$user_data = array(
'name' => $_GET['tractis:attribute:name'],
'dni' => $_GET['tractis:attribute:dni'],
'issuer' => $_GET['tractis:attribute:issuer'],
);
return $user_data;
} else {
return false;
}
}
function validartractis($usuario, $auth, $tabla){
if(!$auth->user()):
$user_record =
$tabla->find('first', array(
'conditions' => array('tracdni' => $usuario['dni']),
'fields' => array('User.tracdni', 'User.username', 'User.password'),
'contain' => array()
));
if(empty($user_record)):
$user_record['tracdni'] = $usuario['dni'];
$user_record['realname'] = $usuario['name'];
$user_record['trpassword'] = $this->__randomString();
$user_record['password'] = $auth->password($user_record['trpassword']);
$tabla->create();
$tabla->save($user_record);
endif;
//change the Auth fields
$auth->fields = array('username' => 'tracdni', 'password' => 'password');
//log in the user with tractis credentials
$auth->login($user_record);
endif;
}
private function __randomString($minlength = 20, $maxlength = 20, $useupper = true, $usespecial = false, $usenumbers = true){
$charset = "abcdefghijklmnopqrstuvwxyz";
if ($useupper) $charset .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if ($usenumbers) $charset .= "0123456789";
if ($usespecial) $charset .= "~@#$%^*()_+-={}|][";
if ($minlength > $maxlength) $length = mt_rand ($maxlength, $minlength);
else $length = mt_rand ($minlength, $maxlength);
$key = '';
for ($i=0; $i<$length; $i++){
$key .= $charset[(mt_rand(0,(strlen($charset)-1)))];
}
return $key;
}
}
y el [users_controller]
class UsersController extends AppController {
var $name = "Users";
var $components = array('Tractis','Auth'); //No es necesario si se declaro en el app controller
/**
* El AuthComponent proporciona la funcionalidad necesaria
* para el acceso (login), por lo que se puede dejar esta función en blanco.
*/
function login() {
}
function tractis()
{
$idtractis = $this->Tractis->iniciar();
if ($idtractis) {
$this->Tractis->validartractis($idtractis, $this->Auth, $this->User);
$this->set('userdata', $idtractis);
$this->redirect($this->Auth->redirect());
} else {
$this->Session->setFlash('Idenficacion no realizada');
}
}
function logout() {
$this->redirect($this->Auth->logout());
}
function beforeFilter()
{
$this->Auth->allow("tractis");
parent::beforeFilter();
}
}
Teneis un ejemplo de uso aqui
Tags: Cakephp, certificado, dni electronico, tractis
El contenido este blog está bajo licencia Creative Commons (Reconocimiento - Compartir igual) - desarrollo javiermaties.com