Domanda

Sto cercando di creare un widget all'interno del modulo e quindi caricare quel widget da "esterno" del modulo. Più in particolare sto usando il modulo utente scritto da qualcun altro. Non voglio avere una pagina separata per la visualizzazione di un modulo di accesso, quindi ho provato a realizzare un centesimo/widget (confusione) che visualizza il modulo di accesso. Fondamentalmente, ho spostato il codice da LoginController in quel widget. Quindi provo a visualizzare il widget su una pagina casuale di

<?php $this->widget('user.components.LoginForm'); ?>

Tuttavia, ricevo un errore

CWebApplication does not have a method named "encrypting".

Nella classe di identità user in questa riga:

else if(Yii::app()->controller->module->encrypting($this->password)!==$user->password)

Questo accade, perché sto fondamentalmente cercando di eseguire questo codice nel contesto dell'app e non del modulo. Quindi il trucco "Yii :: App ()-> Controller-> Module" non funziona davvero come previsto.

  1. Che cosa sto facendo di sbagliato:-
  2. C'è un modo migliore per raggiungere questo obiettivo. Cioè visualizzare quel modulo di accesso in qualche altra pagina, che viene normalmente visualizzata accedendo al controller di accesso all'interno del modulo utente (utente/accesso) o è un widget il modo giusto di farlo?

Grazie.

È stato utile?

Soluzione

La soluzione rapida

Ok, quindi ho semplicemente fatto per fare

Yii::app()->getModule('user')->encrypting($this->password)

invece di

Yii::app()->controller->module->encrypting($this->password)

Nota che ora il modulo dovere Essere chiamati "utente" nella configurazione principale, ma penso che ciò consenta una maggiore flessibilità. Cioè non siamo tenuti a utilizzare solo funzionalità del modulo all'interno del modulo.

Ulteriori informazioni sulla visualizzazione del widget all'esterno dell'ambito del modulo

Dopo aver giocato di più, è quello che ho fatto. In usermodule.php ho creato un metodo

public static function id() {
    return 'user';
}

Poi ovunque dove ho bisogno del modulo che uso

Yii::app()->getModule(UserModule::id())->encrypting($this->password)

Non mi piace avere molte importazioni relative al modulo come:

'application.modules.user.models.*',
'application.modules.user.components.*',

Perché abbiamo già quelle importazioni in usermodule.php:

public function init()
{
    // this method is called when the module is being created
    // you may place code here to customize the module or the application

    // import the module-level models and components
    $this->setImport(array(
        'user.models.*',
        'user.components.*',
    ));
}

Pertanto, ogni volta che sai che un pezzo di funzionalità verrà utilizzato al di fuori del modulo, è importante assicurarsi che il modulo sia caricato. Ad esempio, nel widget loginform che sto cercando di visualizzare non in uno dei controller dei moduli, ho questa riga di codice:

$model = new UserLogin;

Tuttavia, UserLogin è un modello all'interno del modulo utente e per poter caricare automaticamente questo modello dobbiamo prima assicurarci che il modulo sia stato inizializzato:

$module = Yii::app()->getModule(UserModule::id());
$model = new UserLogin;

Spero che questo sarà utile se sei rimasto bloccato dall'intero concetto di moduli come ero.http://www.yiiframework.com/forum/index.php?/topic/6449-access-another-modules-model/ è stato utile ma difficile da trovare =)

Altri suggerimenti

Faresti meglio a spostare quel crittografia () in una classe MyUserIdentiy che estende la CuserIdentity. Qualunque sia il codice che prendi da usare, mettere il metodo nel controller è una cattiva idea e di conseguenza non è possibile riutilizzare quel codice.

Il modulo di accesso dovrebbe comunque pubblicare sul controller utente/di accesso, ma immagino che utilizzino il codice di accesso standard di YII e potresti voler modificarlo per utilizzare il MyUserIdentity.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top