Comunidad de diseño web y desarrollo en internet online

PROBLEMA PARA ORDENAR UNA LISTA CON LARAVEL

Citar            
MensajeEscrito el 30 Nov 2013 02:20 am
Buenas tengo el siguiente problema al tratar de crear un buscador de registro desde la bd con laravel, es decir tengo una vista llamada lista, en la cual muestro todos mis productos, muy bien, ahora lo que trato de hacer es que por medio de un campo select en donde se muestran las categorias de los productos el usuario pueda ordenar la lista de los productos, VALGA LA REDUNDANCIA :lol:

tengo la siguiente ruta para realizar la consulta a la bd por medio del modelo:

Código PHP :

Route::get('producto/{id}', function($id)
{
    $productos = Producto::where('categoria_id','=',$id)->get();
         
    return View::make('producto/articulo/list')->with('productos', $productos);
});


y poseo mi vista llamada list.blade.php

Código PHP :

@extends ('layout')
@section ('title') Lista de Productos @stop
@section ('content')
<div class="row">
<div class="form-group col-md-8">
<h1>Lista de Productos</h1>
<p>
   <a href="{{route('productos.articulo.create')}}" class="btn btn-primary">Nuevo Producto</a>

</p>
<p class="navbar-text navbar-right">
   Clasificar por:  <select name="categoria_id">
                  @foreach(Categoria::all() as $categoria)
                     <option  value="{{ $categoria->id }}">{{ $categoria->nombre }}</option>
                  @endforeach
               </select> 
               
               {{link_to('producto/'.el valor de la categoria seleccionada, 'Ver')}}
</p>


</div>
<div class="form-group col-md-8">
<table class="table table-striped">
   <tr>
      <th>Nombre</th>
      <th>Categoria</th>
      <th>Cantidad</th>
   </tr>

   @foreach ($productos as $producto)
   <tr>
      <td>{{$producto->nombre}}</td>
      <td>{{$producto->categoria->nombre}}</td> 
      <td>{{$producto->cantidad}}</td>   
            
   </tr>
   @endforeach
      
</table>

</div>

</div>

@stop



EL PROBLEMA QUE TENGO COMO SE PUDIERON DAR CUENTA LA RUTA PRODUCTO RECIBE UN VALOR, CON EL CUAL REALIZA EL SELECT MUY BIEN.

¿COMO PUEDO PASAR EL VALOR SELECCIONADO DEL SELECT DE LA VISTA LIST.BLADE.PHP A MI RUTA PRODUCTO PARA QUE ME REALICE EL SELECT?

Por gilberto286

5 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 30 Nov 2013 02:52 am
Usa un form con el método GET y en vez de construir una ruta de tipo products/{id_categoria} haz que simplemente el filtro sea un parámetro GET: productos?id_categoria=#

En el controlador podrás leer ese filtro usando la clase input:

Input::get('id_categoria')

Esta es la solución ideal y de hecho yo lo hago así.

Si quisieras una solución con rutas entonces en vez de un select deberías usar una lista (ul) pero lo que te digo antes está muy bien, hazlo así :)

Saludos.

P.D.: Es un error pensar que porque hay rutas y mod rewrite no es válido usar los parámetros GET.

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

chrome
Citar            
MensajeEscrito el 30 Nov 2013 06:12 pm

Duilio escribió:

Usa un form con el método GET y en vez de construir una ruta de tipo products/{id_categoria} haz que simplemente el filtro sea un parámetro GET: productos?id_categoria=#

En el controlador podrás leer ese filtro usando la clase input:

Input::get('id_categoria')

Esta es la solución ideal y de hecho yo lo hago así.

Si quisieras una solución con rutas entonces en vez de un select deberías usar una lista (ul) pero lo que te digo antes está muy bien, hazlo así :)

Saludos.

P.D.: Es un error pensar que porque hay rutas y mod rewrite no es válido usar los parámetros GET.


Duilio lo realice de esta forma por medio de lo que te entendí modifique el controlador para que me quedara de la siguiente manera:

ProductoController.php
en la parte de la funcion index recibo la variable enviada vía get y realizo una condicional

Código PHP :

public function index()
   {
      $id_categoria=Input::get('id');

      if ($id_categoria!="") {
                       //Realizo una consulta y envío los datos obtenidos a la lista nuevamente
         $productos = Producto::where('categoria_id','=',$id_categoria)->get();
         return View::make('producto/articulo/list')->with('productos', $productos);
      
      } else {
      //de no cumplirse la condicional muestro todos los productos en la lista
         $productos = Producto::with('Categoria')->paginate();
         return View::make('producto/articulo/list')->with('productos', $productos);
      
      }
      
   }


mi vista la realice asi:
list.blade,php

Código PHP :

@extends ('layout')
@section ('title') Lista de Productos @stop
@section ('content')
<div class="row">
<div class="form-group col-md-8">
<h1>Lista de Productos</h1>
<p>
   <a href="{{route('productos.create')}}" class="btn btn-primary">Nuevo Producto</a>

</p>

{{Form::open(array('url'=>('productos'), 'method'=>'get'))}}
<p class="navbar-text navbar-right">
   Clasificar por:  <select name="id">
                  @foreach(Categoria::all() as $categoria)
                     <option  value="{{ $categoria->id }}">{{ $categoria->nombre }}</option>
                  @endforeach
               </select> 
               
               
               {{ Form::button('Ver', array('type' => 'submit', 'class' => 'btn btn-primary')) }}
</p>
{{Form::close()}}

</div>
<div class="form-group col-md-8">
<table class="table table-striped">
   <tr>
      <th>Nombre</th>
      <th>Categoria</th>
      <th>Cantidad</th>
   </tr>

   @foreach ($productos as $producto)
   <tr>
      <td>{{$producto->nombre}}</td>
      <td>{{$producto->categoria->nombre}}</td> 
      <td>{{$producto->cantidad}}</td>   
            
   </tr>
   @endforeach
      
</table>

</div>

</div>

@stop


mi route para llamar el controlador es la siguiente:
archivo routes.php

Código PHP :

Route::resource('productos', 'ProductoController');


pienso haberlo realizado de la form correcta... muchas gracias por tu ayuda me ha servido y de a mucho...
pd: cada ves me gusta mas este framework...

Por gilberto286

5 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 30 Nov 2013 07:22 pm
Mucho mejor!

2 tips:

1. El return View::make puede ir fuera del condicional
2. Laravel tiene un Helper que genera Selects! Revisa la docu: http://laravel.com/docs/html

Me alegra que estés disfrutando el framework :)

Saludos!

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

chrome
Citar            
MensajeEscrito el 01 Dic 2013 12:15 am

Duilio escribió:

Mucho mejor!

2 tips:

1. El return View::make puede ir fuera del condicional
2. Laravel tiene un Helper que genera Selects! Revisa la docu: http://laravel.com/docs/html

Me alegra que estés disfrutando el framework :)

Saludos!


listo seguí tu dos tips ahora con el segundo tips el del select lo cree de la siguiente forma
en mi modelo producto cree una función que me haga el trabajo de consultar a la base de datos:

Producto.php

Código PHP :

public function Select()
   {
      /**Construcción del select dinámico:
      1.-realizo una consulta a la tabla categorias = Categorias::all()
      2.-armo una lista con los valores nombre y id de la tabla categoria= list('nombre','id')
      3.-todo lo anterior se lo paso a una variable, la cual despues paso en el return*/ 
      $select = Categoria::all()-> lists('nombre','id');

      return $select;
   }


esta funcion la llamo desde mi controlador en la parte donde la valla a utilizar por ejemplo en el caso del index

ProductoController.php

Código PHP :

public function index()
   {
      /**Llamada de la function select():
      1.-Creo un nuevo objeto Producto y lo guardo en la variable value
      2.-Creo una variable $select y le asigno como valor $value apuntando a la function select()*/ 
      $value = new Producto;
      $select = $value->Select();

      //Obtengos los datos pasados por via get
      $id_categoria=Input::get('id');

      //Evaluo la variable $id_categoria
      if ($id_categoria!="") {
         /**Si me trae algun valor, realizo una consulta a la tabla productos en donde me devuelva
         los productos que tengan ese id_categoria*/
         $productos = Producto::where('categoria_id','=',$id_categoria)->get();
         
      
      } else {
         /**Si no, que me muestra la lista completa de los productos*/
         $productos = Producto::with('Categoria')->paginate();
               
      }
      //Retorno a la vista list.blade.php con todos los valores para armar la misma
      return View::make('producto/articulo/list', compact('productos', 'select'));
      
      
   }


Ahora en la vista relleno el select de la siguiente forma
list.blade.php

Código PHP :

{{Form::open(array('url'=>('productos'), 'method'=>'get'))}}
<p class="navbar-text navbar-right">
   Clasificar por: {{Form::select('id', $select);}}
               
               {{ Form::button('Ver', array('type' => 'submit', 'class' => 'btn btn-primary')) }}
               <a href="{{route('productos.index')}}" class="btn btn-primary">Volver</a>
</p>
{{Form::close()}}

AHORA MI PREGUNTA ES COMO LE PASO UN ESTILO AL SELECT YA QUE TRABAJO CON EL FRAMEWORK BOOTSTRAP DE TWITTER, EL ESTILO SERIA class="form-control"

Pd: creo haberlo echo bien solo tengo dudas en eso del estilo :lol: , se que puede ser una pregunta tonta, pero hay un dicho que dice "no hay pregunta tonta, si no tonto el que no pregunte" :(

Por gilberto286

5 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 01 Dic 2013 12:26 am
Listo Duilio disculpa mi ignorancia mi problema era que pasaba el estilo al select como tercer parámetro el cual es el valor por defecto.
ya lo corregí y me quedo así:

Código PHP :

{{Form::select('id', $select, null, array('class'=>'form-control'));}}

Por gilberto286

5 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 01 Dic 2013 01:14 am
Oye sólo trata de usar nombres más indicativos, por ej. getCategories en vez de "select"

Lo demás te está quedando muy bien!

Saludos!

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.