CodeIgniter: Dynamisch een model aanspreken

Pagina: 1
Acties:

  • Dimby
  • Registratie: April 2008
  • Laatst online: 01-07-2024
Ik ben bezig met een eigen CMS systeem dat gebaseerd is op het CodeIgniter framework. Bij dit CMS systeem horen natuurlijk ook plugins, het aparte aan mijn CMS systeem is dat elke plugin positie apart getweaked kan worden. Een voorbeeld:
Op een pagina wil ik een contactformulier laden, op de plaats waar het formulier moet komen staat dan {PLUGIN_ITEM_25}. Het id 25 slaat op een rij in de database met daarin de bijhorende plugin, functie en eventuele settings.

In dit voorbeeld is het:
Plugin: cms_plugin_contact
Functie: show_form
Settings: -

Bij het renderen van de pagina wordt {PLUGIN_ITEM_25} doorgestuurd naar een model plugin en de functie get_html_by_pluginitem(). Deze functie haalt de bijbehorende gegevens op uit de database en laad vervolgend de plugin (een model).
Dit gaat allemaal nog goed, maar vervolgens moet er een functie worden aangeroepen in het geladen model. Maar omdat de naam van de geladen plugin en de functie opgeslagen staan in een variabel heb ik geen idee hoe ik die nu weer moet aanspreken.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php

class cms_core_plugin extends Model{

    var $item_cache = array();
    var $plugin_cache = array();
    
    var $error = false;

    function cms_core_plugin()
    {
        parent::Model();
    }

function get_html_by_pluginitem( $plugin_item_id = false )
{

    if( array_key_exists($plugin_item_id, $this -> item_cache) )
    {
        $item_data = $this -> item_cache[$plugin_item_id];
    }else{
        $item_data = $this -> get -> plugin_item_data($plugin_item_id);
        $this -> item_cache[$plugin_item_id] = $item_data;
    }
        
    if( !$item_data )
    {
        $this -> set_error('Er kon geen item (plugin) gevonden worden'); return false;
    }
        
    if( array_key_exists($item_data['plugin'], $this -> plugin_cache) )
    {
        $plugin_data = $this -> plugin_cache[$item_data['plugin']];
    }else{
        $plugin_data = $this -> get -> plugin_data($item_data['plugin']);
        $this -> plugin_cache[$item_data['plugin']] = $plugin_data;
    }
        
    $read_settings = simplexml_load_string( $item_data['settings'] );
    $settings = $read_settings -> children();
    
    if( !array_key_exists('function', $settings) )
    {
        $this -> set_error('Geen functie instelling gevonden bij het item'); return false;
    }
    
        $function = $settings['function'];
    
    $model = substr( $plugin_data['model'], 0, -4); //Dit is de naam van de plugin (model) die geladen moet worden, in ons voorbeeld dus cms_core_plugin
    
    $CI =& get_instance(); //Laad het super-object van CI
    $CI -> load -> model($model); //Laad het nieuwe model
    
        //Tot hier gaat alles nog goed maar dan moet ik de plugin en functie aanroepen
        //Wat is wil is zeg maar het volgende:

        return $this -> $model -> $function(); //Maar dit werkt natuurlijk niet

}

    function set_error( $error = false )
    {
        $this -> error = $error;
        return false;
    }
    
    function get_error()
    {
        return $this -> error;
    }

}

[ Voor 15% gewijzigd door Dimby op 24-07-2010 09:29 ]


  • Priet
  • Registratie: Januari 2001
  • Laatst online: 07:10

Priet

To boldly do what no one has..

Dimby schreef op zaterdag 24 juli 2010 @ 09:23:
Maar omdat de naam van de geladen plugin en de functie opgeslagen staan in een variabel heb ik geen idee hoe ik die nu weer moet aanspreken.
Je kunt in PHP gebruik maken van 'variabele variabelen':
PHP:
1
2
$var = "Form";
$obj = new $var();


En je kunt gebruik maken van call_user_func:

PHP:
1
call_user_func(array($this->$model, $function));

[ Voor 20% gewijzigd door Priet op 24-07-2010 11:31 ]

"If you see a light at the end of a wormhole, it's probably a photon torpedo!"


  • Dimby
  • Registratie: April 2008
  • Laatst online: 01-07-2024
Probleem is inmiddels opgelost met behulp van Priets reactie.

PHP:
1
2
3
<?php

return call_user_func(array($model, $function), $settings);