Yii modül içinde gereci

2 Cevap php

Ben modülü içinde bir aracı oluşturmak ve ardından modülü 'dışında' o widget'ı yüklemeye çalışıyorum. Daha özellikle ben başkası tarafından yazılmış kullanıcı modülü kullanıyorum. Ben bu yüzden giriş formunu gösteren bir CPortlet / Widget (konfüzyon) yapmaya çalıştı, bir giriş formu göstermek için ayrı bir sayfa var istemiyorum. Temelde, bu widget'ı LoginController kodu hareket ettik. Sonra bazı rasgele sayfada Widget görüntülemek çalıştığınızda

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

Ancak, ben bir hata alıyorum

CWebApplication does not have a method named "encrypting".

Bu hat UserIdentity sınıfta:

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

Ben temelde uygulaması değil modülü kapsamında bu kod çalıştırmak için çalışıyorum çünkü bu, olur. Böylece "Yii :: app () -> Kontrol-> modülü" beklendiği gibi hile gerçekten işe yaramazsa.

  1. \: - Neyi yanlış yapıyorum
  2. Bunu başarmak için daha iyi bir yolu var mı. Yani Normalde (user / login) kullanıcı modülü içinde giriş denetleyicisi erişerek görüntülenen veya bir widget bunu yapmanın doğru yolu diğer bazı sayfasında bu giriş formu, gösterilecek?

Teşekkürler.

2 Cevap

The quick solution

Tamam, bu yüzden sadece yapıyor sona erdi

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

yerine

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

Artık modül must ana config 'kullanıcı' olarak adlandırılan, ama bence olması Bildirimi Bu daha fazla esneklik sağlar. Yani biz sadece modül içinde modül işlevi kullanmak için bağlı değiliz.

Additional insight on displaying widget outside of the module scope

Onunla daha oynadıktan sonra ben yaptım. UserModule.php ben bir yöntem oluşturduk

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

Ben kullanmak modülü gerekir Sonra her yerde nerede

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

Ben gibi modülüne ilgili birçok ithalat yaşıyorsanız sevmiyorum:

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

Biz zaten UserModule.php bu ithalatı var çünkü:

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.*',
    ));
}

Işlevsellik bazı parça modülü dışında kullanılan olacağını biliyorum her nedenle emin modülünün yüklü olduğundan emin olmak için önemlidir. Örneğin, ben modül denetleyicileri birinde DEĞİL görüntülemek çalışıyorum LoginForm widget, ben bu kod satırı var:

$model = new UserLogin;

Ancak, UserLogin Kullanıcı modülün içinde bir modeldir ve bu model autoload edebilmek için öncelikle emin modül başlatılmak oldu yapmak zorunda:

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

I hope this will be helpful if you were stuck with the whole modules concept the way I was. http://www.yiiframework.com/forum/index.php?/topic/6449-access-another-modules-model/ was useful but hard to find =)

Sen iyi CUserIdentity uzanan bir MyUserIdentiy sınıfa ki şifreleniyor () hareket ettirin. Kullanmak için almak ne olursa olsun kod, onlar denetleyicisi yöntemi koyarak kötü bir fikir olduğunu ve bunun sonucu olarak bu kodu yeniden olamaz.

Login form hala Kullanıcı / Giriş denetleyicisi göndermek gerekir ama onlar Yii standart giriş kodu kullanmak ve MyUserIdentity kullanmak için değiştirmek isteyebilirsiniz sanırım.