1

アプリにモジュールがあり、そのデフォルトのコントローラーの下にrenderPageLinks、ウィジェットが使用する配列を返す関数が呼び出されています。

ウィジェットはgenMenu、/themes/jui/views/layouts/main.php から呼び出されます (メニューを生成します) renderPageLinks からウィジェットに値としてデータを渡す必要があります。

$this->widget('pageLinkGen', array('pages' => renderPageLinks()));

問題は、Yii が関数 renderPage Links を見つけられないことです。

私は利用するために、次のさまざまな組み合わせを試しました..

$this->widget('pageLinkGen', array('pages' => 'application.module.QuickDial.default.renderPageLinks()'));

助言がありますか?

ps コントローラ pageLinkGen に移動しようとしrenderPageLinks()ましたが、Yii は で使用されているモデルを見つけられませんrenderPageLinks()

4

4 に答える 4

4

クエリしているモデルがモジュール内にあると仮定すると、3 つの回避策があります。

1

できることは、 QuickDialModule.phpファイル、つまりQuickDialModule クラス内で関数を定義することです。次に、次のように使用できます。renderPageLinks()

Yii::app()->getModule('QuickDial')->renderPageLinks();

この関数を QuickDialModule クラス内に記述する必要があります。

Class QuickDialModule extends CWebModule{
   public function init(){
     // ... code ...
   }
   // ... code ... other functions

   public function renderPageLinks(){
       // ... do whatever you were doing inside the function ...
   }
}

編集:
コントローラは、アプリケーションがユーザーから URL リクエストを受信した場合にのみ、yii によってインスタンス化されます。

function を宣言することで、別の回避策がありますstaticしかし、次に、 function を持つクラスを持つ php ファイルを、main.php 構成ファイルの yii autoloading 配列にインポートする必要があります。したがって、defaultcontroller renderPageLinks() 関数を静的に変更します。

public static function renderPageLinks(){
   // do whatever you were doing
}

protected/config/ フォルダー内のメイン構成main.phpを変更して、コントローラーを自動ロードします。

// autoloading model and component classes
'import'=>array(
    'application.models.*',
    'application.components.*',
    'application.modules.quickdial.controllers.*' // this line is added
),

次に、静的関数を直接呼び出します。

$this->widget('pageLinkGen', array('pages' => DefaultController::renderPageLinks()));

もちろん、この静的メソッドが機能するには、コントローラー DefaultController を持つモジュールを 1 つだけ持つ必要があります。または、他のモジュールのコントローラーをインポートしてはなりません。いずれにしても、名前の競合が発生する可能性があります。

関数をメイン モジュールのコントローラ (つまり、前述の pageLinkGen コントローラ) に移動する場合は、必要なモデルをメイン モジュールの構成 main.php にインポートする必要があります (yii がそれを見つけられるようにするため)。 、インポート配列の自動ロードに次を追加します。

  // autoloading model and component classes
'import'=>array(
    'application.models.*',
    'application.components.*',
    'application.modules.quickdial.models.*' // this line is added
),

コントローラーがモデルを見つけられるようにします。

于 2012-03-09T06:47:08.777 に答える
1

コントローラーにrenderPageLinks関数があり、正しいコントローラーへの参照であると想定している場合$thisは、コントローラーを直接参照して関数を呼び出してみてください。

$this->widget('pageLinkGen', array('pages' => $this->renderPageLinks()));

私が知る限り、PHPは暗黙的をサポートしていません$this

于 2012-03-07T18:47:17.747 に答える
0

最初に YourModule::renderPageLinks() メソッドを呼び出して、返された結果を渡すだけでよいと思います。

$pages = YourModule::renderPageLinks();
$this->widget('pageLinkGen', array('pages' => $pages));
于 2012-07-03T15:39:01.263 に答える
0

bool.dev's suggetion was great but still didn't work in my instance, I believe this was due to disorganization on my end. I first moved the models to /protected/models/ and then created a CPortlet object that included the page rendering and call. I based this on the documentation found here in the blog demonstration. I did not split the view form the controller in this instance because currently it is only calling the Bootstrap BootNavbar widget. Future themes may use a separate view page.

Thanks again for all of your help.

于 2012-03-09T15:49:20.990 に答える