2010-12-20 4 views
0

Ok, donc dans mon contrôleur de base (page.php) Je le code suivant qui fonctionne très bien:CodeIgniter -> ayant des difficultés à charger plusieurs bibliothèques/classes

$this->load->library('Siteclass'); 
    $mysite = new site_model(); 

Les références de la bibliothèque siteclass un modèle nommé site_model et instancie en fonction des données reçues de ce modèle. Tout est bon.

Maintenant, je veux charger une autre bibliothèque pour pouvoir instancier un autre objet. J'ajoute donc cela page.php:

$this->load->library('Memberclass'); 
$mysite = new member_model(); 

Mais maintenant, je reçois l'erreur suivante:

Message: Undefined property: Memberclass::$site_model 
Filename: libraries/Loader.php 
Line Number: 1035 

D'après ce que je peux dire, il semble que la classe de chargement, lorsqu'il est appliqué à la MemberClass , est en quelque sorte toujours référençant le site_model au lieu du member_model. J'ai vérifié mon code et j'appelle définitivement les bons fichiers.

Voici ce que Siteclass.php ressemble à:

if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Siteclass extends Controller { 
    function __construct() { 
     parent::Controller(); 
     $this->load->model('Site_model'); 
     $data = $this->Site_model->load_site_data(); 
     // etc etc 

et voici ce que Memberclass.php ressemble à:

if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Memberclass extends Controller { 
function __construct() { 
     parent::Controller(); 
    $this->load->model('Member_model'); 
     $data = $this->Member_model->load_member_data(); 
     // etc etc 

Merci d'avance pour toute aide!

Gary

Répondre

2

Je pense que vous êtes confus sur la façon dont fonctionne MVC dans CodeIgniter. Pourquoi utilisez-vous la classe loader pour créer un contrôleur? Pourquoi créez-vous une instance autonome de votre modèle en dehors de votre classe de contrôleur?

Dans CodeIgniter, vos URL représentent les chemins d'accès aux méthodes de vos contrôleurs. Cela signifie que votre devrait être automatiquement instancié « contrôleur de base » si vous allez à:

www.example.com/memberclass

Ou peut-être plus au point, si vous avez un lien comme celui-ci:

www.example.com/page

Vous devriez avoir un fichier dans votre répertoire appelé /application/controllerspage.php qui ressemble à ceci:

if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Page extends Controller { 
    function __construct() { 
     parent::Controller(); 
     // etc etc 

de plus, à moins que vous chargez des données de votre modèle à utiliser chaque fois que vous appelez ce contrôleur, vous devez placer vos appels de modèle dans une méthode non-constructeur de cette classe. Quelque chose comme:

class Page extends Controller { 
    function __construct() { 
     parent::Controller(); 
    } 

    function index() { 
     $this->load->model('Member_model'); 
     $data = $this->Member_model->load_member_data(); 
     $this->load->view('myview', array('data'=>$data)); 
    } 
} 

Encore une fois ... pas tout à fait sûr de ce contexte que vous faites tout cela, mais il semble que vous n'êtes pas debout fermement dans le cadre. Il n'y a pratiquement aucune raison que vous utilisiez la classe loader pour charger les contrôleurs, et de plus, il n'y a aucune raison de créer des instances autonomes de classes de modèles en utilisant le mot-clé new de PHP.

+0

@treeface - Je ne pense pas que je voulais utiliser la classe loader pour configurer un contrôleur. Je voulais utiliser la classe loader pour configurer des objets spécifiques. Lorsque j'ai créé la bibliothèque, je n'ai pas pu charger le modèle.Il m'a semblé que le chargement du modèle ne fonctionnait que dans la bibliothèque quand j'en ai fait un contrôleur. Voici ce que je veux faire: mon contrôleur de base est page.php et j'utilise __remap() de sorte que toutes les URL de/page/quelque chose vont à ce contrôleur. De là, je veux être capable d'instancier divers objets basés sur des classes définies comme membre, utilisateur, etc. Pouvez-vous suggérer la bonne façon de faire cela? Merci! – Gary

+0

@treeface - ok, je pense que je me rapproche. Dans page.php j'appelle le modèle, qui renvoie les données dont j'ai besoin, * puis * J'appelle la bibliothèque dans laquelle j'instancie l'objet, en incluant ces données de modèle dans l'appel de bibliothèque. Suis-je sur le bon chemin? – Gary

+0

@Gary Si vous souhaitez obtenir des données d'un modèle dans votre bibliothèque, vous devez obtenir une référence au contrôleur CI actuellement utilisé. Pour faire cela dans votre contrôleur, vous devriez faire ceci: '$ CI = & get_instance();'. Vous pouvez maintenant appeler le modèle en faisant '$ CI-> my_model-> getMyData();'. – treeface

Questions connexes