Advertisement
FCY381

Sub-Grid

Nov 24th, 2015
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2.  
  3.   //include("funciones_php.php");
  4.   //list($nombre_usuario) = seguridad();
  5.  
  6.   // Le indica al servidor web, y específicamente al módulo PHP, que sirva los archivos .php con codificación UTF8
  7.   //de forma tal que, entre otras cosas, las palabras acentuadas se vean correctamente.
  8.   header('Content-Type: text/html; charset=UTF-8');  
  9.  
  10.   // Indico cual es la zona horaria para nuestra ubicación geográfica.
  11.   date_default_timezone_set('America/Argentina/Buenos_Aires');
  12.  
  13.   // Incluyo el archivo de configuración que contiene la data que permite conectarse a la base de datos en el motor de datos.
  14.   include_once("configuracion_acceso_motor_de_datos.php");
  15.  
  16.   // Con la informacion incluída en "configuracion_acceso_motor_de_datos.php" me conecto efectivamente a la base de datos en el motor de datos.
  17.   mysql_connect(PHPGRID_DBHOST,PHPGRID_DBUSER,PHPGRID_DBPASS);
  18.   mysql_select_db(PHPGRID_DBNAME);
  19.  
  20.   // Le indico al motor de datos que la codificación con la que debe trabajar es UTF8. De esta forma los datos
  21.   //se guardaran y recuperaran con esa codificación.  
  22.   mysql_query ("SET NAMES 'utf8'");
  23.  
  24.   include(PHPGRID_LIBPATH."inc/jqgrid_dist.php");
  25.  
  26. // ALERTA!!!!
  27.   // Recupera la clave del registro que selecciona el usuario en la grilla padre.
  28.   $d_id = $_REQUEST["rowid"];
  29.  
  30.   // Si no se recupera ninguna clave entonces se asigna una por defecto.
  31.   if (empty($d_id)) $d_id = 0;
  32.    
  33.   // Creo una grilla.  
  34.   $g = new jqgrid();
  35.  
  36.   // Le asigno un título a la subgrilla.
  37.   $grid["caption"] = "Aperturas de: ".$_POST["d_nombre"];
  38.  
  39.   // Coloco la barra de opciones en la parte superior de la grilla.
  40.   $grid["toolbar"] = "top";
  41.  
  42.   // Permito la selección de varios registros a la vez.  
  43.   $grid["multiselect"] = true;
  44.  
  45.   // No permito que la grilla se redimensione acompañando la dimensiones del navegador. Es decir si el usuario
  46.   //achica el ancho del navegador entonces la grilla no se achicará en la misma proporsión.
  47.   $grid["autoresize"] = false;
  48.  
  49.   // Si permito que se expanda la grilla al ancho de la pantalla.
  50.   $grid["autowidth"] = true;
  51.  
  52.   // Permito que los registros se muestren en forma descendente. Es decir el primer registro listado será el último que se ingresó.  
  53.   $grid["sortorder"] = "DESC";  
  54.  
  55.   // Indico que anchura debe tener el formulario en el modo "Nuevo Registro".
  56.   $grid["add_options"] = array('width'=>'620');
  57.  
  58.   // Indico que anchura debe tener el formulario en el modo "Edición de un Registro".
  59.   $grid["edit_options"] = array('width'=>'620');
  60.  
  61.   // Indico que anchura debe tener el formulario en el modo "Vista de un Registro".
  62.   $grid["view_options"] = array('width'=>'620');
  63.  
  64.   // Indico que altura debe tener la grilla.
  65.   $grid["height"] = "";
  66.  
  67.   // Indico cual es el mensaje que se debe mostrar cuando se están cargando los registros en la grilla.  
  68.   $grid["loadtext"] = "Cargando ...";
  69.  
  70.   // Indico con que modo voy a trabajar con la grilla; si con páginas de registros o que sólo se carguen registros a medida que el scroll
  71.   //lo vaya pidiendo. Utilizo el último ya que es útil para manejar "records set" de gran tamaño.
  72.   $grid["scroll"] = false;
  73.  
  74.   //  Indico que para la columna "Actions" se utilicen íconos en lugar de palabras.
  75.   $grid["actionicon"] = true;  
  76.  
  77.   // Indico que no se recargue la grilla luego de haberse editado un registro.
  78.   $grid["reloadedit"] = true;
  79.  
  80.   // Indico que no se recargue la grilla luego de haberse insertado un registro.  
  81.   $grid["reloadinsert"] = true;
  82.  
  83.   // Permite que al cerrar el formulario de "Nuevo Registro" se recargue automáticamente toda la página.  
  84.   $grid["add_options"]["afterSubmit"] = "function(){ window.location.reload(); return [true,'']; }";    
  85.  
  86.   // Permite habilitar el mecanismo de subgrilla -- by default 'rowid' (PK) of parent is passed
  87.   $grid["subGrid"] = true;
  88.  
  89.   // Relacionada con la línea anterior, permite indicar la página web que renderiza la subgrilla.    
  90.   $grid["subgridurl"] = "grilla_reservas.php";
  91.  
  92.   // Permite pasar a la página que renderiza la subgrilla la clave del registro que el usuario selecciona.
  93.   $grid["subgridparams"] = "a_id";
  94.   // Permite enviar a la página que renderiza la subgrilla otros campos del registro que el usuario
  95.   //selecciona, y que deben ser recuperados con $_POST.  
  96.   // $grid["subgridparams"] = "p_provincia,pciudad,p_calle";
  97.   // Definidas las propiedades que quiero tenga la grilla le informo a ésta de ellas.
  98.  
  99.   $g->set_options($grid);
  100.  
  101.   // ALERTA!!!!
  102.   // Le indico a al grilla que tabla de la base de datos va a estar unido a ella.
  103.   $g->table = "aperturas";  
  104.  
  105.   // Indico que quiero capturar el evento on_insert y defino la función de callback llamada "insert_row".
  106.   // Al ser el tercer parámetro "false" significa que toda la lógica para insertar el registro esta en
  107.   //la función de callback y entonces se anula la operación de inserción por defecto que hace la grilla.
  108.   $e["on_insert"] = array("insert_row", null, false);  
  109.  
  110.   // Indico que quiero capturar el evento on_update y defino la función de callback llamada "update_row".
  111.   // Al ser el tercer parámetro "true" significa que primero se ejecuta la función de callback y luego
  112.   //el código de actualización de la grilla.
  113.   $e["on_update"] = array("update_row", null, true);
  114.  
  115.   // Indico que quiero capturar el evento on_delete y defino la función de callback llamada "delete_row".
  116.   // Al ser el tercer parámetro "false" significa que toda la lógica para borrar el registro esta en
  117.   //la función de callback y entonces se anula la operación de eliminación por defecto que hace la grilla.
  118.   $e["on_delete"] = array("delete_row", null, false);  
  119.  
  120.   // Esta función de callback permite actuar al capturar el evento "on_insert". Recibe como dato de entrada
  121.   //una variable "$data" que contiene todos los datos que se indicaron en el formulario "Nuevo Registro".
  122.   function insert_row($data)
  123.     {
  124.     // Inserto el registro correspondiente a la nueva apertura.
  125.     global $d_id;
  126.  
  127.     if (strtotime($data["params"]["a_fecha_partida"]) > strtotime($data["params"]["a_fecha_retorno"]))            
  128.       phpgrid_error('La fecha de partida no puede ser posterior a la fecha de retorno.');
  129.  
  130.     $sentencia_sql = "insert into aperturas set
  131.                         d_id = '".$d_id."',
  132.                         a_nro_plazas_disponibles = '".$data["params"]["a_nro_plazas_disponibles"]."',
  133.                         a_nro_plazas_reservadas = '0',
  134.                         a_fecha_partida = '".$data["params"]["a_fecha_partida"]."',
  135.                         a_fecha_retorno = '".$data["params"]["a_fecha_retorno"]."',                        
  136.                         a_estado = '".$data["params"]["a_estado"]."',
  137.                         a_estampilla_tiempo = '".date("Y-m-d H:i:s")."'";                                                      
  138.     $resultado = mysql_query($sentencia_sql);  
  139.  
  140.     // No conozco que valor tomó el campo a_id al ejecutarse la última sentencia sql ya que este es de tipo
  141.     //autoincrement y lo necesito para lo que sigue.
  142.     $sentencia_sql = "select max(a_id) as a_id from aperturas";
  143.     $resultado = mysql_query($sentencia_sql);    
  144.     $rs = mysql_fetch_assoc($resultado);  
  145.     $a_id = $rs["a_id"];
  146.  
  147.     // En la tabla asientos debo crear tantos registros como plazas disponibles tenga la nueva apertura.
  148.     for ($i = 0; $i <= $data["params"]["a_nro_plazas_disponibles"]; $i++)
  149.       {
  150.       $sentencia_sql = "insert into asientos set
  151.                           aa_id = '".$i."',
  152.                           a_id = '".$a_id."',
  153.                           aa_estado = 'Libre'";                          
  154.       $resultado = mysql_query($sentencia_sql);
  155.       };
  156.     }                
  157.  
  158.   // Esta función de callback permite actuar al capturar el evento "on_update". Recibe como dato de entrada
  159.   //una variable "$data" que contiene todos los datos que se indicaron en el formulario de "Edición de un Registro".
  160.   //Y lo que hace es considerar el caso en donde se intenta editar un registro que fue eliminado por otro usuario, y
  161.   //el caso en donde se intenta editar un registro que fue editado previamente por otro usuario. En ambos cados nos
  162.   //muestra un mensaje de que debemos refrescar la página.  
  163.   function update_row($data)
  164.     {
  165.     global $d_id;
  166.  
  167.     $a_id = $data["params"]["a_id"];
  168.  
  169.     $sentencia_sql = "select * from aperturas where d_id = '".$d_id."' and a_id = '".$a_id."'";
  170.    
  171.     $resultado = mysql_query($sentencia_sql);
  172.    
  173.     $nro_registros = mysql_num_rows($resultado);                    
  174.    
  175.     if ( $nro_registros == 0)
  176.       phpgrid_error('Este registro ha sido eliminado por otro usuario y es por ello que no es posible ejecutar la tarea solicitada. Por favor refresque la página (tecla F5).');          
  177.       else
  178.         {
  179.         $rs = mysql_fetch_assoc($resultado);                  
  180.          //phpgrid_error(strtotime($rs["a_estampilla_tiempo"]).">".strtotime($data["params"]["a_estampilla_tiempo"]));
  181.        
  182.         if (strtotime($rs["a_estampilla_tiempo"]) > strtotime($data["params"]["a_estampilla_tiempo"]))
  183.           {
  184.           error('Este registro ha sido modificado por otro usuario, por favor refresque la página (tecla F5).');
  185.           }
  186.         else
  187.           {          
  188.           // Actualizo el campo "estampilla_tiempo" con una nueva estampilla de tiempo, y que luego será volcada
  189.           //en la tabla de la base de datos por código de la grilla.                                          
  190.           $data["params"]["a_estampilla_tiempo"] = date("Y-m-d H:i:s");          
  191.          
  192.           if (strtotime($data["params"]["a_fecha_partida"]) > strtotime($data["params"]["a_fecha_retorno"]))            
  193.             phpgrid_error('La fecha de partida no puede ser posterior a la fecha de retorno.');                      
  194.  
  195.           if ($data["params"]["a_nro_plazas_disponibles"] < $rs["a_nro_plazas_disponibles"])            
  196.             phpgrid_error('El número de plazas disponibles no puede ser menor que el que ya existía.');        
  197.  
  198.           // En la tabla asientos debo crear tantos registros como nuevas plazas disponibles se hayan indicado.
  199.           for ($i = $rs["a_nro_plazas_disponibles"]+1 ; $i <= $data["params"]["a_nro_plazas_disponibles"]; $i++)
  200.             {
  201.             $sentencia_sql = "insert into asientos set
  202.                                 aa_id = '".$i."',
  203.                                 a_id = '".$a_id."',
  204.                                 aa_estado = 'Libre'";                          
  205.             $resultado = mysql_query($sentencia_sql);
  206.             };
  207.           };
  208.         };
  209.     };
  210.  
  211.   /// Esta función de callback permite actuar al capturar el evento "on_delete". Recibe como dato de entrada
  212.   //una variable "$data".  
  213.   // Para el evento "on_delete" sólo es pasado el id del registro en cuestión. No es posible obtener información
  214.   //sobre ningún otro parámetro a menos que busque ésta explicitamente antes de eliminar el registro.    
  215.   function delete_row($data)
  216.     {
  217.     $a_id = $data["a_id"];
  218.     $sentencia_sql = "select c_id from reservas where a_id = '".$a_id."'";          
  219.     $resultado = mysql_query($sentencia_sql);
  220.     $nro_registros = mysql_num_rows($resultado);                        
  221.     if ( $nro_registros > 0)
  222.       phpgrid_error('No es posible eliminar la apertura ya que existen reservas efectuadas para el mismo. Elimine esa(s) reservas(s) primero y vuelva a intentarlo.');          
  223.     else
  224.       {
  225.       $sentencia_sql = "delete from aperturas where a_id = '".$a_id."'";            
  226.       $resultado = mysql_query($sentencia_sql);
  227.       };  
  228.     };
  229.  
  230.   // ALERTA!!!!  
  231.   // Definidos los eventos que quiero capturar en la grilla le informo a ésta de ellos.
  232.   $g->set_events($e);
  233.  
  234.   // Indico propiedades de la columna "a_id".
  235.   $col = array();
  236.   $col["name"] = "a_id";
  237.   $col["title"] = "Id";
  238.   $col["edittype"] = "text";
  239.   //$col["width"] = "0";
  240.   $col["editoptions"] = array("rows"=>1, "cols"=>60,"style"=>"resize: none");
  241.   $col["hidden"] = true;
  242.   $col["editable"] = true;   // Importante: NO setear este parámetro en "false" ya que entonces en la función de
  243.   //callback "on_update" no podré recuperar el valor de este campo debido a que al ser "no editable" la librería no
  244.   //lo envía como al resto de los parámetros del formulario que sí con editables.  
  245.   $cols[] = $col;
  246.  
  247.   // Indico propiedades de la columna "a_nro_plazas_disponibles".
  248.   $col = array();
  249.   $col["name"] = "a_nro_plazas_disponibles";
  250.   $col["title"] = "Nro Plazas Disponibles";
  251.   $col["edittype"] = "text";    
  252.   //$col["width"] = "0";
  253.   $col["editoptions"] = array("size"=>45);
  254.   $col["editoptions"]["onclick"] = "this.focus();this.select();";  
  255.   $col["editrules"] = array("required"=>true,"number"=>true);
  256.   $col["hidden"] = false;
  257.   $col["editable"] = true;    
  258.   $cols[] = $col;
  259.  
  260.   // Indico propiedades de la columna "a_nro_plazas_reservadas".
  261.   $col = array();
  262.   $col["name"] = "a_nro_plazas_reservadas";
  263.   $col["title"] = "Nro Plazas Reservadas";
  264.   $col["edittype"] = "text";    
  265.   //$col["width"] = "0";
  266.   $col["editoptions"] = array("size"=>45);
  267.   $col["editoptions"]["onclick"] = "this.focus();this.select();";  
  268.   $col["editrules"] = array("number"=>true);
  269.   $col["editoptions"]["readonly"] = true;
  270.   $col["show"] = array("view"=>true, "add"=>false, "edit"=>true, "list"=>true);
  271.   $col["hidden"] = false;
  272.   $col["editable"] = true;    
  273.   $cols[] = $col;
  274.  
  275.   // Indico propiedades de la columna "a_fecha_partida".
  276.   $col = array();
  277.   $col["name"] = "a_fecha_partida";
  278.   $col["title"] = "Fecha Partida";  
  279.   $col["formatter"] = "date";
  280.   //$col["width"] = "120";  
  281.   $col["formatoptions"] = array("srcformat"=>'Y-m-d',"newformat"=>'d/m/Y');
  282.   //$col["editoptions"] = array("style"=>"width:400px");
  283.   $col["editrules"] = array("required"=>true);  
  284.   $col["hidden"] = false;
  285.   $col["editable"] = true;  
  286.   $cols[] = $col;
  287.  
  288.   // Indico propiedades de la columna "a_fecha_retorno".
  289.   $col = array();
  290.   $col["name"] = "a_fecha_retorno";
  291.   $col["title"] = "Fecha Retorno";  
  292.   $col["formatter"] = "date";
  293.   //$col["width"] = "120";  
  294.   $col["formatoptions"] = array("srcformat"=>'Y-m-d',"newformat"=>'d/m/Y');
  295.   //$col["editoptions"] = array("style"=>"width:400px");
  296.   $col["editrules"] = array("required"=>true);  
  297.   $col["hidden"] = false;
  298.   $col["editable"] = true;  
  299.   $cols[] = $col;
  300.  
  301.   // Indico propiedades de la columna "a_estado".
  302.   $col = array();
  303.   $col["name"] = "a_estado";
  304.   $col["title"] = "Estado";
  305.   $col["edittype"] = "select";  
  306.   $col["editoptions"] = array("value"=>'Abierto:Abierto;Cerrado:Cerrado');  
  307.   $col["editrules"] = array("false"=>true);
  308.   $col["hidden"] = false;
  309.   $col["editable"] = true;
  310.   $cols[] = $col;
  311.  
  312.   // Indico propiedades de la columna "a_estampilla_tiempo".
  313.   $col = array();
  314.   $col["name"] = "a_estampilla_tiempo";
  315.   $col["title"] = "Estampilla Tiempo";
  316.   $col["edittype"] = "text";
  317.   //$col["width"] = "0";
  318.   $col["editoptions"] = array("size"=>45);    
  319.   $col["hidden"] = true;
  320.   $col["editable"] = true;
  321.   $col["export"] = false;  
  322.   $cols[] = $col;
  323.  
  324.   // Indico propiedades de la columna "act".
  325.   $col = array();
  326.   $col["name"] = "act";
  327.   $col["title"] = "Acciones";  
  328.   //$col["width"] = "0";
  329.   $col["hidden"] = true;
  330.   $col["editable"] = false;
  331.   $col["export"] = false;  
  332.   $cols[] = $col;
  333.  
  334.   // Esta sentencia SQL es la que va a decir cuales son las operaciones asociada con la cuenta de cada cliente.
  335.   $g->select_command = "select a_id, a_nro_plazas_disponibles, a_nro_plazas_reservadas, a_fecha_partida, a_fecha_retorno, a_estado, a_estampilla_tiempo
  336.                         from aperturas
  337.                         where d_id = '".$d_id."'";  
  338.  
  339.   // Definidas las propiedades que quiero tengan cada una de las columnas de la grilla le informo a ésta de ellas.
  340.   $g->set_columns($cols,true);
  341.  
  342.   // Indico que acciones sí permito en la grilla y cuales no.
  343.   $g->set_actions
  344.         (
  345.         array
  346.           (
  347.           "add"=>true,
  348.           "edit"=>true,
  349.           "clone"=>false,
  350.           "bulkedit"=>false,                          
  351.           "delete"=>true,
  352.           "view"=>true,
  353.           "rowactions"=>false,
  354.           "export"=>false,
  355.           "autofilter"=>true,
  356.           "search"=>false,
  357.           "inlineadd"=>false,          
  358.           "showhidecolumns"=>false
  359.           )
  360.         );  
  361.  
  362.   // Construyo la grilla y le asigno un nombre, que será único en la pagina html.
  363.   $out = $g->render("aperturas");
  364.  
  365. ?>
  366.  
  367. <div style="padding:5px;">
  368.  
  369.   <?php echo $out; ?>
  370.  
  371. </div>
  372.  
  373.     <script type="text/javascript">
  374.       /*
  375.       Aclaración: No se porque este script debe ir despues de que genero la grilla. Si lo pongo antes del php echo $out no funciona.
  376.       CUSTOM TOOLBAR BUTTON
  377.       ---------------------
  378.       caption: (string) the caption of the button, can be a empty string.
  379.       buttonicon: (string) is the ui icon name from UI theme icon set. If this option is set to 'none' only the text appear.
  380.       onClickButton: (function) action to be performed when a button is clicked. Default null.
  381.       position: ('first' or 'last') the position where the button will be added (i.e., before or after the standard buttons).
  382.       title: (string) a tooltip for the button.
  383.       cursor : string (default pointer) determines the cursor when we mouseover the element
  384.       id : string (optional) - if set defines the id of the button (actually the id of TD element) for future manipulation
  385.       */
  386.       jQuery(document).ready(function(){
  387.         jQuery('#aperturas').jqGrid('navButtonAdd', '#aperturas_pager',
  388.           {
  389.           'caption'      : '',
  390.           'buttonicon'   : 'ui-icon-suitcase',
  391.           'title'        : 'Listado de clientes',
  392.           'onClickButton': function()
  393.                             {
  394.                             // for all ids
  395.                             // var allRowsOnCurrentPage = $('#list1').jqGrid('getDataIDs');
  396.                             // for selected rows
  397.                             var selectedRows = jQuery('#aperturas').jqGrid('getGridParam','selarrrow');                            
  398.                          
  399.                             window.open("imprimir_listado_clientes.php?a_id="+selectedRows,'_self');
  400.                             },
  401.           'position': 'last'
  402.           });
  403.       });
  404.     </script>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement