سؤال

أحاول إنشاء عنصر واجهة مستخدم داخل الوحدة النمطية ثم قم بتحميل عنصر واجهة المستخدم من "خارج" الوحدة النمطية. بشكل خاص ، أنا أستخدم وحدة المستخدم التي كتبها شخص آخر. لا أرغب في الحصول على صفحة منفصلة لعرض نموذج تسجيل الدخول ، لذلك حاولت إنشاء corptlet/عنصر واجهة مستخدم (الارتباك) يعرض نموذج تسجيل الدخول. في الأساس ، قمت بنقل الكود من LoginController إلى تلك القطعة. ثم أحاول عرض القطعة على بعض الصفحات العشوائية بواسطة

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

ومع ذلك ، أحصل على خطأ

CWebApplication does not have a method named "encrypting".

في فئة سقة المستخدم في هذا السطر:

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

يحدث هذا ، لأنني أحاول بشكل أساسي تنفيذ هذا الرمز في سياق التطبيق وليس الوحدة النمطية. وبالتالي فإن "yii :: app ()-> وحدة تحكم-> وحدة النمط" لا تعمل حقًا كما هو متوقع.

  1. ما الخطأ الذي افعله:-
  2. هل هناك طريقة أفضل لتحقيق ذلك. IE عرض نموذج تسجيل الدخول هذا في بعض الصفحات الأخرى ، والتي يتم عرضها عادة عن طريق الوصول إلى وحدة تحكم تسجيل الدخول داخل وحدة المستخدم (المستخدم/تسجيل الدخول) أم أن عنصر واجهة مستخدم هو الطريقة الصحيحة للقيام بذلك؟

شكرًا.

هل كانت مفيدة؟

المحلول

الحل السريع

حسنًا ، لذلك انتهى بي الأمر ببساطة

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

بدلاً من

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

لاحظ أن الوحدة الآن يجب يجب استدعاء "المستخدم" في التكوين الرئيسي ، لكنني أعتقد أن هذا يسمح بمزيد من المرونة. أي أننا لسنا ملزمين فقط باستخدام وظائف الوحدة النمطية داخل الوحدة.

نظرة ثاقبة إضافية على عرض القطعة خارج نطاق الوحدة النمطية

بعد اللعب أكثر مع ذلك ، هذا ما فعلته. في usermodule.php لقد قمت بإنشاء طريقة

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

ثم في كل مكان حيث أحتاج إلى الوحدة النمطية التي أستخدمها

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

لا أحب وجود العديد من الواردات المتعلقة بالوحدة مثل:

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

لأن لدينا بالفعل تلك الواردات في 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.*',
    ));
}

لذلك كلما تعلم أن بعض الوظائف سيتم استخدامها خارج الوحدة ، من المهم التأكد من تحميل الوحدة النمطية. على سبيل المثال ، في أداة تسجيل الدخول التي أحاول عرضها ليس في أحد وحدات التحكم في الوحدة النمطية ، لدي هذا السطر من التعليمات البرمجية:

$model = new UserLogin;

ومع ذلك ، فإن userlogin هو نموذج داخل وحدة المستخدم ، ولكي نكون قادرين على التحميل التلقائي لهذا النموذج ، علينا أولاً التأكد من تهيئة الوحدة:

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

آمل أن يكون هذا مفيدًا إذا كنت عالقًا مع مفهوم الوحدات بأكملها بالطريقة التي كنت بها.http://www.yiiframework.com/forum/index.php؟/topic/6449-access-another-modules-model/ كان مفيدًا ولكن من الصعب العثور عليه =)

نصائح أخرى

من الأفضل أن تحرك هذا التشفير () إلى فئة myuseridentiy التي تمتد cuseridentity. أيا كان الرمز الذي تأخذه لاستخدامه ، فإنهم يضعون الطريقة في وحدة التحكم هو فكرة سيئة ونتيجة لذلك لا يمكنك إعادة استخدام هذا الرمز.

يجب أن يظل نموذج تسجيل الدخول ينشر إلى وحدة تحكم المستخدم/تسجيل الدخول ، لكنني أعتقد أنهم يستخدمون رمز تسجيل الدخول القياسي لـ YII وقد ترغب في تعديله لاستخدام myuseridentity.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top