1

現在、このコードは機能します。

class Home extends MY_Controller {

public function index($renderData=""){  

    $this->title = "Needzilla";
    $this->keywords = "Needzilla";

            $this->_render('pages/register',$renderData);
    }

これをその下に追加した瞬間...

public function home($renderData=""){   

    $this->title = "Needzilla";
    $this->keywords = "Needzilla";

            $this->_render('pages/home',$renderData);
}

これが起こります。

ここに画像の説明を入力

これは、このコード行を指しています。

    //data
    $toBody["content_body"] = $this->load->view($view,array_merge($this->data,$toTpl),true);

関数をコントローラーに追加して、その関数を呼び出すと別のページが開くようにする方法を見つけようとしています....たとえば...

このページからの取得 (サインインをクリックした後)...

ここに画像の説明を入力

このページへ... ここに画像の説明を入力

完全な My_Controller コードはこちら。

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

 class MY_Controller extends CI_Controller{

//Page info
protected $data = Array();
protected $pageName = FALSE;
protected $template = "main";
protected $hasNav = TRUE;
//Page contents
protected $javascript = array();
protected $css = array();
protected $fonts = array();
//Page Meta
protected $title = FALSE;
protected $description = FALSE;
protected $keywords = FALSE;
protected $author = FALSE;

function __construct()
{   

    parent::__construct();
    $this->data["uri_segment_1"] = $this->uri->segment(1);
    $this->data["uri_segment_2"] = $this->uri->segment(2);
    $this->title = $this->config->item('site_title');
    $this->description = $this->config->item('site_description');
    $this->keywords = $this->config->item('site_keywords');
    $this->author = $this->config->item('site_author');

    $this->pageName = strToLower(get_class($this));
}


protected function _render($view,$renderData="FULLPAGE") {
    switch ($renderData) {
    case "AJAX"     :
        $this->load->view($view,$this->data);
    break;
    case "JSON"     :
        echo json_encode($this->data);
    break;
    case "FULLPAGE" :
    default         : 
    //static
    $toTpl["javascript"] = $this->javascript;
    $toTpl["css"] = $this->css;
    $toTpl["fonts"] = $this->fonts;

    //meta
    $toTpl["title"] = $this->title;
    $toTpl["description"] = $this->description;
    $toTpl["keywords"] = $this->keywords;
    $toTpl["author"] = $this->author;

    //data
    $toBody["content_body"] = $this->load->view($view,array_merge($this->data,$toTpl),true);

    //nav menu
    if($this->hasNav){
        $this->load->helper("nav");
        $toMenu["pageName"] = $this->pageName;
        $toHeader["nav"] = $this->load->view("template/nav",$toMenu,true);
    }
    $toHeader["basejs"] = $this->load->view("template/basejs",$this->data,true);

    $toBody["header"] = $this->load->view("template/header",$toHeader,true);
    $toBody["footer"] = $this->load->view("template/footer",'',true);

    $toTpl["body"] = $this->load->view("template/".$this->template,$toBody,true);


    //render view
    $this->load->view("template/skeleton",$toTpl);
     break;
}
}
}

フルホームクラス

class Home extends MY_Controller {

public function index($renderData=""){  

    $this->title = "Needzilla";
    $this->keywords = "Needzilla";

            $this->_render('pages/home',$renderData);
}
 }
4

3 に答える 3

0

関数名homeはクラス/コントローラー名と同じであるため、php コンストラクター マニュアルで説明されているように、クラスのコンストラクターとして自動的に宣言されます。

コンストラクターは、new を使用してクラスの新しいインスタンスを作成するときに自動的に呼び出されるクラス内の関数です。関数がクラスと同じ名前を持つ場合、関数はコンストラクターになります。クラスにコンストラクターがない場合、基本クラスのコンストラクターが存在する場合は、それが呼び出されます。

サンプルコードAuto_Cart()はコンストラクターです。ホーム関数はクラスのコンストラクターになるため、関数の名前を変更する必要があります

class Auto_Cart extends Cart {
    function Auto_Cart() {
        $this->add_item("10", 1);
    }
}

ここで見つけることができる別の例コンストラクターとデストラクタ

PHP 5.3.3 以降、名前空間クラス名の最後の要素と同じ名前のメソッドは、コンストラクターとして扱われなくなりました。この変更は、名前空間のないクラスには影響しません。

サンプル コードBar()は、PHP のバージョンに応じてコンストラクターとして機能します。

namespace Foo;
class Bar {
    public function Bar() {
        // treated as constructor in PHP 5.3.0-5.3.2
        // treated as regular method as of PHP 5.3.3
    }
}

したがって、コンストラクタにアクセスしようとするとhome()、親クラスのコンストラクタが load プロパティを処理する必要がありますが、親コンストラクタをオーバーライドすると、 undefined の通知が生成されます

于 2014-03-07T20:35:16.047 に答える
0

新しいクラスで親のコントローラーを拡張する必要があります。

コードイグナイターのドキュメントによると

「コントローラーのコア クラスを拡張する場合は、必ずアプリケーション コントローラーのコンストラクターで新しいクラスを拡張してください。」

class Welcome extends MY_Controller {

    function __construct()
    {
        parent::__construct();
    }

    function index()
    {
        $this->load->view('welcome_message');
    }
}
于 2014-03-07T20:36:10.860 に答える
0

別のURIにルーティングするのではなく、既存のテンプレートに別のビューをロードするだけでよいと思います。

「/home/」のルートがあるとしましょう

以前は、「main_content」という動的領域を持つテンプレートを作成していました。それは次のように見えました:

<html>
<head>
   ...
</head>
<body>
   ...   
   <?php $this->load->view($main_content); ?>
   ...
</body>
</html>

次に、コントローラーに次のようなものがありました。

<?php
   if( not_logged_in )
   {
       $data['main_content'] = 'views/login_form';
   }
   else
   {
       $data['main_content'] = 'views/dashboard';
   }

   $this->load->view('/views/templates/page', $data);

上記のすべての PHP ロジックは、同じルート内にありました。ユーザーがログインしているかどうかに応じて、2 つの異なるビューが表示されるだけです。

于 2014-03-07T20:28:53.600 に答える