PDA

View Full Version : پیاده سازی سیستم ماژولار با UserControl



farshadfal
چهارشنبه 16 آذر 1390, 22:28 عصر
با سلام خدمت دوستان عزیز - یک سوال داشتم در زمینه یوزر کنترل‌ها - من می‌خوام یه سیستمی‌ طراحی کنم که قابلیت ماژول پذیری داشته باشه .

جاهای زیادی هم دیدم که نوشتن با یوزر کنترل می‌شه ولی‌ تا اونجایی که من دیدم از قبل توی کد‌ها اسم یوزر کنترل رو میدن و فقط اون یوزر کنترل هارو مخفی‌ می‌کنن یا نمایش میدن - و جایی‌ ندیدم که آموزش داده باشن که از ادمین بشه یوزر کنترل رو آپلود کرد و یون یوزر کنترل رو همونجا فعال کرد - یه‌چیزی مثل ابزارک‌های وردپرس .

اگه کسی‌ اطلاعاتی‌ در این زمینه داره ممنون میشم در اختیار من بزاره .

raziee
چهارشنبه 16 آذر 1390, 22:55 عصر
با سلام.
ببینید شما تعداد n تا UserControl دارید که به عنوان ماژول هستند.
حتی خیلی از این UserControl ها از ابتدا نوشته نشده اند و بعدا به پروژه اضافه (Install) میشند.
شما به صورت ساده باید نام ماژول و آدرس UserControl مربوطه رو نگهداری کنید (مثلا در دیتابیس).
خوب ما تا اینجا نام ماژول و آدرس UC مربوطه رو داریم. حالا کاری که باید انجام بدیم نحوه ی نمایش اون هست.
این به سیستم شما برمیگرده که چجوری میخواهید به مدیریت سایت اجازه ی انتخاب ماژول رو بدید.
مثلا اگه قرار باشه یه سری آدم که سطح دسترسی مربوطه رو دارن بتونن صفحه ی جدیدی ایجاد کنن و یکی از این ماژول ها رو انتخاب کنن شما باید اطلاعات مربوط به صفحه رو ذخیره کنید که در اون آدرس UC و یا UC ها ذخیره شده.
خوب ما تا اینجا هم اطلاعات ماژول ها رو داریم هم اطلاعات صفحات رو.
حالا زمان اضافه کردن ماژول به صفحه هست.
End User صفحه رو درخواست میده . عملیات زیر باید انجام بشه.
1 : بدست آوردن مشخصات صفجه.
2 : بدست آوردن ماژول و یا ماژول هایی که باید به صفحه اضافه بشن.
3 : اضافه کردن مازول به صفحه(یعنی Load کردن UC بوسیله ی آدرسی که از UC داریم و اضافه کردن اون به یه شیء مثل Page و یا PlaceHolder)

farshadfal
چهارشنبه 16 آذر 1390, 23:24 عصر
ببخشید من می‌خوام بدونم که مثلا من الان قالب سایتو آماده کردم - تو ستون سمت چپ که قراره ماژول‌ها قرار بگیر توش یه place holder می‌زاریم اصلا چرا place holder ؟ بعدش اینکه تو place holder چه کدی باید بزاریم - فعلا اینرو جواب بدین ممنون میشم .

raziee
چهارشنبه 16 آذر 1390, 23:42 عصر
protected void Page_Load(object sender, EventArgs e)
{
UserControl module = (UserControl)LoadControl("UserControlPath.ascx");
myPlaceHolder.Controls.Add(module);
}
شما میتونید از هر کنترلی که دوست دارید به جای PlaceHolder استفاده کنید.
مثلا به جای PlaceHolder از Panel استفاده کنید.
در دو حالت ViewSource کنید ببینید چه فرقی دارند.
PlaceHolder بعد از Render شدن هیچ کد اضافه رو تولید نمیکنه.

farshadfal
چهارشنبه 16 آذر 1390, 23:55 عصر
خوب ما الان این کدو می‌زاریم - بعدش میخوایم همه ماژول‌هایی‌ که نصب هستو نمایش بده باید چیکار کنیم ?

raziee
پنج شنبه 17 آذر 1390, 18:48 عصر
خوب ما الان این کدو می‌زاریم - بعدش میخوایم همه ماژول‌هایی‌ که نصب هستو نمایش بده باید چیکار کنیم ?
هیچ وقت پیش نمیاد که همه ی ماژول ها رو بخواهید نمایش بدید. باید ماژول هایی که برای اون درخواست(صفحه) هست رو بررسی کنید.


2 : بدست آوردن ماژول و یا ماژول هایی که باید به صفحه اضافه بشن.
3 : اضافه کردن مازول به صفحه(یعنی Load کردن UC بوسیله ی آدرسی که از UC داریم و اضافه کردن اون به یه شیء مثل Page و یا PlaceHolder)
پست ها رو با دقت بیشتری بخونید و کمی روی اونها تحلیل داشته باشید.
ببنید چه جوری میشه اون ها رو پیاده کرد.

farshadfal
جمعه 18 آذر 1390, 13:50 عصر
خوب من میخوام همین نصب کردنرو بدونم جاهای دیگه که خوندم فقط user contorol های از قبل تعیین شدرو میان استفاده میکنن من میخوام بدونم وقتی سایتو پابلیش میکنیم چجوری user contorol هایی که بعدا نصب میشن رو تو place holder اضاففه کنیم .

Saman Hashemi
جمعه 18 آذر 1390, 19:01 عصر
از یه جدول توی بانک برای اینکار استفاده کنید اسم یوزرکنترل،اسم place holder،اسم صفحه و...

fakhravari
جمعه 18 آذر 1390, 19:14 عصر
با سلام
بحث این پست در کل یوزر کنترل نیست.
یه مثالی میرنم < سایت بلاگفا.
که تمام بخشها رو میشه دستکاری کرد.
بحث این پست farshadfal (http://barnamenevis.org/member.php?143456-farshadfal) به همین موضوع ربط داره

Saman Hashemi
جمعه 18 آذر 1390, 19:44 عصر
خوب اگه در مورد یوزرکنترل نیست در مورد چیه؟دوست عزیز شما یه جدول داری میگی از این یوزرکنترل میخوام استفاده کنم یا نه؟
برای این یه جدول دارید اسم همه یوزرکنترلهای اون صفحه و مکانشون بدست میارید و لود میکنید...!
توی یه صفحه هم براش مدیریت ایجاد میکنید کم و زیاد کردن تغییر جا و آدرس و...
پنل مدیریت هم شما درست کن برای دستکاری...!
پ.ن:شما مطمئن باش منظور ایشون همینه حالا من که هیچی بلد نیستم اما با شناختی که از آقای رضئی دارم ایشون اینقدر تجربه دارن که معنی ماژولار درک کنند و نیاز به تفهیم نیست...!

farshadfal
جمعه 18 آذر 1390, 20:31 عصر
ممنون از جواب هاتون - من منظورم اون user contorol هایی که از قبل تو پروژه توسط برنامه نویس قرار داده شده نیست

مثلا الان بنده پرتال رو پابلیش و تموم کردم - تحویل مشتری دادم ، حالا 6 ماه بعد مشتری میاد میگه من میخوام اینجای سایت مثلا اوقات شرعی بزارین ، مسئله سر نصب کردن این user contorol هست وقتی پروژه پابلیش شده و من فقط به طرف user contorol رو بدم - جوری باشه که خودش بیاد نصب و فعال کنه - مثل جوملا یا ورد پرس

خوب الان چطوری تو قالب نمایشش بدم ؟

مگه تو هر جا که میخوان نمایش بدم نباید چنین کدی باشه ؟

protected void Page_Load(object sender, EventArgs e){ UserControl module = (UserControl)LoadControl("UserControlPath.ascx"); myPlaceHolder.Controls.Add(module);}

اون وقت چطوری این کد خودکار بره تو قالب ؟

raziee
جمعه 18 آذر 1390, 22:54 عصر
با سلام
بحث این پست در کل یوزر کنترل نیست.
یه مثالی میرنم < سایت بلاگفا.
که تمام بخشها رو میشه دستکاری کرد.
بحث این پست farshadfal (http://barnamenevis.org/member.php?143456-farshadfal) به همین موضوع ربط داره

با سلام.
مثالی که زدید ارتباطی با موضوع این تاپیک نداره.
بلاگفا و دیگر سرویس دهنده های بلاگ امکاناتی دارند که شما میتونید بوسیله ی تگ ها این امکانات رو با ظاهر دلخوا به عنوان قالب نمایش بدید. من قبلا مطلبی (http://barnamenevis.org/showthread.php?192412-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AA%DA%AF-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-%D9%87%D8%A7%DB%8C-%D9%88%D8%A8%D9%84%D8%A7%DA%AF-%D8%AF%D9%87%DB%8C) رو در این باره نوشته بودم.
البته در برخی سیستم ها ، مثلا پورتال آریانیک هم بوسیله ی همین تگ/توکن ها به کاربر این امکان رو میدند تا ظاهر سایت رو دستکاری کنند و به حالت دلخواه در بیارند.

ممنون از جواب هاتون - من منظورم اون user contorol هایی که از قبل تو پروژه توسط برنامه نویس قرار داده شده نیست

مثلا الان بنده پرتال رو پابلیش و تموم کردم - تحویل مشتری دادم ، حالا 6 ماه بعد مشتری میاد میگه من میخوام اینجای سایت مثلا اوقات شرعی بزارین ، مسئله سر نصب کردن این user contorol هست وقتی پروژه پابلیش شده و من فقط به طرف user contorol رو بدم - جوری باشه که خودش بیاد نصب و فعال کنه - مثل جوملا یا ورد پرس

خوب من میخوام همین نصب کردنرو بدونم جاهای دیگه که خوندم فقط user contorol های از قبل تعیین شدرو میان استفاده میکنن من میخوام بدونم وقتی سایتو پابلیش میکنیم چجوری user contorol هایی که بعدا نصب میشن رو تو place holder اضاففه کنیم .
در پست اولم نوشتم :

حتی خیلی از این UserControl ها از ابتدا نوشته نشده اند و بعدا به پروژه اضافه (Install) میشند.
شما به صورت ساده باید نام ماژول و آدرس UserControl مربوطه رو نگهداری کنید (مثلا در دیتابیس).
ببینید به عنوان یک سیستم ماژولار DNN مثال بسیار خوبی هست و میتونید با بررسی اون خیلی چیز ها رو متوجه بشید.
شما برای Install کردن یک ماژول بعد از اینکه پروژه به اتمام رسده و UP هست اون UserControl و یا UserControl ها رو در یک قالب خاص(که خودتون تعریف میکنید، به عنوان مثال همه فایل ها رو در یک فایل ZIP کنید و اطلاعات UCها و دیگر فایل ها(تصاویر و...) رو هم در یک XML ذخیره کنید) بعد به مدیر سیستم فایل مربوطه رو بدید و بگید آپلود کنه.
شما باید یک Installer بنویسید که بعد از آپلود فایل مربوطه اون رو پردازش کنه (بر اساس همون ساختاری که خودتون تعریف کرده بودید) و فایل های مربوطه رو پوشه های خاص روی File System ذخیره کنه و اطلاعات مربوطه دیگه رو در دیتابیس ذخیره کنه.
برای حذف ماژول هم عکس این عمل اتفاق می افته. یعنی حذف اطلاعات از دیتابیس (یا هر چیزی که صلاح میدونید) و حذف فایل های مربوط به ماژول)

چون نام این ماژول و آدرسش رو در جایی نگه میدارید پس مدیر سیستم میتونه ماژولی که نصب شده رو ببینه و برای درج در صفحه انتخاب کنه.
به همین سادگی:چشمک:

sasansara
شنبه 19 آذر 1390, 08:04 صبح
شما چطور یه خبر رو نمایش میدی؟ مگه از قبل همه خبرها رو تو سیستم داشتی؟
توی هر صفحه باید usercontrol های مربوط به اون صفحه و مکان نمایش اونها تو صفحه رو از database بگیری و بعد ( مثلا توی یه حلقه ) تک تک به صفحه add کنی. دوستان هم که کد add کردن رو گذاشتن

FirstLine
شنبه 19 آذر 1390, 08:17 صبح
با سلام
دوست عزیز جناب raziee ، با تشکر از راهنمایی های کامل و مفید شما.
لطفا در مورد install کردن یوزر کنترل جدید هم توضیح بفرمایید،
آیا یوزر کنترل نیازی به کامپایل مجدد پروژه ندارد؟
قطعا یوزر کنترل جدید حاوی کدهای سمت سرور است و با دیتابیس هم کار میکند، ایا باید سه فایل اصلی یوزر کنترل را بصورت سورس آپلود کنیم یا مثلا یک جوری یه dll تهیه کنیم و آپلوود کنیم؟
با تشکر

raziee
شنبه 19 آذر 1390, 09:25 صبح
با سلام.

خوب الان چطوری تو قالب نمایشش بدم ؟

مگه تو هر جا که میخوان نمایش بدم نباید چنین کدی باشه ؟

protected void Page_Load(object sender, EventArgs e){ UserControl module = (UserControl)LoadControl("UserControlPath.ascx"); myPlaceHolder.Controls.Add(module);}

اون وقت چطوری این کد خودکار بره تو قالب ؟
ببینید شما ماژول ها رو در یک صفحه نمایش میدید درسته؟
اگه شما در هر صفحه فقط یک ماژول رو داشته باشید(یعنی صفحه مبتنی بر ماژول باشه) همون یک ماژول رو در یک شیء از قبل مشخص قرار میدید.
اما اگه این طور نباشه و در یک صفحه چند ماژول در چند قسمت مختلف قرار داده بشه نیاز هست که این اطلاعات هم در جایی(مثلا دیتابیس ذخیره بشه)
به عنوان مثال شما جداول زیر رو نیاز دارید
Pages : که اطلاعات مربوط به صفحه(Title,Description,Keywords,Skin,...) رو نگهداری میکنه.
Modules : که اطلاعات ماژول ها رو نگهداری میکنه.
PageModules : که اطلاعات مربوط به ماژول های در صفحه و محل قرار گیریشون رو نمایش میده.
به عنوان مثال سیستم دات نت نیوک چیزی به اسم Pane ایجاد کرده. این Pane مشخص نیست که چه کنترل سمت سروری هست (PlaceHolder,Panel,...).
ابتدا ماژول هایی که از جدول PageModules مربوط به Page جاری هستند دریافت شده و بر اساس PaneName که دارند باید به کنترل مربوطه(پیدا شده توسط ID مثلا RightPane) اضافه شوند.
دات نت نیوک سیستم جالب دیگه هم به اسم Container داره که به کار بر این اجازه رو میده که برای هر یک از این Module ها یک ظاهر(قالب)(که خودش هم یک UC) هست رو انتخاب کنه. یعنی ابتدا Module به Container سپس به Pane سپس به Skin و در انتها به Page اضافه میشه.
همونطور که قبلا گفتم بررسی جداول و سورس DNN میتونه کمک زیادی بهتون بکنه.

با سلام
دوست عزیز جناب raziee ، با تشکر از راهنمایی های کامل و مفید شما.
لطفا در مورد install کردن یوزر کنترل جدید هم توضیح بفرمایید،
آیا یوزر کنترل نیازی به کامپایل مجدد پروژه ندارد؟
قطعا یوزر کنترل جدید حاوی کدهای سمت سرور است و با دیتابیس هم کار میکند، ایا باید سه فایل اصلی یوزر کنترل را بصورت سورس آپلود کنیم یا مثلا یک جوری یه dll تهیه کنیم و آپلوود کنیم؟
با تشکر
نیازی به کامپایل مجدد پروژه نیست بلکه شما یک پروژه ی جدید باز میکنید به اسم ماژول فلان و بعد اون پروژه رو کامپایل میکنید.
در فایل Install اون ماژول هر چیزی که نیاز هست رو اضافه میکنید(UC ها , DLL ها , Resource ها ، تصاویر و همینطور فایل های متنی که برای ایجاد تغییرات در دیتابیس برای ساخت جداول و هر چیز مورد نیاز اون ماژول هست(در این رابطه این لینک (http://barnamenevis.org/showthread.php?267021-Upload-%D9%88-%D9%86%D8%B5%D8%A8-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-Asp.net-%D9%88-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-MSSQL-%D8%AF%D8%B1-Host-%28%D8%AF%D8%B1-%D8%AD%D8%A7%D9%84-%D8%AA%DA%A9%D9%85%DB%8C%D9%84%29&p=1189685&viewfull=1#post1189685) رو ببینید)).
خوب Installer ای که شما میتونیسید وظیفه ی انتقال فایل ها به مسیر مشخص هست و همینطور (در صورت نیاز) اجرای Script هابرای تغییرات دیتابیس.
فقط یادتون باشه که برای Uninstall کردن ماژول تمام کارهایی که انجام میشه باید به حالت اول بر گرده( حذف فایل ها ، برگرداندن تغییرات دیتابیس)

farshadfal
یک شنبه 20 آذر 1390, 16:59 عصر
سلام - ببخشید شما اطلاعی درباره نحوه کار این قسمت dnn دارین ؟

http://www.dotnetnuke.com/GuidedTour/ModulesMove.htm

raziee
یک شنبه 20 آذر 1390, 23:43 عصر
سلام - ببخشید شما اطلاعی درباره نحوه کار این قسمت dnn دارین ؟

http://www.dotnetnuke.com/GuidedTour/ModulesMove.htm

با سلام.
چیز خاصی نیست. قبلا بهش اشاره کردم.
یکسری المان به اسم Pane هستند که ماژول ها درش قرار میگیرند.
برای انتقال یک ماژول به یک Pane دیگه فقط کافیه تو جدول PageModules ای فبلا بهش اشاره کردم نام Pane رو تغییر بدید.

به عنوان مثال سیستم دات نت نیوک چیزی به اسم Pane ایجاد کرده. این Pane مشخص نیست که چه کنترل سمت سروری هست (PlaceHolder,Panel,...).
ابتدا ماژول هایی که از جدول PageModules مربوط به Page جاری هستند دریافت شده و بر اساس PaneName که دارند باید به کنترل مربوطه(پیدا شده توسط ID مثلا RightPane) اضافه شوند.
دات نت نیوک سیستم جالب دیگه هم به اسم Container داره که به کار بر این اجازه رو میده که برای هر یک از این Module ها یک ظاهر(قالب)(که خودش هم یک UC) هست رو انتخاب کنه. یعنی ابتدا Module به Container سپس به Pane سپس به Skin و در انتها به Page اضافه میشه.