44 votes

CodeIgniter: la Charge de contrôleur au sein du contrôleur de

J'ai un home contrôleur avec un index action qui affiche un ensemble de produits en vedette. Toutefois, les produits sont gérés par le biais d'un product contrôleur, y compris un modèle propriétaire et points de vue.

Comment puis-je accéder product de l'information à partir de l'intérieur de l' index d'action dans l' home contrôleur? L'instanciation product ne fonctionnera pas tant que la classe n'est pas chargée au moment de l'exécution et de CodeIgniter n'offre pas un moyen de charger dynamiquement des contrôleurs. Mettre la product de la classe dans un fichier de bibliothèque n'a pas vraiment de travail, soit.

Pour être précis, j'ai besoin que le produit points de vue (rempli avec les données traitées par l' product contrôleur) inséré dans la vue index. Je suis en cours d'exécution CodeIgniter 2.0.2.

63voto

Zain Abbas Points 365

La charge de cette

$this->load->library('../controllers/instructeur");

et d'appeler la méthode suivante:

$this->instructeur->functioname()

et avoir du plaisir.

Profitez de

Merci

29voto

Wesley Murch Points 48959

Si vous êtes intéressé, il y a un paquets que vous pouvez ajouter à votre Codeigniter projet qui permettra de gérer:

https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/

Des Extensions modulaires rend le framework PHP CodeIgniter modulaire. Les Modules sont des groupes de composants indépendants, typiquement modèle, le contrôleur et la vue, disposées dans un des modules de l'application du sous-répertoire, qui peuvent être déposés dans les autres CodeIgniter applications.

OK, donc le grand changement est que maintenant vous seriez en utilisant une structure modulaire - mais pour moi, c'est souhaitable. J'ai utilisé CI pour environ 3 ans maintenant, et ne peut pas imaginer la vie sans Extensions Modulaires.

Maintenant, voici la partie qui traite directement appel aux contrôleurs pour le rendu de la vue des partiels:

// Using a Module as a view partial from within a view is as easy as writing:
<?php echo modules::run('module/controller/method', $param1, $params2); ?>

C'est tout là est à lui. Je l'utilise généralement ce pour le chargement peu de "widgets" comme:

  • Des calendriers d'événements
  • Liste des dernières news articles
  • Bulletin d'inscription les formulaires
  • Les sondages

Généralement, je construire un "widget" contrôleur pour chaque module et de l'utiliser uniquement pour ce but.

Votre question a aussi été l'une de mes premières questions quand j'ai commencé avec Codeigniter. J'espère que cela vous aide, même si elle peut être un peu plus que vous avez été recherchez. J'ai été en utilisant MX depuis et je n'ai pas regardé en arrière.

Assurez-vous de lire les docs et découvrez la multitude d'informations concernant ce package sur le Codeigniter forums. Profitez-en!

8voto

Dans ce cas, vous pouvez essayer certains de la vieille école php.

// insert at the beggining of home.php controller require_once(dirname(__FILE__)."/product.php"); // the controller route.

Ensuite, vous aurez quelque chose comme:

Class Home extends CI_Controller
{
 public function __construct()
 {
  parent::__construct();
  $this->product = new Product();
  ...
 }

 ...
 // usage example
 public function addProduct($data)
 {
  $this->product->add($data);
 }
}

Puis il suffit d'utiliser le contrôleur de méthodes que vous le souhaitez.

8voto

Salvador P. Points 357

Juste pour ajouter plus d'informations à ce Zain Abbas a dit:

Charger le contrôleur de cette façon, et de l'utiliser comme il le dit:

$this->load->library('../controllers/instructor');

$this->instructor->functioname();

Ou vous pouvez créer un objet et de l'utiliser de cette façon:

$this->load->library('../controllers/your_controller');

$obj = new $this->your_controller();

$obj->your_function();

J'espère que cela peut aider.

6voto

machineaddict Points 1638

Basé sur @Joaquin Astelarra réponse, j'ai réussi à écrire ce petit assistant nommé load_controller_helper.php:

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

if (!function_exists('load_controller'))
{
    function load_controller($controller, $method = 'index')
    {
        require_once(FCPATH . APPPATH . 'controllers/' . $controller . '.php');

        $controller = new $controller();

        return $controller->$method();
    }
}

Vous pouvez utiliser/l'appeler comme ceci:

$this->load->helper('load_controller');
load_controller('homepage', 'not_found');

Remarque: Le deuxième argument n'est pas obligatoire, car il va exécuter la méthode nommée index, comme CodeIgniter serait.

Maintenant, vous serez en mesure de charger un contrôleur à l'intérieur d'un autre contrôleur sans l'aide de HMVC.

Plus tard Edit: sachez que cette méthode peut avoir des résultats inattendus. Toujours tester!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X