Subir imágenes y datos con el mismo formulario html

Read More
Actualizar foto de perfil
Actualizar foto de perfil

¡Hola Kumbieros! Hoy les traigo un tutorial básico para quienes deseen conocer como subir imágenes y datos con el mismo formulario. Es una pregunta recurrente que hemos tenido en nuestro chat de Slack y no es sencilla de responder por ese medio, por eso les presentaré un ejemplo práctico de la creación y actualización de usuario con foto de perfil.

Crearemos un modelo, un controlador y tres vistas, usaremos la librería Upload incluida en KumbiaPHP para gestionar la subida del archivo. Al final dejo el enlace con el código fuente en un repositorio en Github para que puedan ver el ejemplo completo, incluso descargarlo y ponerlo a funcionar.

Base de datos

Lo primero es la tabla en la base de datos:


CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL DEFAULT '0',
  `email` varchar(255) NOT NULL,
  `photo` varchar(255) DEFAULT 'default.png',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Modelo

Ahora el modelo que hereda de ActiveRecord para que nos de la capacidad de operaciones con la tabla de la base de datos:

Archivo: app/models/user.php


<?php

/**
* Clase para manejar los datos del usuario, tabla 'user'
*/
class User extends ActiveRecord 
{

}

Controlador

Ahora el controlador que nos permitirá pasar y recibir datos de las vistas. Arrancaremos con el listado de usuarios y para esto creamos la función index.

Archivo: app/controllers/user_controller.php


<?php
/**
 * Controlador para las acciones y vistas con el usuario
 */
class UserController extends AppController
{

    public function index()
    {
        $this->data = (new User)->find();
    }
}

Vistas

Y su respectiva vista.

Archivo: app/views/user/index.phtml


<h1>Lista de usuarios</h1>
<?= Html::linkAction('create', 'Crear', 'class="button"') ?>
<?php View::content() ?>
<?php if (count($data)) { ?>
    <table class="u-full-width">
        <thead>
            <tr>            
                <th>Nombre</th>
                <th>Edad</th>
                <th>Correo</th>
                <th>Foto</th>
                <th>Acciones</th>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($data as $item) { ?>
                <tr>
                    <td><?= $item->name ?></td>
                    <td><?= $item->age ?></td>
                    <td><?= $item->email ?></td>
                    <td><?= $item->photo ?></td>
                    <td><?= Html::linkAction("edit/$item->id", 'Editar') ?> | <?= Html::linkAction("update_photo/$item->id", 'Actualizar foto') ?></td>
                </tr> 
            <?php } ?>        
        </tbody>
    </table>
<?php } else { ?>
    <h2>No hay ningún registro</h2>
<?php } ?>

Continue reading «Subir imágenes y datos con el mismo formulario html»

Preguntas resueltas en Slack 2

Read More

En estas semanas las dudas que hemos resuelto han sido bastante específicas y la mayoría no eran aptas para ser incluidas en este artículo, por ello he tardado más en reunir el material suficiente para realizar un nuevo post.

A pesar de lo anterior, el texto está listo y ha quedado bastante jugoso, así que no los haré esperar más y los dejaré con el compendio de  preguntas resueltas:

¿Cómo hacer un confirm alert? Pregunta ycaicedo

Este ejemplo es con javascript usando el helper Html::link() o Html::linkAction() que permite mostrar primero un diálogo de confirmación al usuario, aunque es fácil de saltar, por ejemplo si el usuario desactiva javascript en el navegador:

<?= Html::linkAction("borrar/$item->id", 'Borrar', 'onclick="return confirm(\'¿Está seguro?\')"') ?>

¿KumbiaPHP soporta CamelCase en el nombre de tablas? Pregunta abriceno

Con el atributo $source de la clase ActiveRecord se le puede indicar a que tabla consultar, pero el desarrollador debe acordarse de hacer el cambio.Ejemplo:


<?php

class MateriaPrima extends ActiveRecord {

    //Tabla utilizada para realizar el mapeo
    protected $source = 'MateriaPrima';
}

¿Cómo le inserto una clase a un select generado con Form::dbSelect()? Pregunta jerson.fuentes

El helper Form::dbSelect() tiene los siguientes argumentos:

Form::dbSelect(campo_id, campoAMostrar,array(modelo,metodo),"Seleccione",atributos)

Ejemplo:


Form::dbSelect("lotes.lotes_categorias_id","nombrecategoria",null,"Seleccione",'class="form-control"');

Saben como después de actualizar un dato, redirigirme a la vista anterior

Para redireccionar en KumbiaPHP existe la clase Redirect

Ejemplo de uso de Redirect::to()
Ejemplo de uso de Redirect::to()

La redirección se puede hacer con Redirect::to() antecedido con un return para que sea lo último que ejecute.

Recomendaciones de joanhey

Mitos sobre el rendimiento de PHP

Busted! 10 Performance Myths you should avoid. Es una presentación muy recomendable de Thomas Lohner de SysEleven GmbH que en 2015 en una charla menciona los 10 mitos sobre mejorar el rendimiento que se deben evitar.

Lo más importante es usar bien las herramientas.

HTTPie un buen sustituto de Curl

HTTPie es una app que funciona en Linux, MacOs y Windows. Es muy útil como sustituto de Curl.

Nos permite fácilmente probar nuestros servidores, API RESTful y web services.