Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: geshiro en 15 Agosto 2016, 18:27 pm



Título: problema al pasar indexes de json a la vista con foreach
Publicado por: geshiro en 15 Agosto 2016, 18:27 pm
bueno mi error es que me da  invalid argument supplied for foreach() y no me esta accediento bien al índice del arreglo, estoy usando codeigniter pero como pudiera arreglar ese error mi json del la función del controlador es
Código
  1. [{"id":"1","sección":"Inventario","data":[{"id":"11","icon":"http:\/\/localhost\/storeLTE\/assets\/img\/sidebar\/items.png","value":"Productos","seccion_id":"1","url":"http:\/\/localhost\/storeLTE\/inventario\/product"},{"id":"14","icon":"http:\/\/localhost\/storeLTE\/assets\/img\/sidebar\/employees.png","value":"Provedores","seccion_id":"1","url":"http:\/\/localhost\/storeLTE\/provedor\/provedor"}]},{"id":"2","sección":"Compras","data":[{"id":"22","icon":"http:\/\/localhost\/storeLTE\/assets\/img\/sidebar\/suppliers.png","value":"Compras","seccion_id":"2","url":"http:\/\/localhost\/storeLTE\/compras\/compras"}]}]

controller

Código
  1.  
  2. public function getModules($id_module){
  3.    if($this->session->userdata('log')){
  4.        $data = $this->session->userdata('log');
  5.        $menu = array();
  6.        $seccions = $this->module->get_rows();
  7.        foreach ($seccions as $index => $sección){
  8.            $modules = $this->module->query("SELECT CONCAT('".$sección['id']."',storelte_modulo.id) AS id,CONCAT('".base_url('assets/img/sidebar')."','/',storelte_modulo.icon) as icon, storelte_modulo.modulo AS value,storelte_modulo.seccion_id,CONCAT('".base_url()."',storelte_modulo.url) AS  url FROM storelte_modulo INNER JOIN storelte_modulo_perfil ON  storelte_modulo_perfil.modulo_id = storelte_modulo.id WHERE seccion_id = $sección[id] AND storelte_modulo_perfil.perfiles_id = $data[id] AND storelte_modulo_perfil.STATUS = 1");
  9.            $seccions[$index]['data']= $modules;
  10.            if (!count($seccions[$index]['data']))
  11.                unset($seccions[$index]);
  12.        }
  13.        foreach ($seccions as $item)
  14.            array_push($menu,$item);
  15.  
  16.        $this->json($menu);
  17.    }
  18. }
  19.  

model

Código
  1. public function get_rows(){
  2.        $this->db->select('id,sección');
  3.        $this->db->from('storelte_seccion');
  4.        return $this->db->get()->result_array();
  5.    }
  6.  
  7.    public function query($query){
  8.        return
  9.  

Código
  1. <div class="row">
  2. <h3 class="text-center">Welcome to storeLTE, click a module below to get started!</h3>
  3. <div class="home_module_list">
  4.    <div class="module_item">
  5.        <?php foreach ($seccions as $session) { ?>
  6.          <div class="module_item" title="<?= $session['value'];?>">
  7.            <a href="<?= $session['url']; ?>"><img src="<?= $session['icon']; ?>"/></a>
  8.            <a href="<?= $session['url']; ?>"><?= $session['value']?></a>
  9.        </div>
  10.        <?php } ?>
  11.    </div>
  12. </div>
  13. </div>
  14.  


Título: Re: problema al pasar indexes de json a la vista con foreach
Publicado por: zonahurbana en 15 Agosto 2016, 19:11 pm
Hola.
¿Estás intentando usar un JSON en conjunto con un foreach?

Según entiendo, la respuesta JSON es solo una cadena, y lo más normal es que el foreach no lo admita como válido.


Título: Re: problema al pasar indexes de json a la vista con foreach
Publicado por: geshiro en 15 Agosto 2016, 20:30 pm
y como pudiera modificar mi json para poder usarlo en el foreach ya sea por como [data:{}] etc


Título: Re: problema al pasar indexes de json a la vista con foreach
Publicado por: zonahurbana en 15 Agosto 2016, 21:06 pm
La verdad es que solo 1 vez usé codeigniter y fue hace mucho.

Deberías enviar la variable a la vista como lo haces normalmente, sin convertirlo en json.

¿No puedes usar otro método en el controlador que devuelva la vista con los datos en vez de responder json? (Para que no reemplaces el método que ya tienes, por si lo estás usando)

Código
  1. $this->load->view('results_view', $data);


Título: Re: problema al pasar indexes de json a la vista con foreach
Publicado por: [u]nsigned en 16 Agosto 2016, 14:57 pm
Como te dicen, para PHP el recurso JSON no es un objeto, solo es un string. Para pasarlo a un arreglo de PHP tenes que usar la funcion json_decode (http://php.net/manual/es/function.json-decode.php)

Codigo ilustrativo de ejemplo:
Código
  1. <?php
  2. $json = '[{"id":"1","sección":"Inventario","data":[{"id":"11","icon":"http:\/\/localhost\/storeLTE\/assets\/img\/sidebar\/items.png","value":"Productos","seccion_id":"1","url":"http:\/\/localhost\/storeLTE\/inventario\/product"},{"id":"14","icon":"http:\/\/localhost\/storeLTE\/assets\/img\/sidebar\/employees.png","value":"Provedores","seccion_id":"1","url":"http:\/\/localhost\/storeLTE\/provedor\/provedor"}]},{"id":"2","sección":"Compras","data":[{"id":"22","icon":"http:\/\/localhost\/storeLTE\/assets\/img\/sidebar\/suppliers.png","value":"Compras","seccion_id":"2","url":"http:\/\/localhost\/storeLTE\/compras\/compras"}]}]';
  3.  
  4. $json_procesado = json_decode($json);
  5. print_r($json_procesado) ;
  6.  
  7. ?>



Título: Re: problema al pasar indexes de json a la vista con foreach
Publicado por: geshiro en 19 Agosto 2016, 17:16 pm
como pudiera hacerlo?


Título: Re: problema al pasar indexes de json a la vista con foreach
Publicado por: WHK en 22 Agosto 2016, 02:59 am
Hola, no estas trabajando con datos jSon, tu estas trabajando con arrays, el resultado lo estas enviando por json pero el procesamiento de datos va por arrays.

El problema que veo es que no estan llegando los valores al foreach y por eso te esta arrojando el error, yo pienso que el problema se encuentra en tu consulta sql a traves del active record.

En tu código antes del foreach ponle una condicional para controlar si vienen los datos o no y con eso debiera bastar para darte cuenta que simplemente los datos no vienen.

Código:
if($this->session->userdata('log')){
    $data = $this->session->userdata('log');
    $menu = array();
    $seccions = $this->module->get_rows();
    if($seccions){
        foreach ($seccions as $index => $sección){
            $menu[] = $sección;
            $modules = $this->module->query("SELECT CONCAT('".$sección['id']."',storelte_modulo.id) AS
id,CONCAT('".base_url('assets/img/sidebar')."','/',storelte_modulo.icon) as icon, storelte_modulo.modulo AS value,storelte_modulo.seccion_id,CONCAT('".base_url()."',storelte_modulo.url) AS
 url FROM storelte_modulo INNER JOIN storelte_modulo_perfil ON
  storelte_modulo_perfil.modulo_id = storelte_modulo.id WHERE seccion_id =
$sección[id] AND storelte_modulo_perfil.perfiles_id =
$data[id] AND storelte_modulo_perfil.STATUS = 1");
            $seccions[$index]['data']= $modules;
            if (!count($seccions[$index]['data']))
                unset($seccions[$index]);
        }
        $this->json($menu);
    }
}

Además no necesitas dos foreach, basta con el primero y ahi incluyes el push del array. También puedes reemplazar array_push por $var[] = ... , eso agrega un item al final del stack.

Revisa tu consulta SQl porque me huele que ahi esta tu problema. Lanza un echo a tu consulta sql y pegalo en tu servidor mysql y vee que error te arroja o ejecuta print_f($this->db).

Estás usando codeigniter no?

Saludos.