lunes, 8 de julio de 2013

YII – Mostrar nombre en vez de ID en Foreign Key

En YII Podemos definir en el modelo lo que es llaves foráneas, esta vez, no explicaré mucho el proceso, producto que, si está definido el modelo de la base de datos, Yii lo tomará automáticamente, por ejemplo, si trabajamos con MySQL y motor InnoDB, y creamos todas las relaciones necesarias, para finalmente crear el modelo con GII, podemos ver una función como la siguiente en el modelo.
public function relations()
{
 // NOTE: you may need to adjust the relation name and the related
 // class name for the relations automatically generated below.
 return array(
  'idcliente0' => array(self::BELONGS_TO, 'Cliente', 'idcliente'),
  'idempleados0' => array(self::BELONGS_TO, 'Empleados', 'idempleados'),
  );
}

Está vez, utilizaré un ejemplo de Empleado, Cliente y Atención, en donde en Atención, se guardará la atención que hace el empleado al cliente, por lo cual, está tiene las llaves foráneas de los ID tanto de empleado como cliente.

Como podemos ver, en el modelo, está la función relations(), aquí tenemos un array con elementos, en este caso, los elementos que nombra las relaciones son:

  • idcliente0
  • idempleados0

Estos son los que debemos utilizar en la vista, en este caso, haré un ejemplo de como hacerlo en la vista admin.

En la vista admin, encontraremos lo siguiente:

widget('zii.widgets.grid.CGridView', array(
 'id'=>'atencion-grid',
 'dataProvider'=>$model->search(),
 'filter'=>$model,
 'columns'=>array(
  'idatencion',
  'hora',
  'motivo',
  'comentario',
  'idcliente',
  'idempleados',
  array(
   'class'=>'CButtonColumn',
  ),
 ),
)); 
?>
Por lo cual 'idcliente' y 'idempleados' lo debemos reemplazar y dejar de la siguiente forma:


widget('zii.widgets.grid.CGridView', array(
 'id'=>'atencion-grid',
 'dataProvider'=>$model->search(),
 'filter'=>$model,
 'columns'=>array(
  'idatencion',
  'hora',
  'motivo',
  'comentario',
  array(
   'name'=>'idcliente',
   'value'=>'$data->idcliente0->nombres',
  ),
  array(
   'name'=>'idempleados',
   'value'=>'$data->idempleados0->nombre',
  ),
  array(
   'class'=>'CButtonColumn',
  ),
 ),
)); 
?>;

Como podemos ver, eliminados lo necesario, y agregamos un array, el cual tiene el nombre, y valor. En valor indicamos 

$data->NOMBRE-RELACION->CAMPO-A-MOSTRAR

domingo, 7 de julio de 2013

Debian – Instalar Virtualbox

Está vez, explicaré la forma de instalar Virtualbox en Debian Wheey. Virtualbox, según wikipedia:

“Oracle VM VirtualBox es un software de virtualización para arquitecturas x86/amd64, creado originalmente por la empresa alemana innotek GmbH. Actualmente es desarrollado por Oracle Corporation como parte de su familia de productos de virtualización. Por medio de esta aplicación es posible instalar sistemas operativos adicionales, conocidos como «sistemas invitados», dentro de otro sistema operativo «anfitrión», cada uno con su propio ambiente virtual.

Entre los sistemas operativos soportados (en modo anfitrión) se encuentran GNU/Linux, Mac OS X, OS/2 Warp , Microsoft Windows, y Solaris/OpenSolaris, y dentro de ellos es posible virtualizar los sistemas operativos FreeBSD, GNU/Linux, OpenBSD, OS/2 Warp, Windows, Solaris, MS-DOS y muchos otros.”

Para su instalación, tenemos 2 opciones, la primera es descargar el fichero .deb (versión 64 bits)

$ wget http://download.virtualbox.org/virtualbox/4.2.16/virtualbox-4.2_4.2.16-86992~Debian~wheezy_amd64.deb

y luego instalarlo:

$ sudo aptitude install libqt4-opengl
$ sudo dpkg -i virtualbox-4.2_4.2.16-86992~Debian~wheezy_amd64.deb
$ sudo aptitude install dkms

De lo contrario, podemos instalarlo desde los repositorios, de la siguiente forma: 

Agregar a nuestro sources.list lo siguiente:

deb http://download.virtualbox.org/virtualbox/debian wheezy contrib

Ahora, instalamos su public key

wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -

Luego de eso, debemos hacer un update

$ sudo aptitude update

Ahora instalamos Virtualbox, en mi caso, la última versión es la 4.2

$ sudo aptitude install virtualbox-4.2 dkms

Teniendo instalado virtualbox, es bueno instalar “VirtualBox 4.2.16 Oracle VM VirtualBox Extension Pack” desde https://www.virtualbox.org/wiki/Downloads Una vez descargado, abrimos Virtualbox, nos vamos a “Archivo → Preferencias → Extensiones” y seleccionamos el fichero descargado.

Con esto, ya tenemos todo listo para poder crear nuestra máquina virtual. Si al ir a las configuraciones de la máquina virtual creada tenemos el error “Fallo al acceder al subsistema USB” debemos:

Cerrar Virtualbox

Editar /etc/fstab

$ sudo nano /etc/fstab

Agregar lo siguiente:

#usbfs
none /proc/bus/usb usbfs devgid=46,devmode=664 0 0

Montamos todo

$ sudo mount -a

Ahora abrimos Virtualbox y ya no tendremos ese problema

domingo, 30 de junio de 2013

Yii – incorporar MBMenu

CBMenu, es una extensión que nos permite tener nuestro menú estilo “Drop Down Menú”, lo cual le da un aspecto más amigable si es que necesitamos muchos menús, y también, nos ayuda a que sea menos invasivo para la vista.

Lo primero que debemos hacer es descargar MBMenu desde

http://www.yiiframework.com/extension/mbmenu/

Luego lo debemos descomprimir e incorporar en nuestro proyecto en el directorio /protected/extensions

*Como recomendación, al menos yo lo hago así, copio mbmenu.css al directorio /css/

Ahora, debemos modificar nuestra vista /protected/views/layouts/main.php. Aquí nos encontraremos con un DIV con id=”mainmenu”, este es el que debemos modificar, y podemos generar algo como lo siguiente

widget('application.extensions.mbmenu.MbMenu',array( 'items'=>array( array('label'=>'Home', 'url'=>array('/site/index')), array( 'label'=>'Usuarios', 'items'=>array( array('label'=>'Administrar Usuarios','url'=>array('empleados/admin')), array('label'=>'Crear Usuarios','url'=>array('empleados/create')), ), ), ) )); ?>

Si nos fijamos bien, tenemos un arreglo con label Usuarios, y este arreglo tiene “items”, los cuales son otros arreglos, pero cada uno de estos, es un sub-menú, que son los que nos aparecerán al pasar el mouse sobre su menú padre.

Para que nos tome el css, en el mismo main.php, debemos incorporarlo, de la siguiente forma:

sábado, 29 de junio de 2013

Yii - Error Gii Unable to write the file

Es muy probable que en el momento de querer utilizar Gii para generar nuestro código, nos aparezca un error que es que no nos permite escribir el fichero. Esto es un tema netamente de permisos.

Para solucionar este problema, debemos dejar a nuestro usuario y grupo apache como propietario, en las diferentes versiones de Linux, puede cambiar un poco su nombre, puede ser apache2, www-data, etc. En el caso de Debian, es www-data, y es donde utilizaré el ejemplo. Debemos escribir lo siguiente:

$ sudo chown www-data:www-data /ruta/al/directorio/ -R

miércoles, 19 de junio de 2013

YII – Visualizar o descargar imágenes desde CDetailView

CdetailView es lo que al menos, por defecto, nos muestra la información de nuestro modelo a través de index.php. Si vemos este fichero, nos encontraremos con un arreglo parecido a este:

widget('zii.widgets.CDetailView', array(
 'data'=>$model,
 'attributes'=>array(
  'idusuario',
  'usuario',
  'password',
  'avatar',
 ),
)); ?>


Aquí nos mostrará los datos respecto, pero si por ejemplo, en avatar, no queremos mostrar la ruta, nombre de la imagen, etc. Y queremos mostrar la imagen o permitir descargarla, debemos cambiar ese valor, por lo siguiente:

Para visualizarla

array(
 'label'=>'avatar',
 'type'=>'raw',
 'value'=> Chtml::image(Yii::app()->baseUrl.'/images/' . $model->avatar),
),


Para descargarla

array(
 'label'=>'avatar',
 'type'=>'raw',
 'value'=> Chtml::link(Yii::app()->baseUrl.'/images/' . $model->avatar),
),


La gran diferencia está entre Chtml::image y Chtml:link. Quedando más o menos de la siguiente manera
widget('zii.widgets.CDetailView', array(
 'data'=>$model,
 'attributes'=>array(
  'idusuario',
  'usuario',
  'password',
  array(
   'label'=>'avatar',
   'type'=>'raw',
   'value'=> Chtml::link(Yii::app()->baseUrl.'/images/' . $model->avatar),
  ),
 ),
)); ?>

YII - Adjuntar (subir) fichero a través de un formulario

Algo que necesité al trabajar con YII, fue el tener que adjuntar un fichero en un formulario, ya que, era un sistema en el cual debía adjuntar una fotocopia (imagen) de su carnet de identidad (también conocido como DNI).

Para lograr esto, debemos abrir nuestro proyecto, y haber creado el CRUD, con esto, se nos genera “/protected/views/<nombre-elegido>/_form.php”. Dentro de este archivo veremos un segmento como el siguiente:


beginWidget('CActiveForm', array(
 'id'=>'empleados-form',
 'enableAjaxValidation'=>false,
)); ?>

Aquí simplemente debemos agregar una línea, quedan de la siguiente forma

beginWidget('CActiveForm', array(
 'id'=>'empleados-form',
 'enableAjaxValidation'=>false,
        'htmlOptions'=>array('enctype'=>'multipart/form-data'),
)); ?>

Luego, dentro del mismo fichero, debemos agregar la siguiente línea (la ubicación es a gusto).



Finalmente, nos toca la parte entretenida, y es que vamos a modificar el controlador. Aquí debemos trabajar con las funciones “actionCreate” y “actionUpdate”. En el ejemplo trabajaré con “actionCreate”, pero se debe agregar lo mismo en “actionUpdate”. Nuestro método viene por default de la siguiente forma.

public function actionCreate($id)
{
$model=$this->loadModel($id);

if(isset($_POST['Cliente']))
{
 $model->attributes=$_POST['Cliente'];
 
 if($model->save()){
     $this->redirect(array('view','id'=>$model->idcliente));
 }
}

$this->render('update',array(
 'model'=>$model,
));
}

He quitado una líneas que vienen comentadas. Debemos darnos cuenta que en este caso el nombre del modelo es “Cliente”, y su id  y primary key, es idcliente.

Lo que debemos hacer es agregar lo siguiente:

$model->fotocopiacarnet=CUploadedFile::getInstance($model,'image');
$model->fotocopiacarnet->saveAs('/path/' . CuploadedFile::getInstance($model,'image')->name);

En donde: 
  • fotocopiacarnet es el campo (columna) de la base de datos, donde guardará el path del carnet.
  • /path/ es la ruta donde dejamos las imagenes, por ejemplo, en mi caso es: /home/nicolas/public_html/proyectoYII/images/
En resumen, nos quedaría algo parecido a esto:

public function actionCreate()
{
 $model=new Cliente;

 if(isset($_POST['Cliente']))
 {
  $model->attributes=$_POST['Cliente'];
  $model->fotocopiacarnet=CUploadedFile::getInstance($model,'image');
   
  if($model->save()){
   $model->fotocopiacarnet->saveAs('/proyectoYII/images/' . CUploadedFile::getInstance($model,'image')->name);
  
   $this->redirect(array('view','id'=>$model->idcliente));
  }
 }

 $this->render('create',array(
  'model'=>$model,
 ));
}

Debemos tener en cuenta que “if($model->save())” por defecto no viene con { }, esto es debido a que por regla, cuando el if tiene sólo una línea de ejecución, no son necesario, pero como ahora tienen 2 líneas, es necesario hacerlo.

sábado, 1 de junio de 2013

Integración Netbeans con YII Framework

La verdad es que por experiencia propia, es mucho más rápido configurar el Framework en Linux que en Windows. Actualmente mi IDE para desarrollar es Netbeans, es el cual más tiempo he tenido desarrollando, por lo que debido a esto es que he necesitado configurarlo.

Lo primero que debemos hacer es escargar el framework YII desde su  página web http://www.yiiframework.com/download/ y luego descomprimir el fichero descargado

Si lo hacemos a través de consola debemos hace consola, debemos hacer lo siguiente:

$ wget http://yii.googlecode.com/files/yii-1.1.13.e9e4a0.tar.gz
$ tar -xvf yii-1.1.13.e9e4a0.tar.gz

Ahora debemos ir al menú “Tool → Option” y dentro de este ir a “PHP → General”, aquí debemos especificar la ruta de nuestro interprete de PHP5, normalmente lo está, pero si no es así, debemos agregarlo (/usr/bin/php).



Luego debemos especificar Yii, para esto nos vamos al Menú YII, en donde veremos “YII Script”, aquí debemos elegir la carpeta donde está el script que venía en el fichero descargado de YII, ej: /yii-1.1.13.e9e4a0/framework/yiic.php

Para el caso de Windows, quizás sea necesario especificar las variables de entorno del sistema.

Activar acceso SSH en Hostgator

Si bien es cierto, mucha experiencia en variedad de hosting no tengo, pero Hostgator es uno de los mejores que he probado, entre el crucé de Precio/Calidad. 

Personalmente, por las labores que realizo, algo escencial para mi, es que tenga acceso SSH, por lo que obviamente al momento de elegir el hosting, este fue un tema.

Para activar el sistema SSH, en primer lugar debemos ingresar a nuestro panel de control, con nuestro usuario y contraseña. Una vez dentro de este, debemos ingresar a la sección “HostGator Links” y luego a “Billing System”


Después de esto debemos ingresar nuestro correo y contraseña para ingresar al sistema (esta contraseña no es la misma que la del cpanel). Una vez en el sistema, debemos irnos a “Hosting Packages” y luego en “View Hosting Packages”



Luego nos mostrará una ventana, en el cual debemos hacer clic en “Enable Shell Access” con el cual habilitamos el acceso SSH.


Para ingresar vía SSH, debemos utilizar nuestro nombre de usuario y contraseña del CPanel, además, debemos utilizar la ip o host de nuestro dominio, y utilizar el puerto 2222.


Si queremos tener usuario enjaulado, por ejemplo utilziado en el caso de los Reseller, debemos pagar $10USD por usuario.svn+ssh://50.87.144.35/home3/normeno/public_html/prototipoUFP

Linux - Forma fácil de instalar y jugar Diablo III

La verdad es que prácticamente el tiempo no me da para jugar, pero existen algunos juegos que la verdad son una obsesión para mi (The Legend Of Zelda, Diablo, Final Fantasy, Lineage II), los cuales de verdad he pasado bastantes horas jugandolos, ahora cada vez que tengo un poco tiempo, juego Diablo III, uno de los juegos más esperados por muchos, como es obvio, iba a intentar instalar en Linux, para lo cual, al menos yo conozco 3 formas de poder instalarlo:

1. Wine
2. PlayOnLinux
3. CrossOver

Tanto PlayOnLinux como CrossOver, están basados en Wine, la diferencia es que estos traen parches y pre-configuraciones ya hechas, por lo que es más simple la instalación. CrossOver es de pago, por lo que quedo descartado, mi elección estaba entre Wine y PlayOnLinux, en vista del tiempo me fuí por lo más sencillo, PlayOnLinux, para instalarlo en Debian, hacemos lo siguiente:

Agregamos el repositorio a nuestro sources.list
# echo "deb http://deb.playonlinux.com/ squeeze main" >> /etc/apt/sources.list
Ahora instalamos su key
# wget -q "http://deb.playonlinux.com/public.gpg" -O- | apt-key add -
Actualizamos
# aptitude update
Instalamos PlayOnLinux
# aptitude install playonlinux
Ahora que ya tenemos instalado PlayOnLinux, recomiendo añadir nuestro usuario a sudores, ya que al menos más adelante me fue necesario, para hacer esto deben:
echo "usuario ALL=(ALL:ALL) ALL" >> /etc/sudoers
Donde “usuario” es el nombre de su usuario. Añadir su usuario a sudoers es para que puedan ejecutar sentencias con privilegios de root solamente anteponiendo la palabra sudo a la instrucción.

Ya con todo lo pre-requerido, abrimos PlayOnLinux y hacemos click en instalar.

Una vez dentro de esto, nos vamos a la sección Juegos y buscamos Diablo III.



Una vez hecho esto, simplemente click en “Instalar”, luego (como es en mi caso) seleccionamos donde esta montado el dvd del juego, en mi caso fue cdrom0 (aquí fue donde me daba problemas al no tener mi usuario en sudoers),y aquí es simplemente lo conocido como “siguiente, siguiente, siguiente”.

Se nos abrirá la venta de diablo, y comenzaremos la instalación como se ve en la siguiente imágen


Ahora es cosa de esperar que termine la instalación, una vez terminada la instalación nos pedirá denuevo ingresar la contraseña de root para trabajar con sudo, ya finalizado todo, nos aparecerá un mensaje de agradecimiento y una alerta que dice:
“Si obtienes Error 3007 en conexión, desde una terminal ejecute:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope”
Ahora abrimos nuevamente PlayOnLinux y notaremos que está Diablo III instalado


Simplemente le hacemos click en lanzar y empezará a correr el juego, ojo, click en “lanzar” en el que está a mano derecha, porque al menos a mi si le doy click en lanzar en el que está en al parte superior, me sale el menú de instalación no de jugar, haciendo todo lo anterior correctamente, comenzará a actualizar y luego verán esta pantalla.



Cabe destacar que al parecer con una tarjeta de vídeo Intel no sé puede jugar decentemente, ya que he probado con una nvidia y se ha logrado, pero con una Intel, los colores se ven sumamente bajos y hay demasiado lag.

Netbeans – Proyecto GIT con BitBucket


Últimamente por temas de estudios, he tenido que realizar un desarrollo de software que durará 10 meses aprox, debido a que era un proyecto para una municipalidad, y el trabajo era con un compañero de clases, tuve que buscar la opción para facilitar el desarrollo colaborativo, pero que el código no fuera público. En un comienzo pensé en un hosting, luego en Dropbox + SVN, no quise ocupar una herramienta como Google Code, SourceForge, etc. Ya que el proyecto no podía ser público, lo descarte. Luego dí con una opción que me gustó bastante, esta opción fue https://bitbucket.org Este nos permité crear proyecto privados. Lo primero que debemos hacer es ingresar y hacernos una cuenta, teniendo la cuenta creada, debemos crear un equipo




Aquí simplemente debemos completar los datos que nos piden y crearlo, la parte importante, es la cual podemos invitar a un usuario a participar del equipo.



Con esto ya tenemos listo todo lo necesario en BitBucket (recordar confirmar cuenta de correo). Ahora nos pasamos a Netbeans, en primero lugar debemos instalar todo lo necesario para GIT, para esto nos vamos a Tools → Plugins y buscamos el plugin de GIT



Ahora creamos un proyecto como normalmente lo haríamos. Acto seguido nos vamos a “Team -> Git -> Initialize”. Aquí nos proguntará por el directorio del proyecto a trabajar, debemos seleccionar el nuestro y listo.

Después hacemos clic derecho en el proyecto y nos vamos a Git → Remote → Push, en la ventana seleccionamos “Specify Git Repository Location” y en la URL, debemos colocar nuestra url en la forma de https://bitbucket.org/<nombre_equipo>/<nombre_repositorio> 


Finalmente ingresamos nuestro usuario y contraseña y ya lo tendremos listo para trabajar. Podemos ver que se esté creando todo perfecto ingresando a nuetro repositorio, y veremos que ya hay ficheros en él.

Para poder ir subiendo los archivos, debemos primero hacer un push, y luego realizar el commit correspondiente.