13.- Agregar imagenes (multiples) a nuestros productos en PHP
En este tutorial vamos a agregar imagenes (multiples) a nuestros productos en PHP via datatable con este codigo:
Codigo: https://github.com/programadornovato/ecommerce/commit/a50957403ebaa80a802953e6b57b21abcd8f5773
admin/productos.php
<?php include_once "db_ecommerce.php"; $con = mysqli_connect($host, $user, $pass, $db); ?> <!-- Content Wrapper. Contains page content --> <div class="content-wrapper"> <!-- Content Header (Page header) --> <section class="content-header"> <div class="container-fluid"> <div class="row mb-2"> <div class="col-sm-6"> <h1>Productos</h1> </div> </div> </div><!-- /.container-fluid --> </section> <!-- Main content --> <section class="content"> <div class="row"> <div class="col-12"> <div class="card"> <!-- /.card-header --> <div class="card-body"> <table id="tablaProductos" class="table table-bordered table-hover"> <thead> <tr> <th>Nombre</th> <th>Precio</th> <th>Existencia</th> <th>Imagen(es)</th> </tr> </thead> </table> </div> <!-- /.card-body --> </div> <!-- /.card --> </div> <!-- /.col --> </div> <!-- /.row --> </section> <!-- /.content --> </div>
admin/panel.php
<!DOCTYPE html> <html> <?php session_start(); session_regenerate_id(true); if( isset($_REQUEST['sesion']) && $_REQUEST['sesion']=="cerrar" ){ session_destroy(); header("location: index.php"); } if (isset($_SESSION['id']) == false) { header("location: index.php"); } $modulo=$_REQUEST['modulo']??''; ?> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>My ecommerce by pn</title> <!-- Tell the browser to be responsive to screen width --> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- Font Awesome --> <link rel="stylesheet" href="plugins/fontawesome-free/css/all.min.css"> <!-- Ionicons --> <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <!-- Tempusdominus Bbootstrap 4 --> <link rel="stylesheet" href="plugins/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css"> <!-- iCheck --> <link rel="stylesheet" href="plugins/icheck-bootstrap/icheck-bootstrap.min.css"> <!-- JQVMap --> <link rel="stylesheet" href="plugins/jqvmap/jqvmap.min.css"> <!-- Theme style --> <link rel="stylesheet" href="dist/css/adminlte.min.css"> <!-- overlayScrollbars --> <link rel="stylesheet" href="plugins/overlayScrollbars/css/OverlayScrollbars.min.css"> <!-- Daterange picker --> <link rel="stylesheet" href="plugins/daterangepicker/daterangepicker.css"> <!-- summernote --> <link rel="stylesheet" href="plugins/summernote/summernote-bs4.css"> <!-- Google Font: Source Sans Pro --> <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet"> <!-- DataTables --> <!-- <link rel="stylesheet" href="plugins/datatables-bs4/css/dataTables.bootstrap4.css"> --> <link rel="stylesheet" href="https://cdn.datatables.net/1.10.20/css/jquery.dataTables.min.css"> <link rel="stylesheet" href="https://cdn.datatables.net/buttons/1.6.1/css/buttons.dataTables.min.css"> <link rel="stylesheet" href="https://cdn.datatables.net/select/1.3.1/css/select.dataTables.min.css"> <link rel="stylesheet" href="css/editor.dataTables.min.css"> </head> <body class="hold-transition sidebar-mini layout-fixed"> <div class="wrapper"> <!-- Navbar --> <nav class="main-header navbar navbar-expand navbar-white navbar-light"> <!-- Left navbar links --> <ul class="navbar-nav"> <li class="nav-item"> <a class="nav-link" data-widget="pushmenu" href="#"><i class="fas fa-bars"></i></a> </li> </ul> <!-- Right navbar links --> <ul class="navbar-nav ml-auto"> <!-- Messages Dropdown Menu --> <a class="nav-link" href="panel.php?modulo=editarUsuario&id=<?php echo $_SESSION['id']; ?>"> <i class="far fa-user"></i> </a> <a class="nav-link text-danger" href="panel.php?modulo=&sesion=cerrar" title="Cerrar sesion" > <i class="fas fa-door-closed "></i> </a> </ul> </nav> <!-- /.navbar --> <!-- Main Sidebar Container --> <aside class="main-sidebar sidebar-dark-primary elevation-4"> <!-- Brand Logo --> <a href="#" class="brand-link"> <img src="dist/img/pn icono.png" alt="AdminLTE Logo" class="brand-image img-circle elevation-3" style="opacity: .8"> <span class="brand-text font-weight-light">My ecommerce</span> </a> <!-- Sidebar --> <div class="sidebar"> <!-- Sidebar user panel (optional) --> <div class="user-panel mt-3 pb-3 mb-3 d-flex"> <div class="info"> <a href="#" class="d-block"><?php echo $_SESSION['nombre']; ?></a> </div> </div> <!-- Sidebar Menu --> <nav class="mt-2"> <ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false"> <!-- Add icons to the links using the .nav-icon class with font-awesome or any other icon font library --> <li class="nav-item has-treeview menu-open"> <a href="#" class="nav-link active"> <i class="fa fa-shopping-cart nav-icon" aria-hidden="true"></i> <p> Ecommerce </p> </a> <ul class="nav nav-treeview"> <li class="nav-item"> <a href="panel.php?modulo=estadisticas" class="nav-link <?php echo ($modulo=="estadisticas" || $modulo=="" )?" active ":" "; ?>"> <i class="fas fa-chart-bar nav-icon "></i> <p>Estadisticas</p> </a> </li> <li class="nav-item"> <a href="panel.php?modulo=usuarios" class="nav-link <?php echo ($modulo=="usuarios" || $modulo=="crearUsuario" || $modulo=="editarUsuario" )?" active ":" "; ?>"> <i class="far fa-user nav-icon"></i> <p>Usuarios</p> </a> </li> <li class="nav-item"> <a href="panel.php?modulo=productos" class="nav-link <?php echo ($modulo=="productos" )?" active ":" "; ?>"> <i class="fa fa-shopping-bag nav-icon" aria-hidden="true"></i> <p>Productos</p> </a> </li> <li class="nav-item"> <a href="panel.php?modulo=ventas" class="nav-link <?php echo ($modulo=="ventas" )?" active ":" "; ?>"> <i class="fa fa-table nav-icon" aria-hidden="true"></i> <p>Ventas</p> </a> </li> </ul> </nav> <!-- /.sidebar-menu --> </div> <!-- /.sidebar --> </aside> <?php if(isset($_REQUEST['mensaje'])){ ?> <div class="alert alert-primary alert-dismissible fade show float-right" role="alert"> <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true">×</span> <span class="sr-only">Close</span> </button> <?php echo $_REQUEST['mensaje'] ?> </div> <?php } if($modulo=="estadisticas" || $modulo==""){ include_once "estadisticas.php"; } if($modulo=="usuarios"){ include_once "usuarios.php"; } if($modulo=="productos"){ include_once "productos.php"; } if($modulo=="ventas"){ include_once "ventas.php"; } if($modulo=="crearUsuario"){ include_once "crearUsuario.php"; } if($modulo=="editarUsuario"){ include_once "editarUsuario.php"; } if($modulo=="productos"){ include_once "productos.php"; } ?> </div> <!-- ./wrapper --> <!-- jQuery --> <script src="plugins/jquery/jquery.min.js"></script> <!-- jQuery UI 1.11.4 --> <script src="plugins/jquery-ui/jquery-ui.min.js"></script> <!-- Resolve conflict in jQuery UI tooltip with Bootstrap tooltip --> <script> $.widget.bridge('uibutton', $.ui.button) </script> <!-- Bootstrap 4 --> <script src="plugins/bootstrap/js/bootstrap.bundle.min.js"></script> <!-- ChartJS --> <script src="plugins/chart.js/Chart.min.js"></script> <!-- Sparkline --> <script src="plugins/sparklines/sparkline.js"></script> <!-- JQVMap --> <script src="plugins/jqvmap/jquery.vmap.min.js"></script> <script src="plugins/jqvmap/maps/jquery.vmap.usa.js"></script> <!-- jQuery Knob Chart --> <script src="plugins/jquery-knob/jquery.knob.min.js"></script> <!-- daterangepicker --> <script src="plugins/moment/moment.min.js"></script> <script src="plugins/daterangepicker/daterangepicker.js"></script> <!-- Tempusdominus Bootstrap 4 --> <script src="plugins/tempusdominus-bootstrap-4/js/tempusdominus-bootstrap-4.min.js"></script> <!-- Summernote --> <script src="plugins/summernote/summernote-bs4.min.js"></script> <!-- overlayScrollbars --> <script src="plugins/overlayScrollbars/js/jquery.overlayScrollbars.min.js"></script> <!-- AdminLTE App --> <script src="dist/js/adminlte.js"></script> <!-- AdminLTE dashboard demo (This is only for demo purposes) --> <script src="dist/js/pages/dashboard.js"></script> <!-- AdminLTE for demo purposes --> <script src="dist/js/demo.js"></script> <!-- DataTables --> <!-- <script src="plugins/datatables/jquery.dataTables.js"></script> <script src="plugins/datatables-bs4/js/dataTables.bootstrap4.js"></script> --> <script src="https://cdn.datatables.net/1.10.20/js/jquery.dataTables.min.js"></script> <script src="https://cdn.datatables.net/buttons/1.6.1/js/dataTables.buttons.min.js"></script> <script src="https://cdn.datatables.net/select/1.3.1/js/dataTables.select.min.js"></script> <script src="js/dataTables.editor.min.js"></script> <script> $(function () { $('#example2').DataTable({ "paging": true, "lengthChange": false, "searching": false, "ordering": true, "info": true, "autoWidth": false, }); editor = new $.fn.dataTable.Editor( { ajax: "controllers/productos.php", table: "#tablaProductos", fields: [ { label: "Nombre:", name: "nombre" }, { label: "Precio:", name: "precio" }, { label: "Existencia:", name: "existencia" }, { label: "Imagenes:", name: "files[].id", type: "uploadMany", display: function ( fileId, counter ) { return '<img src="'+editor.file( 'files', fileId ).web_path+'"/>'; }, noFileText: 'No hay imagenes' } ] } ); $('#tablaProductos').DataTable( { dom: "Bfrtip", ajax: "controllers/productos.php", columns: [ { data: "nombre" }, { data: "precio", render: $.fn.dataTable.render.number( ',', '.', 0, '$' ) }, { data: "existencia" }, { data: "files", render: function ( d ) { return d.length ? d.length+' imagen(es)' : 'No hay imagen(es)'; }, title: "Imagen" } ], select: true, buttons: [ { extend: "create", editor: editor }, { extend: "edit", editor: editor }, { extend: "remove", editor: editor } ] } ); }); </script> <script> $(document).ready(function () { $(".borrar").click(function (e) { e.preventDefault(); var res=confirm("Realmente te quieres cargar (borrar) ese usuario?"); if(res==true){ var link=$(this).attr("href"); window.location=link; } }); }); </script> </body> </html>
admin/productos.php
<?php /* * Example PHP implementation used for the index.html example */ // DataTables PHP library include( "../lib/DataTables.php" ); // Alias Editor classes so they are easy to use use DataTables\Editor, DataTables\Editor\Field, DataTables\Editor\Format, DataTables\Editor\Mjoin, DataTables\Editor\Options, DataTables\Editor\Upload, DataTables\Editor\Validate, DataTables\Editor\ValidateOptions; // Build our Editor instance and process the data coming from _POST Editor::inst( $db, 'productos' ) ->fields( Field::inst( 'nombre' ) ->validator( Validate::notEmpty( ValidateOptions::inst() ->message( 'Debe de aingresar un nombre' ) ) ), Field::inst( 'precio' ) ->validator( Validate::numeric() ) ->setFormatter( Format::ifEmpty(null) ), Field::inst( 'existencia' ) ->validator( Validate::numeric() ) ->setFormatter( Format::ifEmpty(null) ) ) ->join( Mjoin::inst( 'files' ) ->link( 'productos.id', 'productos_files.producto_id' ) ->link( 'files.id', 'productos_files.file_id' ) ->fields( Field::inst( 'id' ) ->upload( Upload::inst( $_SERVER['DOCUMENT_ROOT'].'/ecommerce/upload/__ID__.__EXTN__' ) ->db( 'files', 'id', array( 'filename' => Upload::DB_FILE_NAME, 'filesize' => Upload::DB_FILE_SIZE, 'web_path' => Upload::DB_WEB_PATH, 'system_path' => Upload::DB_SYSTEM_PATH ) ) ->validator( Validate::fileSize( 5000000, 'Files must be smaller that 5M' ) ) ->validator( Validate::fileExtensions( array( 'webp','png', 'jpg', 'jpeg', 'gif' ), "Please upload an image" ) ) ) ) ) ->process( $_POST ) ->json();
Tablas
CREATE TABLE files ( id int NOT NULL AUTO_INCREMENT, filename varchar(250) NOT NULL, filesize int NOT NULL, web_path varchar(250) NOT NULL, system_path varchar(250) NOT NULL, PRIMARY KEY (id) ) AUTO_INCREMENT=1; CREATE TABLE productos_files ( producto_id int NOT NULL, file_id int NOT NULL );
🔗Descargar datatable editable: https://editor.datatables.net/download/
🔗Ejemplo de datatable editable muchos archivos: https://editor.datatables.net/examples/advanced/upload-many.html
🎦Curso de PHP🐘 y MySql🐬: https://www.youtube.com/playlist?list=PLCTD_CpMeEKS2Dvb-WNrAuDAXObB8GzJ0
🎦[Curso] Laravel Tutorial en Español: https://www.youtube.com/playlist?list=PLCTD_CpMeEKQcVcM4u4qddLYRE37S_0XS
🎦Curso]Ajax con Jquery de 0 a 100 🌇: https://www.youtube.com/watch?v=52yI0xiB73A&list=PLCTD_CpMeEKSYJ1J15M8PknOMwOpeqsXz
🎦Mysql configurar una replicación maestro – esclavo 🐬: https://www.youtube.com/watch?v=RY-EdBOJWEs
🎦[Curso] Visual Studio Code 🆚 de 0 a 100: https://www.youtube.com/playlist?list=PLCTD_CpMeEKQbdlT8efsS-veXuvYZ1UWn
🎦[Curso] Bootstrap de 0 a 100 🌈: https://www.youtube.com/playlist?list=PLCTD_CpMeEKSVmsZJIumVvfDviuW-c9AT
🎦[Curso] HTML y CSS de 0 a 100 🌐: https://www.youtube.com/playlist?list=PLCTD_CpMeEKS1SmufBGPOV1mjNfCiLwek
🎦 Esta lista de reproducción: https://www.youtube.com/playlist?list=PLCTD_CpMeEKQhRiJx7Wv3pM3rYvT9_CS9 .
Codigos en gdrive: https://drive.google.com/file/d/1QW8ExkL8eS7nQ5HTDvUuSkkGJMSmecGV/view?usp=sharing
Gracias por apoyar este canal: https://www.patreon.com/programadornovato?fan_landing=true
🔗 Facebook: https://facebook.com/ProgramadorNovatoOficial
🔗 Twitter: https://twitter.com/programadornova
🔗 Linkedin: https://www.linkedin.com/in/programadornovato/
🔗 Instagram: https://www.instagram.com/programadornovato/
<<Anterior tutorial Siguiente tutorial >>