Bonjour,

Voila je rencontre un petit problème avec mon code. Je découvre donc codeIgniter et dans le cadre de mon stage je dois réaliser une interface WEB entièrement en codeIgniter. Seulement j'apprend et entre la théorie et la pratique je bloque parfois.

J'ai donc une classe user_model ou j'ai une fonction dedans :

        public function get_all()
        {
            $allusers = array();

            $this->db->select('*')
                 ->from($this->table)
                 ->where('firstname != ""')
                 ->order_by('firstname', 'asc');

            $query = $this->db->get();

            if ( $query->num_rows() > 0 )
            {
                foreach ($query->result() as $row)
                {
                    $user = array();
                    $user = $this->init_user($row);

                    array_push($allusers, $user);
                }
            }
            return $allusers;
        }

J'ai un controler appeler affecter :

    public function etape1()
    {
        $this->load->model('user_model');//inclu la class gestion d'utilisateur 
        $this->load->model('ordinateur_model');//inclu la class gestion d'ordinateur
        $data['user'] = $this->user_model->get_all();
        //$users = $this->User->lecture();
        $ordinateur = $this->ordinateur_model->get_all();
        $this->load->view('choix');
    }

Et dans ma vue choix, j'essaye de faire deux listes déroulante avec le nom des ordinateurs et utilisateurs en fonction de la BDD.

    <SELECT id="listeOrdi" name="listeOrdi" hidden>
    <option disabled selected></option>
    <?php
    for($i = 0; $i < count($ordinateurs); $i++)
    {
        echo "<option>".$ordinateurs[$i]."</option>";
    }
    ?>
    </select>

    <p id="msgUser" hidden></p>
    <SELECT id="listeUtilisateurs" name="listeUtilisateurs" hidden>
    <option disabled selected></option>
    <?php
    for($i = 0; $i < count($user); $i++)
    {
        echo '<option value="'.$user[$i]->id.'">'.$i ." - Utilisateur - ".utf8_encode($user[$i]->realname)." ".utf8_encode($user[$i]->firstname)." - Session : ".utf8_encode($user[$i]->name)."</option>";
    }
    ?>
    </select>

Malheureusement je n'y arrive pas et je ne sais pas comment récupérer mes données ... Si quelqu'un pouvait m'aider ...

Merci d'avance !

17 réponses


Alexandre #lbac
Réponse acceptée

Je te conseille de te former un peu avec la doc avant d'enteprendre de réaliser un site ;)

Codeigniter est fourni avec tout un tas de "helpers" (des petites fonctions pouvant grandement te faciliter la tâche) pour que tu ais moins de codes à écrire. Cependant, pour éviter de trop surcharger le framework, tous les helpers ne sont pas chargés par défaut. DOnc dans ton fichier config/autoload.php tu dois rajouter ces helpers.

Tu as donc un tableau

$autoload['helper'] = array();

Et tu dois rajouter le helper url :

$autoload['helper'] = array('url');
Loyle
Réponse acceptée

Salut, je débarque sur le fofo Grafikart et tout content je vois un post sur le framework que j'utilise depuis 3/4 ans :DDD j'espère donc pouvoir t'aider

Alors alors le Base url est l'url de base de ton site, c'est-à-dire:

Tu peux y modifier dans application/config/config.php l'une des premières lignes :

$config['base_url'] = 'http://localhost/sonsite/';

Et maintenant, n'importe où dans ton code tu peux faire un <?php echo Base_url(); ?> qui va te permettre d'écho l'url configurée. C'est très pratique pour les liens entres pages, les images hébergées sur le site etc....

De plus je comprend pas trop ce que tu veux faire avec ça:

if ( $query->num_rows() > 0 )
            {
                foreach ($query->result() as $row)
                {
                    $user = array();
                    $user = $this->init_user($row);

                    array_push($allusers, $user);
                }
            }
            return $allusers;

Si c'est pour crée un tableau des resultats, tu peux simplement faire ça:

$query = $this->db->select('t.*')
        ->from('ttc as t')
        ->get();
        return  $query->result_array();

En espérant t'avoir aidé !
Cordialement
Moi

Bonjour.
Pourquoi utilises-tu une boucle for à la place d'une boucle foreach ?

Salut,

Alors plusieurs remarques :

1 Tu ne transmets aucune variables à ta vue
2 Dans ton controller tu as $ordinateurs et dans la vue tu appelles $ordinateur
3 la variable $user n'existe forcément pas

Freezon
Auteur

Pour Lartak :
J'utilise un for car avant de faire mon projet en codeIgniter je l'ai fait en PHP et avec le for ça marchait.

Pour SquallX :
1) J'ai modifié j'ai bien mis :

    public function etape1()
    {
        $this->load->model('user_model');//inclu la class gestion d'utilisateur 
        $this->load->model('ordinateur_model');//inclu la class gestion d'ordinateur
        $data['user'] = $this->user_model->get_all();
        //$users = $this->User->lecture();
        $ordinateurs = $this->ordinateur_model->get_all();
        $this->load->view('choix',$data);
    }

2) J'ai midifié aussi :

<select id="listeOrdi" name="listeOrdi" hidden>
    <option disabled selected></option>
    <?php
    for($i = 0; $i < count($ordinateurs); $i++)
    {
        echo "<option>".$ordinateurs[$i]."</option>";
    }
    ?>
    </select>

3) J'ai vu avec un développeur pro, que quand il fait un $data['user'] après il fait un $user.

J'utilise un for car avant de faire mon projet en codeIgniter je l'ai fait en PHP et avec le for ça marchait.

foreach est aussi une fonction PHP.
Tu as fait des modifications, mais tu ne passes toujours pas la variable $ordinateurs à ta vue, tu devrais donc par exemple stocker le résultat de ta requête SQL dans la variable $data['ordinateurs'].

Freezon
Auteur

Lartak c'est vrai, mais je sais pas, je préfère le for et en cours on nous conseille le for. Dans mon cas, je dois parcourir toute la table donc autant faire un for, c'est comme ça qu'on apprendre en cours...

Certes, je l'ajoute aussi, mais le soucis c'est que même le $data ne marche pas la, je suis vraiment perdu avec codeIgniter, alors que le PHP mon interface fonctionne ...

<?php 
$this->load->view('ta_vue', ['ordinateurs' => $ordinateurs, 'users' => $users]);
?>

Dans ton cas le foreach est plus approprié car il permet de balayer des tableaux, alors que le for sert à gérer des boucles (de tableaux ou pas), ton count à chaque itération sera plus gourmand en ressources, il serait donc préférable de le stocker en variable, avec le foreach pas besoin...

Si tu nous indiquais les erreurs que tu as en retour ça serait pas mal ;)

Freezon
Auteur

J'ai donc dans mon controler

public function etape1()
    {
        $this->load->database();
        $this->load->model('user_model');//inclu la class gestion d'utilisateur 
        $this->load->model('ordinateur_model');//inclu la class gestion d'ordinateur
        $data['user'] = $this->user_model->get_all();
        //$users = $this->User->lecture();
        $ordinateurs = $this->ordinateur_model->get_all();
        $this->load->view('choix', ['ordinateurs' => $ordinateurs, 'users' => $data]);
        //$this->load->view('choix',$data,$ordinateurs);
    }

Et dans ma vue

    <select>
    <?php 
    foreach ($results as $data)
    {
        echo "<option>".$results."</option>";
    }?>
    </select>

Et ma fonction dans ma classe user

public function get_all()
        {
            $allusers = array();

            $this->db->select('*')
                 ->from($this->table)
                 ->where('firstname != ""')
                 ->order_by('firstname', 'asc');

            $query = $this->db->get();

            if ( $query->num_rows() > 0 )
            {
                foreach ($query->result() as $row)
                {
                    $user = array();
                    $user = $this->init_user($row);

                    array_push($allusers, $user);
                }
            }
            return $allusers;
        }

Et en faite j'ai pas d'erreur propre, juste ma liste ne se remplit pas.

Freezon
Auteur
    <?php 
    foreach ($user as $results)
    {
        echo '<option value ="'.$results['id_user']'">'.$results['user_realname']." ".$results['user_firstname']." - Session : ".$results['name']."</option>";
    }?>

J'ai trouvé la solution. Seulement maintenant, mon fichier JS n'est pas lié à la page.
Est-ce que code Igniter change quelque chose ? Car j'ai fais :

<script type="text/javascript" src="script.js"></script>

Comme je fais habituellement ... Le script est dans mon dossier view, comme la vue ...

Dans ce cas tu dois indiquer le chemin complet vers le fichier JS, car là il ne sera absolument pas trouvé. De par ailleurs ton fichier JS ne doit pas se trouver dans ton dossier views il me semble.

Tu peux te créer un répertoire assets qui contiendra ton JS, et tu utiliserais la fonction base_url() pour appeler ce fichier :

<?php echo base_url() . 'assets/js/ton_js.js'; ?>
Freezon
Auteur

Qu'est-ce que le base_url() ? C'est vrai complexe de débuter codeIgniter sans avoir de base réelle ...

En créant comme tu dis au dessus, j'ai l'erreur :

Fatal error: Call to undefined function base_url() in F:\STAGE_GLPI_FRAMEWORK\application\views\choix.php on line 45
A PHP Error was encountered

Severity: Error

Message: Call to undefined function base_url()

Filename: views/choix.php

Line Number: 45

Backtrace:

la ligne 45 c'est :

<?php echo base_url() . 'assets/js/script.js'; ?>
Freezon
Auteur

Je n'ai pas tout compris de la documentation et le temps de tout apprendre ne me permettra pas de réaliser l'interface dans le temps qui m'est imposé. Pour régler mon problème, j'ai pas mis une nouvelle page, j'ai intégré le script en brut dans ma page. Merci pour l'aide !

Freezon
Auteur

Merci pour le base url() je comprend mieux ! Ensuite pour la fonction, c'est la fonction déjà existante, créer par un membre de mon entreprise, et qui est utilisée depuis des années, la modifier m'obligerais à tout modifié et ça sera impossible, mais je retiens ta solution à titre personnel ! Merci beaucoup, je commence à bien comprendre codeIgniter et à débloquer de plus en plus de problème ! Je commence à vraiment aimé ce FrameWork je le trouve vraiment bien !

Freezon
Auteur

Juste dernier points, j'ai quasiment fini mon interface. Il manque plus que l'insertion de donnée dans ma BDD.
Pour celà j'ai ma fonction dans ma classe :

        static function modif_entity_by_user($entite,$id)
        {
            $sql = "UPDATE glpi_users SET entities_id= ? WHERE id= ?";
            $this->db->query($sql,array($entite,$id));
        }

J'obtiens l'erreur :
A PHP Error was encountered

Severity: Error

Message: Using $this when not in object context

Filename: models/entity_model.php

Line Number: 159

Backtrace:

la ligne 159 c'est :

$this->db->query($sql,array($entite,$id));

Je ne comprend pas, car des sites anglais, le site de codeIgniter propose cette solution, mais ça ne marche pas... Je ne comprend pas l'erreur ...

Le message est pourtant clair non ? Commences par lire les erreurs retournées, tu comprendras mieux :

Message: Using $this when not in object context

Tu es dans une méthode statique...

Salut, éffectivement tu es dans un class static donc tu peux pas utiliser $this
Après tu dis que tu veux insérer des données mais quant je vois le code que tu as fournis: "modif_entity_by_user" et "$sql = "UPDATE glpi_users SET entities_id= ? WHERE id= ?";" C'est plutôt une update que tu fais :D

Bon si tu veux tout savoir sur l'insertion/l'update il y a le guide CodeIgniter qui en parle ici :

Personnellement pour l'insertion je fais comme ça:

public function addTtc($params) {
        $this->db->set('name', $params['name']);
        $this->db->set('status', $params['status']);
        $this->db->set('content', $params['content']);
        $this->db->insert('ttc'); //TTC = la table
}

et pour l'update:

public function updateTtc($params, $id) {
        $this->db->set('name', $params['name']);
        $this->db->set('status', $params['status']);
        $this->db->set('content', $params['content']);
        $this->db->where('id', $id);
        $this->db->update('ttc');
}

Il est important de préciser un where pour update uniquement la ligne voulu :D
En espérant t'avoir aidé

PS: sur le guide, il montre 2 façons de faire, comme celle ci-dessus mais aussi une autre, à toi d'utiliser celle qui te convient le mieux :D