jueves, 19 de noviembre de 2015

expresiones regulares para webform drupal

Solo letras:

^[a-zA-Z[:space:]]*$

Solo numeros:
^[0-9[:space:]]*$

Letras y numeros:
^[a-zA-Z0-9[:space:]]*$

lunes, 5 de octubre de 2015

Symfony CRUD create views, controller and more / Crear vistas, controladores y mas a partir de una entidad


Fuente: http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_doctrine_crud.html

Symfony nos ayuda con la creación de view, controller, form.

Una vez que tenemos nuestras entities creadas podemos crear todo lo demás.


$ php app/console generate:doctrine:crud

Nos va dando una serie de instrucciones, la seguimos y generamos para cada una de nuestras entities.

Ejemplo:
En mi AppBundle tengo una entity Usuario

1. Corro el comando
$ php app/console generate:doctrine:crud
2.
The Entity shortcut name: AppBundle:Usuario
3.
By default, the generator creates two actions: list and show.
You can also ask it to generate "write" actions: new, update, and delete.

Do you want to generate the "write" actions [no]?yes (quiero que me genere el new, update y delete)
4.
Configuration format (yml, xml, php, or annotation) [annotation]: annotation 

5.
Routes prefix [/usuario]:/usuario
6.
Do you confirm generation [yes]? yes

Si navegamos en nuestro proyecto veremos en view, form y demás los archivos creamos, en este ejemplo si escribimos en el browser la ruta de nuestro proyecto y /web/app_dev.php/usuario/ veremos lo que contiene usuario, si no tenemos ningún registro podemos crear uno y si ya tenemos podemos editar y borrar.

Symfony crear base de datos a partir de entidades / Create database from Entity Class


Documentación en: http://symfony.com/doc/current/book/doctrine.html
Instalar symphony
Crear base de datos

$ app/console doctrine:database:create

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE table name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Primero crear las clases o entities y luego generar las tablas de la base de datos

// src/AppBundle/Entity/Product.php
namespace AppBundle\Entity;

class Product
{
    protected $name;
    protected $price;
    protected $description;
}

Crear entities completas desde consola

$php app/console doctrine:generate:entity

Para crear la base

$php app/console doctrine:schema:update --force

Si tenemos un error de No Metadata Classes to process debemos asegurarnos que este seteada en el config, borra la app/cache despues de realizar este cambio

# app/config/config.php
doctrine:
    orm:
        # ...
        mappings:
            AppBundle:
                type: annotation
                is_bundle: false
                dir: %kernel.root_dir%/../src/AppBundle/Entity
                prefix: AppBundle\Entity
                alias: AppBundle


Para añadir relaciones

Ejemplo:
Relación de Categoria - Producto de 1 a muchos

En la clase de Categoria añadimos

/**
     * @ORM\OneToMany(targetEntity="Producto", mappedBy="categoria")
     */
    protected $productos;

    public function __construct()
    {
        $this->productos = new ArrayCollection();
    }


En la clase Producto añadimos


    // ...

    /**
     * @ORM\ManyToOne(targetEntity="Categoria", inversedBy="producto")
     * @ORM\JoinColumn(name="categoria_id", referencedColumnName="id")
     */
    protected $categoria;


Una vez realizados todos los cambios de many to one y one to many en las entities corremos

$php app/console doctrine:generate:entities AppBundle
$php app/console doctrine:schema:update --force

para actualizar los cambios realizados.




viernes, 28 de agosto de 2015

Algunas librerias utiles

ScrollNav OnePage


.scrollNav() crea una elemento tipo <section> en donde encuentre un .pane-node-title

$('#main-content .region-one-main').scrollNav({
    sections: '.pane-node-title',
    subSections: false,
    sectionElem: 'section',
    showHeadline: false,
    headlineText: 'Scroll To',
    showTopLink: false,
    topLinkText: 'Top',
    fixedMargin: 40,
    scrollOffset: 300,
    animated: true,
    speed: 500,
    insertTarget: this.selector,
    insertLocation: 'insertBefore',
    arrowKeys: false,
    scrollToHash: true,
    onInit: null,
    onRender: null,
    onDestroy: null
});


Efecto Scroll en Onepage


http://plugins.compzets.com/animatescroll/

$('#section-2').animatescroll({scrollSpeed:2000,easing:'easeInOutBack'}); 
$('#section-2').animatescroll({scrollSpeed:2000,easing:'easeOutBounce'});
 $('#section-2').animatescroll({scrollSpeed:3000,easing:'easeOutElastic'});



Background image slide

Backstretch, modulo de drupal que permite poner imagenes de background como slides.



miércoles, 26 de agosto de 2015

Animación SIN FLASH

Tenemos que hacer muchas cosas que los clientes piden, entre ellas están las animaciones, generalmente a la gente le gusta que todo se mueva =S
Aqui les dejo algo basico de animación de un pagina en construcción, no me quedo perfecta porque no hago animación de objetos pero quedo bien para ser una pagina de en construcción.


Para realizar la animación utilice una libreria js llamada spritely

Necesitamos una imagen para dar la animación que deseamos para mi esto fue lo mas difícil.


Este png tiene 9 frames todos del mismo ancho y alto.

JS:

  <script type="text/javascript">
    $('#u')
      .sprite({fps: 3, no_of_frames: 9})
      .spRandom({top: 0, left: 380, right: 510, bottom: 0, speed: 4000, pause: 3000});
  </script>

.sprite realiza la animacion
fps: La velocidad
no_of_frames: la cantidad de frames en la imagen


.spRandom hace que se mueva en este caso el too y bottom es 0 porque no queria que se mueva verticalmente y left y right son los rangos en los que quiero que se mueva en horizontal.

CSS:

#u{
background:url(img.png);
width: 96px;
height: 155px;
position: relative;
       top: 421px !important;
       left: 385px;
}

No olvidar dar el width y height exacto del frame.

Fuente: http://spritely.net/

martes, 30 de junio de 2015

Poner un slide de imágenes de background en una web Drupal

Hola, seguramente se han preguntado como poner imágenes de fondo en su sitio que cambien automáticamente, pues también me encontré con este requerimiento en mi caso era para un sitio web realizado en drupal, entonces googlee un poco y encontré un plugin jQuery llamado  Backstretch simple de usar, descargas la librería y la llamas.


$.backstretch([
"image1.jpg"
, "image2.jpg"
, "image3.jpg"
], {duration: 3000, fade: 750});




En mi caso la necesitaba para drupal, entonces lo busque como modulo y encontre.
Backstretch | Drupal.org lo instale en mi drupal y lo habilite en mis modulos.
Luego lo tenia que añadir en mi tipo de contenido en este caso era un pagina básica
así que añadi un nuevo field tipo image. (sliderf)






En mi caso quiero un slider de 3 imágenes entonces al crear el field le puse de limite 3 imágenes
para mostrarlas como slider en manage display debemos setear backstrech en sliderf.





En teoria todo estaba listo, pero no! no funcionaba para mi, vi si habían errores en mi consola pero no tenia ninguno, me fije en el modulo que se había instalado en mi drupal y vi la version del js note que era del 2012 entonces lo reemplace con el del plugin que me había descargado de sorben porque pensé que era un tema de versiones pero tampoco, luego recordé que había editado la vista de mis nodos (node_view), entonces tenia que agregar ese field.





A lo que agregamos y configuramos este field en el node_view el formato para mostrar este field es backstrech y debemos poner el selector css donde queremos que se muestre en mi caso era todo el body entonces ponemos body si es una clase o un id debemos pones .miclase o #miid respectivamente.

Fuentes:


martes, 16 de junio de 2015

Firmar un apk release en consola

Para firmar un apk por consola, cuando estamos trabajando con cordova.
Realizar el build, cordova build android


//Asegurarse que esten las variables de entorno seteadas
$export ANDROID_HOME=/Applications/Android/sdk 
$export PATH=$PATH:$ANDROID_HOME/bin
$ant release

//Se genera el directorio bin con los release apt
$cd bin/ 

//Generar el key
$keytool -genkey -v -keystore prueba.keystore -alias parques -keyalg RSA -keysize 2048 -validity 10000
$jarsigner  -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore prueba.keystore app-release-unsigned.apk parques
$jarsigner -verify -verbose -certs app-release-unsigned.apk
$zipalign -v 4 app-release-unsigned.apk app.apk

Es el app.apk que esta dentro de la carpeta bin el que podemos subir a playstore




Fuente:
http://developer.android.com/tools/publishing/app-signing.html#cert

jueves, 11 de junio de 2015

Setear variable de entorno - Android SDK en MAC OS



Tal vez les a sucedio que cuando quieren realizar un build de una app android por consola, tal vez un cordova build android obtiene un error como:

[Error: Please install Android target: "android-21".

Hint: Open the SDK manager by running: /Applications/Android\ Studio.app/sdk/tools/android
You will require:
1. "SDK Platform" for android-21
2. "Android SDK Platform-tools (latest)

3. "Android SDK Build-tools" (latest)]

Pues bueno primero deben descargar el sdk asegurarse de bajar las versiones que les dice el mensaje en este caso es la 21, uno vez hecho esto aun tienen el mismo error? Pues bueno falta setear la variable de entorno o quiza modificar su ruta.

A continuación unos cuando comandos para setear la variable de entorno para el SDK de android

(MAC)
1. touch ~/.bash_profile
2. open ~/.bash_profile (Se abrira un editor del sistema)
3. Añadimos las siguientes líneas:

export PATH=${PATH}:/Development/android/sdk/tools
export PATH=${PATH}: /Development/android/sdk/platform-tools

4. Guardamos Cerramos
5. source ~/.bash_profile


Referencia: Aquí

viernes, 17 de abril de 2015

Barcode Plugin para Cordova


Fuente de descarga de plugin:
https://github.com/wildabeast/BarcodeScanner

$ cordova platform add android
$ cordova platform add ios
$cordova build
$cordova -d plugin add /aqui el directorio donde se descargo el puglin/BarcodeScanner-master


Revisar que los xml, js apropiados esten el www general del proyecto.

La estructura del proyecto es:


Para esta app es: 
barcodesacanner.js (Archivo viene el directorio del plugin)
cordova.js (archivo que se crea al momento de hacer build)

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

cordova_plugins.js (Verificamos que el archivo contenga la info del plugin, sino lo creamos.)

cordova.define('cordova/plugin_list', function(require, exports, module) {
module.exports = [
    {
        "file": "plugins/com.phonegap.plugins.barcodescanner/www/barcodescanner.js",
        "id": "com.phonegap.plugins.barcodescanner.BarcodeScanner",
        "clobbers": [
            "cordova.plugins.barcodeScanner"
        ]
    }
];
module.exports.metadata =
// TOP OF METADATA
{
    "com.phonegap.plugins.barcodescanner": "2.2.0"
}
// BOTTOM OF METADATA
});


/***************************************************************************/
config.xml  (Info de la app e info de plugin)


<?xml version='1.0' encoding='utf-8'?>
<widget id="com.example.qr" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>Barcode</name>
    <description>
        A sample Apache Cordova application that responds to the deviceready event.
    </description>
    <author email="dev@cordova.apache.org" href="http://cordova.io">
        Apache Cordova Team
    </author>
    <feature name="BarcodeScanner">
        <param name="package" value="com.phonegap.plugins.barcodescanner.BarcodeScanner" />
    </feature>
    <content src="index.html" />
    <access origin="*" />
</widget>


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


index.js


var app = {
    // Application Constructor
    initialize: function() {
        this.bindEvents();
    },
    // Bind Event Listeners
    //
    // Bind any events that are required on startup. Common events are:
    // `load`, `deviceready`, `offline`, and `online`.
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
        document.getElementById('scan').addEventListener('click', this.scan, false);
        document.getElementById('encode').addEventListener('click', this.encode, false);
    },

    // deviceready Event Handler
    //
    // The scope of `this` is the event. In order to call the `receivedEvent`
    // function, we must explicity call `app.receivedEvent(...);`
    onDeviceReady: function() {
        app.receivedEvent('deviceready');
    },

    // Update DOM on a Received Event
    receivedEvent: function(id) {
        var parentElement = document.getElementById(id);
        var listeningElement = parentElement.querySelector('.listening');
        var receivedElement = parentElement.querySelector('.received');

        listeningElement.setAttribute('style', 'display:none;');
        receivedElement.setAttribute('style', 'display:block;');

        console.log('Received Event: ' + id);
    },

    scan: function() {
        console.log('scanning');
     
        var scanner = cordova.require("cordova/plugin/BarcodeScanner");

        scanner.scan( function (result) {

            alert("We got a barcode\n" +
            "Result: " + result.text + "\n" +
            "Format: " + result.format + "\n" +
            "Cancelled: " + result.cancelled);

           console.log("Scanner result: \n" +
                "text: " + result.text + "\n" +
                "format: " + result.format + "\n" +
                "cancelled: " + result.cancelled + "\n");
            document.getElementById("info").innerHTML = result.text;
            console.log(result);
            /*
            if (args.format == "QR_CODE") {
                window.plugins.childBrowser.showWebPage(args.text, { showLocationBar: false });
            }
            */

        }, function (error) {
            console.log("Scanning failed: ", error);
        } );
    },

    encode: function() {
        var scanner = cordova.require("cordova/plugin/BarcodeScanner");

        scanner.encode(scanner.Encode.TEXT_TYPE, "http://www.google.com", function(success) {
            alert("encode success: " + success);
          }, function(fail) {
            alert("encoding failed: " + fail);
          }
        );

    }

};


Fuente de ejemplo:
https://github.com/wildabeast/BarcodeDemo




miércoles, 15 de abril de 2015

Login Facebook en Cordova Android APP



Fuente para descarga del Plugin:

https://github.com/Wizcorp/phonegap-facebook-plugin/blob/master/platforms/android/assets/www/index.html


Pasos:
$ cordova create fb com.example.fb FB
$ cordova platform add android

Crear una app para Android en Facebook Developer

Generar Hash
$keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64keytool -exportcert -alias YOUR_RELEASE_KEY_ALIAS -keystore YOUR_RELEASE_KEY_PATH | openssl sha1 -binary | openssl base64

$keytool -exportcert -alias YOUR_RELEASE_KEY_ALIAS -keystore YOUR_RELEASE_KEY_PATH | openssl sha1 -binary | openssl base64




$cd al directorio del proyecto en este caso fb

$ cordova -d plugin add /Reemplazar aqui la ruta donde esta el pluglin/phonegap-facebook-plugin --variable APP_ID="aqui el id de tu app" --variable APP_NAME="aqui el nombre de tu app"

Copiar las carpetas apropiadas de www del plugin descargado

En el index.html reemplazar 
 var appId = prompt("Enter FB Application ID", "");
por
var appId="tuID";

Otras Fuentes:
http://ngcordova.com/docs/plugins/facebook/
https://github.com/courseoff/phonegap-facebook-plugin

viernes, 27 de marzo de 2015

Eliminar Status Bar de IOS



Tenia problemas con el status bar en IOS la, fecha y la hora se montaban en el header de la aplicacion, para solucionarlo en xcode agregue una key en el info.plist

"View controller-based status bar appearence" y le di el valor de "NO" y en la splash de inicio para ocultarlo se debe chequear que "Status bar is initially hidden" este en "YES".







Fuente:
http://www.kadrmasconcepts.com/blog/2013/10/06/ios-7-phonegap-and-the-status-bar/

Conexión DB2 con PHP (En sesion db2admin) DB2 Express C instalación personalizada

Para obtener los datos de los libros necesitamos conectarnos a una base DB2 por lo que para realizar pruebas la realizaremos desde nuestra computadora local.
Primero necesitamos tener instalado PHP.
En nuestro caso nuestras computadoras tienen WAMPP
Para realizar la conexion seguimos el siguiente tutorial:
Ver en Referencias/Conexión DB2
Pero no obtuvimos buenos resultados, luego de un poco de investigacion leimos que en lugar de tratar con db2_connect(); tratemos con odbc_connect();
Pues con ODBC tuve un problema con el driver decia que no lo encontraba, lo cual lo solucionamos escribiendo en el explorador de win7 ODBC y les aparecera algo que dice Administrador de origenes de datos ODBC vamos a la parte que dice controladores y deberiamos tener algo como esto:
Notamos que ahi estan los odbc de ibm db2, entonces nos vamos a la parte que dice DNS de sistemas ponemos añadir y damos click sobre el driver.
Al realizar esto solucione el problema de que no encontraba el driver pero a pesar de eso tenia ahora un error de permisos.
Resulta que cuando instale el DB2 se me creo otra sesion en mi computadora, entonces decidi cambiar de usuario, e ir a db2admin.
Aqui tenia el mismo problema estaba probando con el schema de SAMPLE que viene en db2, entonces cree un nuevo schema, con el cual funciono perfectamente.
aqui el codigo y su resultado.