viernes, 26 de febrero de 2010

Instalar Symfony en Windows Vista (con XAMPP)

Siempre he dicho que Windows Vista es malo, y aún lo es. Sin embargo, estos días he estado probando la versión 64bits y, como estoy desarrollando un par de sitios en Symfony, me vi en la obligación de instalarlo. Al principio no fue facil, pero luego de revisar un par de tutoriales, y rescatar lo mejor de cada uno, logré hacerlo de la siguiente forma.
Primero, instalar el servidor web Apache/PHP/MySQL. Para esta ocasión use XAMPP, el cual se puede descargar aquí. Después de instalarlo los pasos para hacer que Symfony ande son los siguientes:

Instalación de Pear

  1. Ir a la consola de comandos. Menú inicio -> Ejecutar -> cmd
  2. Ir a la carpeta de php: cd c:xamppphp
  3. Ejecutar el instalador/configurador de Pear con el comando go-pear.bat


  4. Preguntara si es una copia local. Sólo presionar ENTER


  5. Mostrará una lista de directorios de pear. Presionar ENTER


  6. Se creara el archivo PEAR_ENV.reg en c:xamppphp, el cual debemos ejecutar y confirmar la operación como administrador.


  7. Se habra creado (también en c:xamppphp) el archivo pear.bat. Debemos copiarlo y pegarlo en c:windowssystem32.


  8. Para comprobar que se ha instalado correctamente, ejecutamos el comando pear config-show desde cualquier ubicación, donde mostrará la configuración actual. Si no aparecen errores, todo ok hasta aquí y tenemos Pear instalado.

Instalación de Symfony

  1. En la consola de comandos (Inicio -> Ejecutar -> cmd) agregamos el ‘channel’ de Symfony en Pear ejecutando pear channel-discover pear.symfony-project.com.


  2. Instalar Symfony con el comando pear install symfony/symfony.


  3. Si todo va bien se creará el archivo symfony.bat en c:xamppphp, el cual debemos copiar y pegar en c:windowssystem32 (al igual que con pear.bat).


  4. Como estamos cambiando la ruta desde donde se accede, hay que modificar el symfony.bat que esta en la carpeta system32 para que funcione. Las modificaciones son las siguientes:
     

Esta es otra configuración
 @echo off
rem *************************************************************
rem ** symfony CLI for Windows based systems (based on phing.bat)
rem *************************************************************
rem This script will do the following:
rem - check for PHP_COMMAND env, if found, use it.
rem   - if not found detect php, if found use it, otherwise err and terminate
if "%OS%"=="Windows_NT" @setlocal
rem %~dp0 is expanded pathname of the current script under NT
set SCRIPT_DIR="C:\php\" aqui cambie la ruta de mi php 
goto init
:init
if "%PHP_COMMAND%" == "" goto no_phpcommand
if "%SCRIPT_DIR%" == "" (
  %PHP_COMMAND% "symfony" %*
) else (
  %PHP_COMMAND% "%SCRIPT_DIR%\symfony" %*
)
goto cleanup
:no_phpcommand
rem echo ------------------------------------------------------------------------
rem echo WARNING: Set environment var PHP_COMMAND to the location of your php.exe
rem echo          executable (e.g. C:\PHP\php.exe).  (assuming php.exe on PATH)
rem echo ------------------------------------------------------------------------
set PHP_COMMAND=C:\php\php.exe aqui tambien cambie la ruta de php.exe 
goto init
:cleanup
if "%OS%"=="Windows_NT" @endlocal
rem pause
  1. Si todo esta bien, al ejecutar el comando symfony desde cualquier ubicacion deberiamos encontrar la lista de comandos, como muestra la siguiente imagen.


  2. Tambien se debe instalar el paquete phing, con el comando pear install phing/phing
  3. Es imporante actualizar pear y todos los paquetes que dependen de el. Para esto basta con ejecutar el comando pear upgrade-all
  4.  Notas: para el problema de instalacion de phing primero debes ejecutar :
    pear channel-discover pear.phing.info
    y luego
    pear install phing/phing
  5. Con todo esto ya tenemos instalado symfony en nuestro PC.

Configuracion de Virtual Host en apache.

Es muy util, cuando desarrollamos distintos proyectos, que cada uno funcione de forma independiente. Esto es sencillo gracias a los vhosts de apache. Para configurar, seguir los siguientes pasos:
  1. Abrir el archivo de configuracion de vhosts de apache, el cual esta en c:xamppapacheconfextrahttpd-vhosts.conf.
  2. Descomentar la linea que dice ##NameVirtualHost *:80 quedando sólo NameVirtualHost *:80


  3. Agregar los permisos para la carpeta de symfony sf.


  4. Para cada proyecto agregar el virtual host de la siguiente forma.


  5. Al guardar los cambios, hay que reiniciar el servidor apache para que tengan efecto. Para esto ir al panel de control de XAMPP, detener apache, e iniciarlo nuevamente.
  6. Finalmente, para que el navegador nos reconozca la ruta a nuestro virtual host, respondiendo a la dirección http://nombreproyecto (lo que pusimos en la opcion ServerName del virtual host) debemos editar el archivo hosts que esta en c:windowssystem32driversetchosts, por supuesto como Administrador.


  7. Si todo va bien, al guardar los cambios ya podremos acceder a nuestro proyecto a través del navegador con la direccion http://nombreproyecto.
Este pequeño how-to esta pensado en alguien que conoce el funcionamiento de windows, servidores web, php y sabe que es y para que sirve Symfony. Cualquier error o agregado es bien recibido.

 Post Original tomado de http://davidvega.net/2008/04/26/instalar-symfony-en-windows-vista-con-xampp/

Este manual tambien sirve para instalar symfony sin xampp, solo debes cambiar las rutas donde está php.

viernes, 19 de febrero de 2010

Google - moreplusplus - Scrip para greasemonkey

// ==UserScript==
// @author jazdian
// @version 1.0.0
// @namespace http://programadoresmx.blogspot.com/
// @description Google - Agrega un link al menu de google, con un submenu con links a paginas web reconocidas.
// @name moreplusplus
// @namespace http://programadoresmx.blogspot.com/
// @include http://www.google.tld/webhp?*
// @include http://www.google.tld/search?*
// @include http://www.google.tld/ig?*
// @include http://www.google.tld/
// @include http://www.google.tld/#*
// @include http://www.google.com*
// @include http://*.google.*
// @include https://*.google.*
// @include https://mail.google.com*
// ==/UserScript==

//alert('');
//Variable de posición X para colocar el menu en la posicion requerida
var PosX;
var PosY;

//acceder a el elemento Id 'gbar'
var MenuGoogle = document.getElementById('gbar');

var ElBody = document.getElementById('body');
ElBody.addEventListener("click", OcultarDiv, false);


//Función para mostrar el DIV con los links
function MostrarDiv() {
//alert(PosX);
EleDiv.style.left = PosX + "px";
EleDiv.style.top = PosY + 21 + "px";
EleDiv.style.right = "auto";
EleDiv.style.visibility = "visible";
}

function OcultarDiv() {
//alert(PosX);
EleDiv.style.left = PosX + "px";
EleDiv.style.top = PosY + 21 + "px";
EleDiv.style.right = "auto";
EleDiv.style.visibility = "hidden";
}

//Crear elemento
var a = document.createElement('A');
a.className = ('gb3');
a.setAttribute('aria-haspopup', true);
a.addEventListener("click", MostrarDiv, false);
a.style.marginLeft = "5px";
a.setAttribute('href', '#');



//Crear elemento u
var u = document.createElement('U');
var txtU = document.createTextNode('more');
u.appendChild(txtU);
u.style.marginRight = "5px";

a.appendChild(u);


//Crear elemento Small
var Small = document.createElement('SMALL');
var txtSmall = document.createTextNode('++');
Small.appendChild(txtSmall);

a.appendChild(Small);

MenuGoogle.firstChild.appendChild(a);

var EleDiv = document.createElement('DIV');
EleDiv.className = ('gbm');
EleDiv.style.backgroundColor = "#FE9A2E";

//******Obtener la posición del DIV**********
PosX = u.offsetLeft;
PosY = u.offsetTop;


var CrearLink = new Array();
var TextoLink = new Array();
//Para agregar las etiquetas del link
var VarEtiqueta = new Array('Yahoo Search', 'Bing', 'Ask', 'Altavista', 'Mooter', 'Clusty', 'Dogpile', 'Turbo10', 'Lycos',
                            '.....', 'Facebook', 'Twitter', 'Yahoo Answers', 'Hi5', 'MySpace', 'Orkut',
                            '.....', 'Yahoo', 'AOL');
//Para agregar la direccion url a la que va dirigida la etiqueta
var VarURL = new Array('http://www.search.yahoo.com/', 'http://www.bing.com/', 'http://www.ask.com/',
                    'http://www.altavista.com/', 'http://mooter.com/', 'http://clusty.com/',
                    'http://www.dogpile.com/', 'http://turbo10.com/', 'http://www.lycos.com/',
                    '#', 'http://www.facebook.com/', 'http://twitter.com/', 'http://answers.yahoo.com/',
                    'http://www.hi5.com/', 'http://www.myspace.com/', 'http://www.orkut.com/Main#Home',
                    '#', 'http://www.yahoo.com/', 'http://www.aol.com/');
//La cantidad de links

var i = VarEtiqueta.length - 1;

var x;
for (x = 0; x <= i; x++) {
    CrearLink[x] = document.createElement('A');
    TextoLink[x] = document.createTextNode(VarEtiqueta[x]);
    CrearLink[x].appendChild(TextoLink[x]);
    CrearLink[x].setAttribute('href', VarURL[x]);
    CrearLink[x].className = ('gb2');
    EleDiv.appendChild(CrearLink[x]);
}



//*********************************

MenuGoogle.firstChild.appendChild(EleDiv);

//*****************************

martes, 16 de febrero de 2010

Crear controles en tiempo de ejecucion con ASP.NET (Insertar datos en SQL Server)

//Creación de controles en tiempo de ejecución basado en una tabla de sql server

//Creamos un array de controles
Public TextBox[] LabelArrayIdProd, LabelArrayProd, TBArrayInvTot
TextBox labelIdProd, labelProd, TBInvTot
 //Varible para generar n cantidad de controles
static int CantidadRegistros = 0;

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
       {
            CrearControles();
             this.NumberOfControls = 1;
      }
    }

        protected int NumberOfControls
    {
        get { return (int)ViewState["NumControls"]; }
        set { ViewState["NumControls"] = value; }
    }

        protected override void CreateChildControls()
    {
        // Aqui estamos recreando los controles para que se mantengan en cada post back
            if (this.NumberOfControls == 1)            {
                CrearControles();
            }
            else
            {
                return;
            }
   }

//Creamos los controles
    protected void CrearControles()
    {
        //************************************************************
        string GenerarProductos;
 
        GenerarProductos = "SELECT idconsecutivo, producto FROM ConnProductos2  "
                                + "ORDER BY idconsecutivo";
        DataTable dt;
        OleDbDataAdapter da;
        da = new OleDbDataAdapter(GenerarProductos, MiConeccion);
        dt = new DataTable();
        da.Fill(dt);
        CantidadRegistros = Convert.ToInt16(dt.Rows.Count);
        //********************************************************
        LabelArrayIdProd = new TextBox[CantidadRegistros];
        LabelArrayProd = new TextBox[CantidadRegistros];
        TBArrayInvTot = new TextBox[CantidadRegistros];

        for (int i = 0; i < CantidadRegistros; i++)
        {
            labelIdProd = new TextBox();
            labelIdProd.ID = "LabelID" + i;
            LabelArrayIdProd[i] = labelIdProd;
            this.Panel1.Controls.Add(labelIdProd);
            //Dar un formato por medio de una hoja de estilo
            LabelArrayIdProd[i].CssClass = "ClaseEtiquetasId";
            //Le asignamos un valor a la etiqueta desde la tabla de nuestra base
            LabelArrayIdProd[i].Text = dt.Rows[i]["idconsecutivo"].ToString();
            LabelArrayIdProd[i].Enabled = false;
            this.Panel1.Controls.Add(new LiteralControl("
"));
            //***************************************************************
            labelProd = new TextBox();
            this.labelProd.ID = "LabelProd" + i;
            LabelArrayProd[i] = labelProd;
            this.Panel2.Controls.Add(this.labelProd);
            LabelArrayProd[i].CssClass = "ClaseEtiquetasProd";
            LabelArrayProd[i].Text = dt.Rows[i]["Producto"].ToString();
            LabelArrayProd[i].Enabled = false;
            this.Panel2.Controls.Add(new LiteralControl("
"));
            //****************************************
         
            TBInvTot = new TextBox();
            this.TBInvTot.ID = "tbInvTot" + i;
            TBArrayInvTot[i] = TBInvTot;
            this.Panel4.Controls.Add(this.TBInvTot);
            TBArrayInvTot[i].CssClass = "ClaseTB";
            TBArrayInvTot[i].Text = "0";
            this.Panel4.Controls.Add(new LiteralControl("
"));
            //**********************************************

        }

    }

//Guardar los datos
protected void LinkButtonGuardarReg_Click(object sender, EventArgs e)
    {

                InsertarCapura();
                this.NumberOfControls = 0;
                 //
    }

   protected void InsertarCapura()
    {

        for (int i = 0; i < CantidadRegistros; i++)
        {
       
                string InsertarDesglose = "INSERT INTO Desglose "
                                        + "(id_producto, invtot) "
                                        + "VALUES (" + Convert.ToInt16(this.LabelArrayIdProd[i].Text) + ", "
                                        + " + Convert.ToInt16(this.TBArrayInvTot[i].Text)) ";

                OleDbConnection MiConexion = new OleDbConnection(MiConeccion);
                OleDbCommand MiInsert = new OleDbCommand(InsertarDesglose, MiConexion);
                MiInsert.Connection.Open();
                MiInsert.ExecuteNonQuery();
                MiInsert.Connection.Close();
             }
        }

 //Este es un código modificado del que uso en mis páginas,
//así que puede que no sea del todo correcto, espero sus comentarios