About me

Alex is an experienced technology professional. Currently, he belongs to Base22; a family with a lot of awesome people!

He loves computer sciences and consider himself passionate about research and its application to any aspect of life. He is proud to be Mexican because he loves his Pre-Hispanic cultures. In his free time he imparts workshops by streaming for the developer community from throughout Latin America, and he reads scientific articles about computer sciences and its application to Medicine and Biology.

Entrepreneurship

Founder & CEO of Webtraining.Zone an e-learning platform for Spanish speakers, focused on web and internet technologies.

Project experience in his current job

  • CEMEX.com SEO Improvements and content migration on top of Liferay 7 DXP.
  • “Automotive Assisted Driving Data Catalog”; a Single Page Application using Angular 2 and a Semantic Linked Data Platform for one of the largest Japanese corporations.
  • Redesign of Base22 website using IBM WebSphere Portal v8.5.
  • Creating of MyTeamKFC portal for employees of Kentucky Fried Chicken using IBM WebSphere Portal v8 and IBM WCM v8.
  • Implementing the Generic Portal Blueprint of Base22 using IBM WebSphere Portal v8 and IBM WCM v8.
  • Integrating of Yum! brands OwnYourHealth portal using IBM WebSphere Portal v8 and IBM WCM v8.
  • Implementing backend services for mobile application on Dealer Portal CNH Industrial using IBM WebSphere Portal v6 , WCM API, Apache Solr, Struts and Spring framework.
  • Implementing backend REST services to populate the CEMEXpedia navigation (CEMEX).
  • Improving a PDF exporter Java application to generate PDF documents using the IBM® Web Content Manager 8 API and JRC repositories (KFC).
  • Creating a Java Proxy to consume external services for the Parts Support Dashboard (CNH).
  • Making a front-end application to display the Parts Support Dashboard (Case New Holland).
  • Implementing the WPS TRICARE Beneficiaries portal (WPS).

Project experience in his previous job

Skills

  • Front-end technologies, libraries and frameworks: HTML5, CSS2, CSS3, XHTML 1.0 Strict, VRML, OWL, RDF (semantic web), XML, JSON, jQuery, jQuery Mobile, jQuery UI, JSLint, Modernizr, Mootools, YepNope, Backbone.js, AngularJS, Gulp.js, Bower, NPM.
  • CSS Preprocessors: Stylus, LESS.
  • Back-end technologies, libraries and frameworks: Struts 1 (basic), Spring MVC (intermediate), JAXB, Jackson, JSoup, iText, Apache Solr.
  • Programming languages: PHP5, Ruby(basic), Python, JavaScript, JavaSE, JavaEE (advanced), Visual C# .NET, C/ C++, Pascal, Delphi, awk.
  • Graphic libraries: OpenGL.
  • Design and Multimedia Software: Adobe Fireworks, Adobe Dreamweaver, Adobe Photoshop, Corel Draw, Album Creator, AutoRun Pro, IconWorkShop, Autodesk Combustion, SONY Vegas, Ulead Media Studio.
  • Mathematical Software: Matlab, Maple, Máxima, Derive.
  • SQL & NoSQL Database Management Systems and related software: MySQL 5.x, MySQL Workbench, DB Designer, Microsoft SQL Server 2008, MongoDB.
  • Business Intelligence tools: Microsoft Business Intelligence Development Studio, Java Pentaho.
  • Open source MVC Frameworks: CakePHP, CodeIgniter, Laravel.
  • Content Management Systems: Drupal, Joomla!, Moodle, IBM® Web Content Manager.
  • Operating Systems: Microsoft Windows, GNU/LINUX (Debian, K/Ed/Ubuntu, Mandriva, PC Linux OS, Fedora, Linux Mint, Arch Linux, OpenSuse, CentOS, Red Hat Enterprise Linux), Mac OS X.
  • Security and server tools: Advanced knowledge of Linux Servers Management. IP-Tables, Netstat, Zabbix, Apache configuration, MySQL configuration.

 Certifications

  • Java(TM) Certified Java Associate (SCJA)
  • Oracle Certified Professional, Java SE 6 Programmer
  • C2040-928: Developing Websites Using IBM Web Content Manager 8.0

Publications

  • International Congress of Technological Innovation. Article: Artifice: virtual cities builder by using cellular automata. Date : December 2010.

 Extra activities

51 comments on “About me”

  1. Cordial Saludo Sr Alex,
    Estuve viendo los tutoriales por youtube de CakePhp y quedé impresionado porque de todos los manuales y tutoriales que encontré en la Web, el más claro y que realmente me ayudó fue su curso. Me preguntaba si tiene algún curso en youtube o tutoriales que hablen sobre como iniciar sesión con un usuario diferente, por ejemplo un administrador y otro usuario y que al ingresar los lleven a páginas diferentes obviamente por el tema de los permisos, he buscado y no he encontrado algo al respecto, siempre veo como manejar le inicio de sesión, pero no como redireccionar a los usuarios al sitio que están autorizados visitar … igualmente como subir archivos word o pdf y que sean visualizados. Muchas gracias por su ayuda

    1. Buen día Meissner:

      Me da mucho gusto que el material de estos videos te haya servido. Por lo que preguntas en específico es por material de cómo implementar Autenticación (Auth) + Access Control List (ACL) te comento que por el momento no tengo grabado nada en video explicando como implementarlo, tal vez podría hacer un pequeño curso sobre ello, sólo que por el momento tengo en puerta muchas tareas y no creo posible realizar eso hasta finales del mes de septiembre.

      Sin embargo quisiera también decirte que CakePHP ya tiene componentes específicos para manejar todo esto y se implementan de manera relativamente sencilla, ¿has visto el ejemplo básico de ACL que está en la ayuda oficial de CakePHP? Se me ocurre algo, este fin de semana podría prepararte una aplicación con autenticación para varios roles que te quede funcionado y ya la comienzas a estudiar… si eso puede ser…

      Aquí puedes leer un poco más de lo que te comentaba:
      http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/simple-acl-controlled-application.html

      Si en algo más te puedo ayudar, con gusto lo haré.

      1. hola alex, yo también estoy interesada en un ejemplo con distintos usuarios y permisos usando acl y auth… si hicistes el ejemplo me lo podrías mandar para verlo y estudiarlo… hay manera de que hagas algún tutorial con este tema… no hay nada en la web jaja

  2. Buenas tardes.
    Actualmente estoy realizando un proyecto en cakephp en donde necesito unir dos modelos en uno solo, de tal manera que al guardar el primero, las relaciones existentes con el segundo, también sean guardadas.
    ¿Le sería posible brindarme un poco de ayuda al respecto? si es así, agradecería mucho que me proporcionara algún correo de contacto.

    De antemano, muchas gracias.

    1. Que tal Aaron,

      Por supuesto que te puedo ayudar, únicamente te suplico me dejes un mensaje en mi twitter: @alex_arriaga_m, y ahí nos ponemos de acuerdo, sugiero que instales Team Viewer para que pueda ayudarte editando tu código directamente. ¡Saludos!

  3. hola necesito ayuda soy nuevo en esto de php y necesito entregar un trabajo en cakephp… bueno no puedo abrir mis archivos .ctp en dreamweaver cs6 o en algun otro editor como notepad++ como puedo hacer… 🙁

    1. Que tal Eduardo, puedes abrir tus archivos .ctp en cualquier editor de texto plano, se me hace muy extraño que con Notepad++ no los puedas abrir… una duda ¿qué error te da al abrirlos? ¿o sólo no te colorea la sintaxis? Un editor muy bueno que también puedes probar es Sublime Text 2. Saludos.

  4. Alex, Buen Día, hace unas semanas vi tu curso de cake y de verdad es uno de los pocos que he visto que me han dejado una grata recordación, Soy un principiante autodidacta del desarrollo web. En este momento estoy comenzando a desarrollar una plataforma de calificaciones para mi escuela rural donde laboro y quisiera contar con tu apoyo,se que eres un hombre bien ocupado,pero por tu carisma y paciencia en el curso quisiera buscar tu guia.Saludos desde Colombia. Alex cual editor de código seria bueno usar que al escribir aparezca la predicción de etiquetas que me ayude en cake.Gracias
    Bre

    1. Que tal buen día Hernán

      Muchas gracias por tu comentario y por supuesto cuenta conmigo para ayudarte en el proceso de desarrollo del sitio que estás construyendo… como editor para eso te recomendaría Aptana Studio: http://www.aptana.com/, en mi caso prefiero utilizar Sublime Text 2 pues tiene muchos plugins que ayudan en el desarrollo: http://www.sublimetext.com/2 pero es realmente preferencia personal… saludos y espero tu respuesta.

  5. Hola, Alex tengo una duda con el cake, especificamente con el metodo para paginar, necesito hacer un recursive => 2 pero no encuentro la manera como puedo hacer, te envio un ejemplo del codigo en el controlador; public $paginate = array(‘Postulado’=>array(‘limit’=>20,’order’=>array(‘Postulado.POS_ID’=>’desc’)));

    Ahora como hago si necesito hacer un recursive 2 para traerme las relaciones de los modelos asociados a Postulado; Gracias…

  6. Hola Alex, un cordial saludo.

    A ver si me puedes ayudar, tengo una aplicacion que funciona perfectamente en localhosto en wamp; no obstante la subo al servidor remoto y no me guarda registros. Hasta donde entiendo lo que funciona en localhost wamp interactuando con BD mySql deberia comportarse igual en un servidor remoto con la misma base de datos, MySql.

    Agradecere mucho tus comentarios al respecto.

    Saludos,
    Ricardo Lee.

    1. Hola que tal Ricardo,

      Primero que nada permíteme comentarte que una vez que tienes tu proyecto (supongo que lo hiciste en CakePHP) en localhost, en general siempre funciona de la misma manera en un servidor remoto, pero no es garantía, entonces vamos por pasos.

      1) Verifica que tengas una versión de PHP mayor o igual a 5.2.8.
      2) MySQL 5 (preferentemente)
      3) Conector entre PHP y MySQL (extensión en el servidor remoto)
      4) Módulo re-write habilitado en el servidor
      5) Verifica que hayas subido los tres archivos .htaccess en la carpeta RAIZ, RAIZ/app y RAIZ/app/webroot

      Aquí hay más información sobre los requisitos de instalación: http://book.cakephp.org/2.0/en/installation.html
      Y sobre el módulo re-write de Apache: http://book.cakephp.org/2.0/en/installation/url-rewriting.html

      Si verificaste todo lo anterior y aún sigue sin funcionar, entonces lo correcto es ir a los logs del servidor y verificar qué error está marcando con exactitud (de hecho esta es la mejor forma de saber la razón por qué tu proyecto no está funcionando).

      Saludos.

  7. Estoy viendo los videos del curso phpCake que diste el ano pasado y quisiera saber si fueras tan amable de ayudarme con algo que no comprendo. Es en cuanto las altas de muchos a muchos en la tabla students_courses. Gracias

  8. Hola. Me han gustado mucho tus videos. Pero ahora tengo un problema que no se como solucionar. Yo estoy haciendo un proyecto con Cakephp. Y para subir imagenes uso MeioUpload Behavior.

    Yo hice todo lo que dice el video. Pero tengo el siguiente error y no tengo idea de como arreglarlo me puedes ayudar? Yo no cambie nada del archivo original. Que es lo que estoy haciendo mal?

    Strict (2048): Declaration of MeioUploadBehavior::beforeValidate() should be compatible with ModelBehavior::beforeValidate(Model $model, $options = Array) [APP\Model\Behavior\MeioUploadBehavior.php, line 1405]

    Strict (2048): Declaration of MeioUploadBehavior::beforeSave() should be compatible with ModelBehavior::beforeSave(Model $model, $options = Array) [APP\Model\Behavior\MeioUploadBehavior.php, line 1405]

    Strict (2048): Declaration of MeioUploadBehavior::afterSave() should be compatible with ModelBehavior::afterSave(Model $model, $created, $options = Array) [APP\Model\Behavior\MeioUploadBehavior.php, line 1405]

    Espero me contestes,

    Hastaluego,

    1. Que tal Edith,

      Para ser sincero no conozco ese componente MeioUpload pero por lo que leí es un behaviour que ya es obsoleto es decir no es necesariamente compatible con las nuevas versiones de CakePHP (https://github.com/jrbasso/MeioUpload) para ese caso se recomienda usar un plugin que es este: https://github.com/josegonzalez/cakephp-upload

      Solo como una nota adicional: el error que te aparece es porque la versión del beforeValidate() ha cambiado en términos de su firma.

      Saludos.

  9. Felicitaciones por los tutoriales de CakePHP, son geniales!
    En ellos no abordas el tema de la Búsquedas de registros para la tabla. Son principiante en el CakePHP y estoy intentando implementar este Componente: http://www.jamesfairhurst.co.uk/posts/view/cakephp_filter_component/, pero no puedo ‘echarlo’ andar, he publicado estas notas en Stackoverflow, http://stackoverflow.com/questions/23485595/cakephp-using-filtercomponent-fatal-error-cannot-access-empty-property.

    Podrías apoyarme en orientarme al respecto, o tienes algún ejemplo sobre cómo realizar las búsquedas o filtrado de datos sobre una listado de datos (tabla). (Tal vez sea la lección 6 del tutotial :/ )

    1. Que tal Héctor,

      Gracias por la felicitación, sobre lo que preguntas de los filtros no lo explico en el curso pero si eres principiante te recomendaría no incluir ese tipo de componentes cuyo uso es para quien ya está familiarizado con el framework… en su lugar te recomiendo hacer esos filtros pero del lado del cliente (es decir, con JavaScript) y para eso te puedes apoyar de un plugin de jQuery muy fácil de usar, que se llama jQuery Datatables, aquí lo puedes descargar y es muy potente: https://datatables.net/

      Te comenté el enlace en Stack Overflow, también puedes usar uno de mis videos de jQuery para guiarte en el proceso de llamados Ajax con jQuery: https://www.youtube.com/watch?v=lV6EFXiljBw&index=7&list=PLSUqL2t8VZCqPhogGoP85QcrvmTgW2_VK

      Saludos.

  10. Hola! Alex, no ha sido tan fácil como esperaba. Tendrás algún ejemplo de cómo incorporarlo. Estoy usando las vistas, modelos y controladores tal como nos lo enseñaste en tus cursos de CakePHP de YouTube.

  11. Hola Alex!
    Ahora quiero usar un path diferente por modelo, para las imagenes que carga. Podrías decirme como lo hago. Yo se q tiene q ser en boostrap, pero no se como hacer para q sea dinámico.

    1. Que tal Edith,

      Pues para cambiar las carpetas de carga por modelo simplemente en el método add() de tu controlador deberías cambiar la ruta, por ejemplo mira este archivo:
      https://github.com/alex-arriaga/uploading-files-with-cakephp/blob/master/app/controllers/contenidos_controller.php

      En el existen estas líneas de código:

      // Para upload
      if (isset($this->data['File'])){
      $pathFolderImg = 'img/Contenido';
      $fileOK = $this->uploadFiles($pathFolderImg, $this->data['File']);
      $pathImg = 'Contenido/' . $this->data['File']['img_url']['name']; // Ruta relativa a APP/webroot/img
      $this->data['Contenido']['img_url'] = $pathImg;
      }
      //

      En él notarás la línea donde se define la variable $pathFolderImg que es la que realmente controla en que carpeta se dejará guardada la imagen que se suba al servidor.
      Por cierto este repositorio lo acabo de subir y tiene el ejemplo completito de cómo subir archivos: https://github.com/alex-arriaga/uploading-files-with-cakephp.
      Saludos.

    2. Ahora bien si estás usando otro componente o plugin, entonces ya el proceso debe ser diferente, no conozco muy bien la programación por dentro de todos los componentes pero con el ejemplo que te pasé puedes darte una idea de cómo funcionan 🙂 ¿cuál componente o plugin estás usando?

      1. Hola otra vez Alex. Yo vi otro video https://www.youtube.com/watch?v=79O2mzymvQ0 donde muestran como subir imagenes sin subir otros componentes. Pero tengo un problema me puedes ayudar?.

        Can not determine the mimetype.

        Error: An Internal Error Has Occurred.
        Stack Trace

        [internal function] → Validation::mimeType(array, array)

        array(
        ‘name’ => ‘Logo.gif’,
        ‘type’ => ‘image/gif’,
        ‘tmp_name’ => ‘C:\wamp\tmp\php5DC.tmp’,
        ‘error’ => (int) 0,
        ‘size’ => (int) 5312
        )
        array(
        (int) 0 => ‘image/gif’,
        (int) 1 => ‘image/bmp’,
        (int) 2 => ‘image/jpeg’,
        (int) 3 => ‘image/pjpeg’,
        (int) 4 => ‘image/png’

        Yo tengo en el modelo asi:

        ‘image’ => array(
        ‘fileSize’ => array(
        ‘rule’ => array(‘fileSize’, ‘ ‘Image must be less than 1MB’,
        ‘allowEmpty’ => true,
        //’required’ => false,
        //’last’ => false, // Stop validation after this rule
        //’on’ => ‘create’, // Limit validation to ‘create’ or ‘update’ operations
        ),
        ‘uploadError’ => array(
        ‘rule’ => array(‘uploadError’),
        ‘message’ => ‘Something went wrong with the upload’,
        ‘allowEmpty’ => true,
        //’required’ => false,
        //’last’ => false, // Stop validation after this rule
        //’on’ => ‘create’, // Limit validation to ‘create’ or ‘update’ operations
        ),
        ‘mimeType’ => array(
        ‘rule’ => array(‘mimeType’, array(‘image/gif’ , ‘image/bmp’ , ‘image/jpeg’ , ‘image/pjpeg’ , ‘image/png’)),
        ‘message’ => ‘Please only upload images (gif, bmp, jpeg, pjpeg, png)’,
        ‘allowEmpty’ => true,
        //’required’ => false,
        //’last’ => false, // Stop validation after this rule
        ‘on’ => ‘create’, // Limit validation to ‘create’ or ‘update’ operations
        ),
        ‘processImageUpload’ => array(
        ‘rule’ => ‘processImageUpload’,
        ‘message’ => ‘Unable to process image upload’,
        ‘allowEmpty’ => true,
        ),
        ),
        y

        public function processImageUpload($check = array()){
        if(!is_uploaded_file($check[‘image’][‘tmp_name’])){
        return FALSE;
        }
        if(!move_uploaded_file($check[‘image’][‘tmp_name’], $check[‘image’][‘name’])){
        return FALSE;
        }
        $this->data[‘image’] = $check[‘image’][‘name’];
        return TRUE;
        }

        1. Ya veo, sinceramente es una situación complicada de determinar, pues necesitaría tener acceso a tu archivo de log de apache para verificar con exactitud qué está pasando. ¿Hás visto el ejemplo de cómo subir archivos que tengo en mi cuenta de github?

          Ahí tengo un demo funcionando de cómo hacerlo: https://github.com/alex-arriaga/uploading-files-with-cakephp

          Si sigues teniendo problemas, instala team viewer en tu máquina, envíame un tweet y puedo ayudarte directamente en tu computadora, pues de otra forma me es complicado saber qué puede estar pasando.
          Saludos.

          1. Hola otra vez Alex!
            Yo hice lo siguiente, actualice mi cake php y volvi a hacer todo, ahora me saca otro error:
            Notice (8): Array to string conversion [CORE\Cake\Model\Datasource\DboSource.php, line 1009]

            CakePHP: the rapid development php framework
            Welcome edita, Logout
            Database Error

            Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘Array’ in ‘field list’

            SQL Query: INSERT INTO `tjanst`.`ws_users` (`modified`, `active`, `name`, `lastname`, `createdby`, `username`, `password`, `role_id`, `adress`, `postcode`, `city`, `phone`, `mobil`, `epost`, `personid`, `occupation`, `gender`, `image_dir`, `css`, `info`, `answer`, `image`, `created`) VALUES (‘CURRENT_TIMESTAMP’, ‘1’, ‘Luz Helena’, ‘Wallin’, NULL, ‘lucy63’, ‘0ffb4eb692770c4354d533e1faee92f7ab06aa5b’, 6, ”, 11111, ”, ”, ‘076-8888888’, ‘lucy@gmail.com’, ”, ”, ‘f’, ”, ”, ”, ”, Array, ‘2014-05-22 07:57:59’)

            Notice: If you want to customize this error message, create wserv\View\Errors\pdo_error.ctp
            Stack Trace

            Yo hice en el modelo asi:

            ‘image’ => array(
            ‘extension’ => array(
            ‘rule’ => array(‘extension’, array(‘gif’, ‘jpeg’, ‘png’, ‘jpg’)),
            ‘message’ => ‘Invalid file extension.’,
            ‘allowEmpty’ => true,
            //’required’ => false,
            //’last’ => false, // Stop validation after this rule
            //’on’ => ‘create’, // Limit validation to ‘create’ or ‘update’ operations
            ),
            ‘fileSize’ => array(
            ‘rule’ => array(‘fileSize’, ‘ ‘Image must be less than 1MB’,
            ‘allowEmpty’ => true,
            //’required’ => false,
            //’last’ => false, // Stop validation after this rule
            //’on’ => ‘create’, // Limit validation to ‘create’ or ‘update’ operations
            ),
            ‘mimeType’ => array(
            ‘rule’ => array(‘mimeType’, array(‘image/gif’, ‘image/jpg’, ‘image/png’, ‘image/jpeg’)),
            ‘message’ => ‘Invalid mime type.’,
            ‘allowEmpty’ => true,
            //’required’ => false,
            //’last’ => false, // Stop validation after this rule
            //’on’ => ‘create’, // Limit validation to ‘create’ or ‘update’ operations
            ),
            ‘uploadError’ => array(
            ‘rule’ => array(‘uploadError’),
            ‘message’ => ‘Your custom message here’,
            ‘allowEmpty’ => true,
            //’required’ => false,
            //’last’ => false, // Stop validation after this rule
            //’on’ => ‘create’, // Limit validation to ‘create’ or ‘update’ operations
            ),
            ‘processImageUpload’ => array(
            ‘rule’ => ‘processImageUpload’,
            ‘message’ => ‘Unable to process image upload’,
            ‘allowEmpty’ => true,
            ),
            ),
            );

            // Match Password

            public function matchPasswords($data) {
            if ($data[‘password’] == $this->data[‘User’][‘password_confirmation’]) {
            return true;
            }
            $this->invalidate(‘password_confirmation’, ‘Your passwords do not match’);
            return false;
            }

            public function beforeSave($options = array()) {
            if (isset($this->data[‘User’][‘password’])) {
            $this->data[‘User’][‘password’] = AuthComponent::password(
            $this->data[‘User’][‘password’]
            );
            }
            return true;
            }

            // image upload

            public function processImageUpload($check = array()){
            if(!is_uploaded_file($check[‘image’][‘tmp_name’])){
            return FALSE;
            }
            if(!move_uploaded_file($check[‘image’][‘tmp_name’], $check[‘image’][‘name’])){
            return FALSE;
            }
            $this->data[‘image’] = $check[‘image’][‘name’];
            // $this->data[‘image_dir’] = ‘img/uploads/users’;
            return TRUE;
            }
            En el controler asi:
            public function add() {
            if ($this->request->is(‘post’)) {
            $this->User->create();
            $data = $this->request->data[‘User’];
            if(!$data[‘image’][‘name’]) {
            unset($data[‘image’]);
            }
            if ($this->User->save($data)) {
            $this->Session->setFlash(__(‘The user has been saved.’));
            return $this->redirect(array(‘action’ => ‘index’));
            } else {
            $this->Session->setFlash(__(‘The user could not be saved. Please, try again.’));
            }
            }
            $roles = $this->User->Role->find(‘list’);
            $this->set(compact(‘roles’));
            }
            el edit es parecido y la vista es así:

            Form->create(‘User’, array(‘type’ => ‘file’)); ?>

            Form->input(‘name’);
            echo $this->Form->input(‘lastname’);
            echo $this->Form->input(‘createdby’);
            echo $this->Form->input(‘username’);
            echo $this->Form->input(‘password’);
            echo $this->Form->input(‘password_confirmation’, array (‘type’ => ‘password’));
            echo $this->Form->input(‘role_id’, array(‘default’ => ‘6’));
            echo $this->Form->input(‘adress’);
            echo $this->Form->input(‘postcode’);
            echo $this->Form->input(‘city’);
            echo $this->Form->input(‘phone’);
            echo $this->Form->input(‘mobil’);
            echo $this->Form->input(‘epost’);
            echo $this->Form->input(‘personid’);
            echo $this->Form->input(‘occupation’);
            echo $this->Form->input(‘gender’, array(‘options’ => array(‘m’ => ‘male’,’f’ => ‘female’, ‘o’ => ‘other’), ‘default’ => ‘m’));
            echo $this->Form->input(‘active’);
            echo $this->Form->input(‘image’, array(‘type’ => ‘file’));
            echo $this->Form->input(‘image_dir’, array(‘type’ => ‘hidden’));
            echo $this->Form->input(‘css’);
            echo $this->Form->input(‘info’);
            echo $this->Form->input(‘answer’);
            ?>

            Form->end(__(‘Submit’)); ?>
            Espero me puedas ayudar con esta información.

          2. Hola Alex!
            Ya encontre la solución a el problema que tenía. Pero ahora tengo otro y estoy un poco perdida a que se refiere.

            Fatal Error
            Error: Unsupported operand types
            File: C:\wamp\www\cake\lib\Cake\View\Helper\FormHelper.php
            Line: 1802
            Ojala entiendas a q se refiere o q es lo q estoy haciendo mal.

          3. Ese error es de PHP y ocurre cuando utilizas algún operando inválido en alguna operación matemática, por ejemplo si estas dividiendo una variable sobre otra:

            $c = $a / $b;

            Pero si $a es un arreglo, entonces es inválido pues la operación división te pide dos números.
            ¿Qué línea de código es la que te está originando esto?
            ¿Cuándo comenzó a aparecer?

            Saludos.

  12. Hola Álex, soy un principiante en cakephp, no tengo estudios de programación pero ya he hecho muchas cosas de forma autodidacta con php y mysql, ahora que estoy entrando al cake me doy cuenta de que me falta saber mucho y por lo tanto me encuentro con cosas que no se resolver, me podrías ayudar con lo siguiente: hice el view para edición de registros de la base de datos, pero necesito pasarle el valor de uno de los campos de manera fija. Para la creación de un nuevo registro ya logré hacerlo. El registro tiene 4 campos, uno de ellos es “state”, tipo: enum(‘original’, ‘corrected’, ‘deleted’), En el add lo hice de la siguiente manera:
    $this->Form->input(‘state’, array(‘default’=>’original’));

    pero en el edit no me funciona, y he probado otras cosas como el “selected”, pero nada, el asunto es que si edito un registro, este vendrá con “original” en el “state” y una vez editado, debo cambiarlo automáticamente a “corrected”

    Bueno, espero no quitarte mucho tiempo, un saludo de un chileno en barcelona (spain) y muchísimas gracias.

  13. Hola alex buena tarde, he estado viendo tu video tutorial en youtube acerca de cakephp para principiantes, y quisiera saber si puedes ayudarme a aclarar una duda, especificamente como puedo hacer una consulta y extraer todos los datos registrados a varias tablas, 2 por ejemplo, ya realize el ejemplo que explicas en el video de la BD university con la tabla students y si me extrae todos los registros que tengo en la base de datos en la BD. pero unicamente de la tabla que esta dada de alta que solo es 1, en base a este codigo que es el que explicas
    esta esta en mi vista index

    ID
    NOMBRE
    APELLIDOS

    y esto en el controller
    public function index(){
    $params=array(‘order’ => ‘Id’);
    $this->set(‘estudiantes’,$this->Student->find(‘all’, $params));
    }
    de antemano agradezco tu atencion y espero puedas ayudarme a aclarar esta duda
    saludos.

    1. Gracias…. ya solucione ese problema, escribo la solución por si alguien mas se topa con ese proble,a
      en el controller llamado EventosController dentro de la función donde declaro la consulta a la base de datos llamado listado que a las vez es mi vista imprimo lo que me esta arrojando dicha consulta de la sig manera
      $this->set(‘datos’,$this->Evento->find(‘all’ ));
      pr($this->Evento->find(‘all’)); array(
      ‘className’ => ‘Recinto’,
      ‘foreignKey’ => ‘fkrecinto’
      ),
      ‘Categoria’ => array(
      ‘className’ => ‘Categoria’,
      ‘foreignKey’ => ‘fkcategoria’
      )
      );
      var $hasMany = array(
      ‘Enlace’ => array(
      ‘className’ => ‘Enlace’,
      ‘foreignKey’ => ‘fkevento’,
      ‘dependent’ => false
      ),
      ‘Asistencia’ => array(
      ‘className’ => ‘Asistencia’,
      ‘foreignKey’ => ‘fkevento’,
      ‘dependent’ => false
      ),
      ‘Vinculado’ => array(
      ‘className’ => ‘Vinculado’,
      ‘foreignKey’ => ‘fkevento’,
      ‘dependent’ => false
      ),
      ‘Banner’ => array(
      ‘className’ => ‘Banner’,
      ‘foreignKey’ => ‘fkevento’,
      ‘dependent’ => false
      ),
      ‘Fecha’ => array(
      ‘className’ => ‘Fecha’,
      ‘foreignKey’ => ‘fkevento’,
      ‘dependent’ => false
      ),
      ‘Fichatecnica’ => array(
      ‘className’ => ‘Fichatecnica’,
      ‘foreignKey’ => ‘fkevento’,
      ‘dependent’ => false
      ),
      ‘Sujeto’ => array(
      ‘className’ => ‘Sujeto’,
      ‘foreignKey’ => ‘fkevento’,
      ‘dependent’ => false
      )
      );
      }
      ?>
      y finalmente en el archivo de mi vista llamado listado
      los imprimo de la sig manera usando un ciclo foreach

      id
      titulo
      Categoria
      Lugar
      Fecha Inicio
      Fecha Fin

      opciones

      editar Elimnar

      seguire viendo los tutoriales y ahora el siguiente paso es una vez listados todos los datos que necesito es darle las opciones para editar y eliminar en caso de que el usuario asi lo requiera, espero encontrar esa solucion, cualquier tip es bienvenido
      saludos.

    2. ¿Qué otros datos del estudiante te interesan? ¿Los cursos a los que está inscrito?
      Si es así, únicamente debes verificar que tus tablas estén correctamente relacionadas y automáticamente CakePHP te regresará los resultados con el método find()

  14. Buenos Dias

    Primero que todo quiero felicitarte y agradecerte por los tutoriales de cakephp hn sido un apoyo para aprender cada dia mas de cake.
    alex arriaga quisiera saber si me podrias colaborar con algo que no me da espero que sea por este medio o sino me dices por cual.

    Mi duda es la siguiente. Estoy cargando un archivo en excel para subir registros masiva mente, tengo cuatro tablas las cuales usuarios, usuarioroles y usuariocursos tienen relación y la cuarta que es estado tiene solo relación con usuariocurso. entonces en el excel tengo todos loc campor del usuario y adicione uno que se llama estado, entonces tengo el siguiente codigo

    private function processData($data,$curso) {
    $this->checkPermission(array(“Administrador”));
    $dataProcess = array();
    foreach ($data as $dato) {
    $valid = true;
    if ($dato[0] == “” || !is_numeric($dato[0])) {
    $dato[‘Error’] = 1;
    $dato[‘mensage’] = “Error – Campo Descripcion: Rango no valido ” . $dato[0];
    $valid = false;
    } else {
    $conditions = array(‘Usuario.documento’ => $dato[0]
    );
    if ($dato[2] == “” && !notEmpty($dato[2])) {
    $dato[‘Error’] = 2;
    $dato[‘mensage’] = “Error – Campo ingresado esta vacio”;
    $valid = false;
    } else {

    }
    if ($dato[3] == “” || !strlen($dato[3])) {
    $dato[‘Error’] = 3;
    $dato[‘mensage’] = “Error – Campo ingresado esta vacio” . $dato[3];
    $valid = false;
    } else {

    }

    // if ($dato[6] == “” || !Validation::email($dato[6])) {
    // $dato[‘Error’] = 6;
    // $dato[‘mensage’] = “Error – Campo ingresado esta vacio”;
    // $valid = false;
    // } else {
    // $conditions = array(‘Usuarios.correo)’ => $dato[6]);
    // }

    if ($this->Usuario->hasAny($conditions)) {
    $dato[‘Error’] = 6;
    $dato[‘mensage’] = “Error – Campo ingresado ya existe”;
    $valid = false;
    }
    }
    if ($valid) {
    try {
    $this->request->data[‘Usuario’][‘documento’] = $dato[0];
    $this->request->data[‘Usuario’][‘nombres’] = strtoupper($dato[1]);
    $this->request->data[‘Usuario’][‘apellidos’] = strtoupper($dato[2]);
    $this->request->data[‘Usuario’][‘celular’] = ($dato[3]);
    $this->request->data[‘Usuario’][‘telefono’] = ($dato[4]);
    $this->request->data[‘Usuario’][‘correo’] = strtoupper($dato[5]);
    $this->request->data[‘Usuario’][‘tipodocumento’] = strtoupper($dato[6]);
    $this->request->data[‘Usuario’][‘clave’] = $dato[0];
    $this->request->data[‘Usuario’][‘activo’] = 1;
    $this->request->data[‘Usuario’][‘vinculacion’] = 1;

    $this->Usuario->create();
    if ($this->Usuario->save($this->request->data)) {
    $dato[‘Status’] = ‘ok’;
    $this->Usuario->Usuariorole->create();
    $data[‘Usuariorole’][‘usuario_id’] = $this->Usuario->id;
    $data[‘Usuariorole’][‘role_id’] = 5;
    $data[‘Usuariorole’][‘activo’] = 1;
    $data[‘Usuariocursos’][”] = 1;
    $this->Usuario->Usuariorole->save($data);

    $this->Usuario->Usuariorole->Usuariocurso->create();
    $estado = $this->Usuariocurso->Estado->find(“first”, array(‘fields’ => (‘Estado.id’), ‘conditions’ => array(‘Estado.nombre like’ => $dato[10])));
    $data2[‘Usuariocurso’][‘curso_id’] = $curso;
    $data2[‘Usuariocurso’][‘estado_id’] = $estado;
    $data2[‘Usuariocurso’][‘usuariorole_id’] = $this->Usuario->Usuariorole->id;
    $this->Usuario->Usuariorole->Usuariocurso->save($data2);

    } else {
    $dato[‘Error’] = 1;
    $dato[‘mensage’] = “Error – Campos correctos, pero no fueron registrados con exito”;
    }
    $dato[‘Status’] = ‘ok’;
    } catch (PDOException $e) {
    $dato[‘Error’] = 2;
    $dato[‘mensage’] = “Error – Campo Descripcion: No fue posible ingresar este dato”;
    }
    }
    $dataProcess[] = $dato;
    }
    return $dataProcess;
    }

    }

    Bueno que quiero y que hago con este codigo es guardar los datos que entren masivamnete se guerden en las tablas respetivamente en usuarios todos lo campos menos el de estado(porq menos este por estos ya estan dentro de esta tabla estados lo que se debe hacer es comparar lo que entra con lo esta en la tabla y guardar en usuarios curso el id del estado correspondiente a cada registro ), en usuarioroles en usuariocurso el id del rol y del estado.

    y aqui te paso muestro de lo q ya envie en donde estoy haciendo eso.

    $this->Usuario->create();
    if ($this->Usuario->save($this->request->data)) {
    $dato[‘Status’] = ‘ok’;
    $this->Usuario->Usuariorole->create();
    $data[‘Usuariorole’][‘usuario_id’] = $this->Usuario->id;
    $data[‘Usuariorole’][‘role_id’] = 5;
    $data[‘Usuariorole’][‘activo’] = 1;
    $data[‘Usuariocursos’][”] = 1;
    $this->Usuario->Usuariorole->save($data);

    $this->Usuario->Usuariorole->Usuariocurso->create();
    $estado = $this->Usuariocurso->Estado->find(“first”, array(‘fields’ => (‘Estado.id’), ‘conditions’ => array(‘Estado.nombre like’ => $dato[10])));
    $data2[‘Usuariocurso’][‘curso_id’] = $curso;
    $data2[‘Usuariocurso’][‘estado_id’] = $estado;
    $data2[‘Usuariocurso’][‘usuariorole_id’] = $this->Usuario->Usuariorole->id;
    $this->Usuario->Usuariorole->Usuariocurso->save($data2);

    Nose si me hayas entendido espero que si, y sino para saber si podria a ver otro medio para explicar mi duda mejor

  15. hola Alex realmente tus videos son excelentes… he comenzado a desarrollar un sistema en cakephp y tus explicaciones me han salvado la vida jaja… tengo una duda: tengo un campo date en la base de datos y cuando lo cargo en el formulario me muestra los meses en ingles, ademas quiero agregar mas años porque el select comienza en 1994 y lo uso para fechas de nacimiento… como puedo solucionarlo, esta es la línea
    echo $this->Form->input(‘fecha_nac’,array(‘dateFormat’=>’DMY’));
    mil gracias desde ya por tu tiempo y dedicación

  16. Buenas Alex-arriaga,
    Me puede ayudar? estoy teniendo un problema raro con cakephp en mi maquina local me funciona pero al subir en un hosting no, el problema es que no me detecta la accion y me dice que no existe esa accion en el controller.

    Error: The action vacaciones is not defined in controller InfoEmpleadosController

    Desde ya gracias por los vídeos.

    Saludos,

  17. Hola Alex: tengo un problema, cuando cargo la foto en el servidor esta queda en la ruta wamp/www/wserv/webroot. Pero cuando trato de mostrarlas el busca la foto en la ruta wamp/www/wserv/img/ que realmente la lleva es a la ruta wamp/www/wserv/webroot/img. Yo se que tiene q ver con las rutas pero no se como hacerlo. Yo tenía primero ruta Configure::write(‘App.imageBaseUrl’, ‘img/uploads’) en core. Pero como no me funcionaba la quite y se supone q esta con el estandar de cake php. La cual creo es wamp/www/wserv/webroot/img. Pero no entiendo que es lo que hago mal. Yo te podría mostrar mis archivos si tu quieres, envíame un mensaje tu tienes mi correo. De antemano gracias por tu ayuda.

        1. Hola buen día, ¿qué versión de CakePHP estás usando? Esto porque l a variable global App.imageBaseUrl funciona correctamente a partir de la versión 2.4.x.

          Me gustaría ver tu código. ¿Lo tienes en github?

          Saludos.

  18. Alex,
    Tenemos un proyecto interesante para un experto en CakePHP. Veo que al parecer tu tienes bastante experiencia en este framework. Es un sistema eCommerce que está avanzado al 80% y necesitamos un desarrollador senior para recibirlo, mejorarlo y completarlo. Luego deberá definir el roadmap para las siguientes versiones y pasar la estafeta a desarrolladores más junior (y continuar periódicamente supervisándolos).
    Puede ser ejecutado de manera freelance. Requerimos que se pueda dedicarle unas 3 horas diarias más o menos. Creemos que se puede realizar en 1 o 2 meses por alguien que la mueva bien.

    Te interesa que platiquemos un poco más (sin compromiso) para conocernos y ver si tu puedes tomarlo?
    En caso de que no puedas, tal vez puedas recomendarnos a alguien también experto en CakePHP.

    Gracias de antemano,

    Rene Bravo

  19. Buen Dia saludos desde venezuela necesito una ayuda estoy tratando de implementar un CRUD con ventanas modales(Bootstrap 3) el de agregar me funciona a la perfeccion pero el de editar registros NO solo permite el primero que le doy click en el index, cuando intento editar otro registro me vuelve y muestra el que le di click, tengo que actualizar la pagina para que me pueda tomar otro diferente, de antemano gracias

    1. Por lo que veo tienes un problema más bien de JavaScript es decir, recuerda que todo el código que usas para tu modal con Bootstrap 3 se ejecuta del lado del cliente y por lo tanto tu como desarrollador tienes la responsabilidad de actualizar todo lo necesario, en este caso lo que debes manipular es el evento de “show.bs.modal” con algo de código como esto:


      $('#myModal').on('show.bs.modal', function (e) {
      // Aquí poner tu formulario o lo que gustes que se "actualice" cada que el modal se abra
      });

      ¿Tienes tu código en algún lugar como Github?
      Saludos.

  20. Hola Alex, encontré uno de tus videos en youtube dando un repaso de POO en PHP y me gustó mucho la forma en que lo explicaste, me gustaría que hicieras uno explicando el MVC también en PHP y tal vez haciendo un ejemplo sencillo, un saludo y excelente contenido.

    1. Que tal Roberto,

      Me alegra saber que el material que generamos te ha sido de utilidad, por lo que me comentas sobre MVC, ya ha pasado un tiempo que no hemos grabado nuevo material, pero estamos pensando en regresar a inicios de 2023.

      Saludos!

Leave a Reply

Your email address will not be published. Required fields are marked *