problema al pasar indexes de json a la vista con foreach

Iniciado por geshiro, 15 Agosto 2016, 18:27 PM

0 Miembros y 1 Visitante están viendo este tema.

geshiro

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 (javascript) [Seleccionar]
[{"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 (php-brief) [Seleccionar]


public function getModules($id_module){
    if($this->session->userdata('log')){
        $data = $this->session->userdata('log');
        $menu = array();
        $seccions = $this->module->get_rows();
        foreach ($seccions as $index => $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]);
        }
        foreach ($seccions as $item)
            array_push($menu,$item);

        $this->json($menu);
    }
}


model

Código (php) [Seleccionar]

public function get_rows(){
        $this->db->select('id,sección');
        $this->db->from('storelte_seccion');
        return $this->db->get()->result_array();
    }

    public function query($query){
        return


Código (php) [Seleccionar]

<div class="row">
<h3 class="text-center">Welcome to storeLTE, click a module below to get started!</h3>
<div class="home_module_list">
    <div class="module_item">
        <?php foreach ($seccions as $session) { ?>
          <div class="module_item" title="<?= $session['value'];?>">
            <a href="<?= $session['url']; ?>"><img src="<?= $session['icon']; ?>"/></a>
            <a href="<?= $session['url']; ?>"><?= $session['value']?></a>
        </div>
        <?php ?>
    </div>
</div>
</div>

zonahurbana

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.
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

geshiro

y como pudiera modificar mi json para poder usarlo en el foreach ya sea por como [data:{}] etc

zonahurbana

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 (php) [Seleccionar]
$this->load->view('results_view', $data);
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

[u]nsigned

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

Codigo ilustrativo de ejemplo:
Código (php) [Seleccionar]
<?php
$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"}]}]';

$json_procesado json_decode($json);
print_r($json_procesado) ;

?>



No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!


WHK

#6
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.

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.