PDA

View Full Version : سوال: ایجاد SitePath به صورت Dynamic



z_bluestar
دوشنبه 24 خرداد 1389, 14:37 عصر
سلام ، من برای یک Eshop می خوام Sitepath مثل همین سایت داشته باشم .
که وقتی مثلا شمـا در حال دیدن یک محصول هستید بتونید بفهمین این محصول در کدام گروه قرار گرفته و این گروه خود شامل کدام زیر گروه هست و الی آخر
و با کلیک بر روی هر Node بتونه صفحه مورد نظر رو ببینه .

می خواستم بدونم از چه روشی یا کنترلی برای این کـار میشه استفاده کرد

profnami
دوشنبه 24 خرداد 1389, 15:29 عصر
ببینید تو این مقاله آقای علی دلشاد از XML برای طراحی منوی سایت استفاده کرده . شما میتونید یه جدول ایجاد کنید برای کاربران و یک کلید خارجی هم بزارید برای ارتباط بین این دو جدول . و برای هر کاربر منوی خودش رو استخراج کنید :
http://www.how2learnasp.net/article.aspx?code=6e262527-5042-41d7-aba6-fddda0700020

ایمان اختیاری
دوشنبه 24 خرداد 1389, 15:30 عصر
راستش من توی یه سایت دیدم که از tree view استفاده کرده بود و خیلی زیبا و شکیل .. نمی دونم اون به کارتون می یاد یا نه ولی به نظر من جالب بود و کاربر راحت می تونست بفهمه که الان کجای سایته

z_bluestar
دوشنبه 24 خرداد 1389, 15:36 عصر
برای هر کاربر منوی خودش رو استخراج کنید
ولی من می خوام به صورت داینامیک این ساخته بشه .و ذخیره کردنش بی معنیه .
میشه از طریق DataBase اینو استخراج کرد که این محصول یا گروه Sub Category چه گروه یا گروه های دیگری هستند ولی با چه کنترلی نمایش داده بشن
با بهترین روش برای انجام این کار چیه ؟؟

mehdi.mousavi
دوشنبه 24 خرداد 1389, 15:40 عصر
سلام ، من برای یک Eshop می خوام Sitepath مثل همین سایت داشته باشم . که وقتی مثلا شمـا در حال دیدن یک محصول هستید بتونید بفهمین این محصول در کدام گروه قرار گرفته و این گروه خود شامل کدام زیر گروه هست و الی آخر و با کلیک بر روی هر Node بتونه صفحه مورد نظر رو ببینه . می خواستم بدونم از چه روشی یا کنترلی برای این کـار میشه استفاده کرد

سلام.
اسم این SitePath نیستش، بهش میگن breadcrumb navigation و خوشبختانه در ASP.NET ابزار لازم برای ایجاد چنین قابلیتی از قبل در سیستم در نظر گرفته شده. برای اطلاعات بیشتر لطفا به این سایت رجوع کنید (http://geekswithblogs.net/AzamSharp/archive/2006/08/16/88197.aspx).

موفق باشید.

z_bluestar
دوشنبه 24 خرداد 1389, 15:53 عصر
اسم این SitePath نیستش، بهش میگن breadcrumb navigation و خوشبختانه در ASP.NET ابزار لازم برای ایجاد چنین قابلیتی از قبل در سیستم در نظر گرفته شده

ممنون از پاسختون من الان چنین چیزی در سایت دارم ولی من تعداد زیادی محصول و گروه محصولات دارم اون هم به صورت tree یعنی به صورت parent و child دارم و همه محصولات گروه ها هم در یک صفحه نشون داده میشه و با QueryString مشخص میشه که کدوم category رو باید نشون بده .

ولی با Site Map فقط من اینو می تونم داشته باشم
<siteMapNode url="~/ProductCatalog.aspx" title="Category Product Catalog" >
ولی من می خوام متناسب با هر query string این عوض بشه و مشخص باشه این محصولات برای چه گروه هی هستند و اون گروه خود زیر گروه کدام گروه دیگر است . الی آخر تا home page

و من برای هر محصول یا گروه هم که نمی تونم یه Node به sitemap اضافه کنم :اشتباه:

z_bluestar
دوشنبه 24 خرداد 1389, 16:15 عصر
من یه چیزی مثل این می خوام اگه دقت کنید به navigation این سایت برای این محصول مورد نظر نشون میده که sub category چه گروه هی هست .
http://barnamenevis.org/forum/attachment.php?attachmentid=51169&stc=1&d=1276517178
اصلا یه چیزی مثل navigation همین سایت برنامه نویس که نشون میده کدوم تاپیک و از کدوم تالار هستید

mehdi.mousavi
دوشنبه 24 خرداد 1389, 16:47 عصر
سلام.
یادمه چیزی شبیه اینو من قبلا پاسخ داده بودم... ببینید. برای اینکار باید یه Custom SiteMap Provider خودتون بنویسید. لطفا این مقاله رو مطالعه کنید (http://harriyott.com/2007/03/adding-dynamic-nodes-to-aspnet-site.aspx) تا با روش اینکار آشنا بشید.

اینجا هم میتونید با مفاهیم اولیه (http://msdn.microsoft.com/en-us/library/ms178431.aspx) این کار آشنا بشید.

موفق باشید.

اوبالیت به بو
دوشنبه 24 خرداد 1389, 17:33 عصر
سلام

یه همچین چیزی رو ما تو نرم افزار های حسابداری داریم. بهش می گن تفضیل. بعد سازنده نرم افزار می گه که سیستم من تا 3 سطح حسابداری رو جواب می ده.


سطح یک
سطح دو
سطح سه

من در همین 5 دقیقه 2 راه بیشتر به ذهنم نرسید که می گم و انتخاب با شما.
روش اول
شما بیاید تعداد صفحات رو محدود کنید. یعنی بگید که سایت تا 3 سطح بیشتر نیست. مثلا این سایت رو در نظر بگیرید.
از یک root شروع شده. بعد اومده برنامه نویسی با محصولات مایکروسافت (http://barnamenevis.org/forum/forumdisplay.php?f=5). این خودش یک Page هست که هم پدر هست و هم فرزند. بعد برنامه نویسی مبتنی بر Microsoft .Net Framework (http://barnamenevis.org/forum/forumdisplay.php?f=81) و بعد برنامه نویسی Web با استفاده از ASP.NET (http://barnamenevis.org/forum/forumdisplay.php?f=25) و بعد تایپیک شما و در انتها این پست بنده
اگر از بعد root بشماریم میشه 5 سطح
شما بیا این کار رو انجام بده. برای هر سطح یک جدول بساز. و نام گذاری رو هم به این صورت قرار بده:


جدول پدر سطح1 مثل برنامه نویسی با محصولات مایکروسافت (http://barnamenevis.org/forum/forumdisplay.php?f=5) یا مثل فناوری جاوا (http://www.barnamenevis.org/forum/forumdisplay.php?f=83) و یا زبان های اسکریپتی (http://www.barnamenevis.org/forum/forumdisplay.php?f=109)

این جدول یک ID داره و یک Title اسمش رو هم من می ذارم Parent1


جدول پدر سطح 2 مثل برنامه نویسی مبتنی بر Microsoft .Net Framework (http://www.barnamenevis.org/forum/forumdisplay.php?f=81) یا مثل برنامه‌نویسی جاوا (http://www.barnamenevis.org/forum/forumdisplay.php?f=38) و یا مثل JavaScript و Framework های مبتنی بر آن (http://www.barnamenevis.org/forum/forumdisplay.php?f=160)

این جدول یک ID داره یک Titleداره و یک Parent1_ID ( به نحوه نام گذاری ها دقت کنید. Parent1_ID یعنی جدول Parent1 فیلد ID) و اسم این جدول Parent2 خواهد بود
خوب با این کار سطح 2 به سطح 1 لینک شد.


جدول پدر سطح 3 مثل برنامه نویسی در C#‎، (http://www.barnamenevis.org/forum/forumdisplay.php?f=26)برنامه نویسی Web با استفاده از ASP.NET و یا مثل (http://www.barnamenevis.org/forum/forumdisplay.php?f=25)Java ME : نگارش موبایل جاوا و یا مثل (http://www.barnamenevis.org/forum/forumdisplay.php?f=86)jQuery (http://www.barnamenevis.org/forum/forumdisplay.php?f=161)

این جدول یک ID داره یک Title و یک فیلد به نام Parent2_ID و با نام Parent3



حال یک جدول خواهیم داشت با نام Topic که تایپیک ها رو ذخیره می کنه که شامل ID ، Title و Parent3_ID خواهد بود
یک جدول به نام Content یا Posts که این جدول شامل همون فیلدهای معمول مثل ID، Title، Body، Date و در نهایت Topic_ID خواهد بود

البته این ساختار نمی دونم به خوبی نرمال سازی شده یا نه اما این راه فعلا از طریق نگاه کردن به ساختار سایت برنامه نویس به ذهنم رسید. عیبی که این ساختار داره این هست که سطوح محدود هستند و برای اینکه یک سطح (مثلا بین سطح 1 و سطح2) بخواد اضافه بشه دردسر زیادی خواهد داشت.

همچنین سنگینی رکورد ها در جداول به ترتیب از سطح 1 تا آخر از کم به زیاد هست. یعنی جدول پدر سطح 1 ممکن هست 1 رکورد رو داشته باشه و جدول تایپیک هزار رکورد. جدول پست بستگی به حدول تایپیک داره.
مثلا یکی از عیب های دیگه همین هست که گفتم. جدولی که 1 رکورد یا 3 رکورد (مثل سطح1 داره) به نوعی حافظه هرز محسوب میشه.
روش دوم
یک روشی هست که شما همه این کار ها رو در غالب 2 جدول Parent و Child انجام بدی. این ساختار احتیاج به یک tuning قوی داره و فکر نکنم کار من باشه. مثلا بیای همه فرزند هات رو در تمام سطوح با یک مکانیزم آدرس دهی به هم Link کنی. خودم ندیدم اما می دونم که میشه

z_bluestar
دوشنبه 24 خرداد 1389, 21:07 عصر
سلام.
یادمه چیزی شبیه اینو من قبلا پاسخ داده بودم... ببینید. برای اینکار باید یه Custom SiteMap Provider خودتون بنویسید. لطفا این مقاله رو مطالعه کنید (http://harriyott.com/2007/03/adding-dynamic-nodes-to-aspnet-site.aspx) تا با روش اینکار آشنا بشید.

اینجا هم میتونید با مفاهیم اولیه (http://msdn.microsoft.com/en-us/library/ms178431.aspx) این کار آشنا بشید.

موفق باشید.

من قبلا این روش رو بررسی کردم در کمترین سطح من 500-600 گروه محصول و 8-9 هزار تا کالا دارم چون سایت تو زمینه ساختمان کار میکنه و با این وجود زیاد منطقی نیست که من این همه Node رو به site map اضـافه کنم

z_bluestar
دوشنبه 24 خرداد 1389, 21:12 عصر
سلام
روش اول
شما بیاید تعداد صفحات رو محدود کنید. یعنی بگید که سایت تا 3 سطح بیشتر نیست. مثلا این سایت رو در نظر بگیرید.


من نمیتوم سایت رو به داشتن N سطح Category محدود کنم من تمام Category هام در یک جدول هستند و با فیلد parent به صورت Hierarchical به هم وصلند .
من میتونم با یک query این چند Level رو به دست بیارم ولی می خواستم بدونم چه شکلی و با چه کنترلی میشه نمایش داد ؟؟؟

اوبالیت به بو
دوشنبه 24 خرداد 1389, 22:15 عصر
من میتونم با یک query این چند Level رو به دست بیارم ولی می خواستم بدونم چه شکلی و با چه کنترلی میشه نمایش داد ؟؟؟
سلام
میشه یاد بدید؟

hamedsabzian
دوشنبه 24 خرداد 1389, 22:26 عصر
من میتونم با یک query این چند Level رو به دست بیارم
شما که این کار رو می تونید انجام بدید( البته لطف کنید و بگید چطوری؟ (یه روش تو ذهنم هست میخوام ببینم حرفه ای ها چه کار می کنن) )، خوب یه Repeare بزارید کنار SiteMape و اطلاعات رو بر اساس QueryString نمایش بدید.

Mostafa_Dindar
دوشنبه 24 خرداد 1389, 22:40 عصر
ممنون از پاسختون من الان چنین چیزی در سایت دارم ولی من تعداد زیادی محصول و گروه محصولات دارم اون هم به صورت tree یعنی به صورت parent و child دارم و همه محصولات گروه ها هم در یک صفحه نشون داده میشه و با QueryString مشخص میشه که کدوم category رو باید نشون بده .

ولی با Site Map فقط من اینو می تونم داشته باشم
<siteMapNode url="~/ProductCatalog.aspx" title="Category Product Catalog" >
ولی من می خوام متناسب با هر query string این عوض بشه و مشخص باشه این محصولات برای چه گروه هی هستند و اون گروه خود زیر گروه کدام گروه دیگر است . الی آخر تا home page

و من برای هر محصول یا گروه هم که نمی تونم یه Node به sitemap اضافه کنم :اشتباه:


سلام.
یادمه چیزی شبیه اینو من قبلا پاسخ داده بودم... ببینید. برای اینکار باید یه Custom SiteMap Provider خودتون بنویسید. لطفا این مقاله رو مطالعه کنید (http://harriyott.com/2007/03/adding-dynamic-nodes-to-aspnet-site.aspx) تا با روش اینکار آشنا بشید.

اینجا هم میتونید با مفاهیم اولیه (http://msdn.microsoft.com/en-us/library/ms178431.aspx) این کار آشنا بشید.

موفق باشید.


سلام ،

تصور ميكنم منظور آقاي موسوي ، پاسخ به سوال من درتاپيك تعريف نود متغير در Web.SiteMap (http://barnamenevis.org/forum/showthread.php?t=213067) بود .

سربلند باشيد

z_bluestar
دوشنبه 24 خرداد 1389, 23:16 عصر
شما که این کار رو می تونید انجام بدید( البته لطف کنید و بگید چطوری؟ (یه روش تو ذهنم هست میخوام ببینم حرفه ای ها چه کار می کنن) )، خوب یه Repeare بزارید کنار SiteMape و اطلاعات رو بر اساس QueryString نمایش بدید.


فکر کنم آخرش باید همین کـار رو انجام بدم

Alireza_Salehi
سه شنبه 25 خرداد 1389, 00:13 صبح
اگر از sitemap استفاده کنید مزیتش استفاده از امکانات خود ASP.NET هست.
ولی به راحتی می توانید با نمایش هر محصول یا هر دسته گره های ریشه آن را تا رسیدن به روت دنبال کنید و مسیر مورد نظر را دینامیک بسازید. کنترل خاصی هم نمی خواد به راحتی با یک div و افزودن a به آن قضیه حل می شود. (شبیه این (http://www.novindiet.com/Clinic.aspx?culture=fa-IR&clinic=51))

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

z_bluestar
سه شنبه 25 خرداد 1389, 10:12 صبح
اگر از sitemap استفاده کنید مزیتش استفاده از امکانات خود ASP.NET هست.
ولی به راحتی می توانید با نمایش هر محصول یا هر دسته گره های ریشه آن را تا رسیدن به روت دنبال کنید و مسیر مورد نظر را دینامیک بسازید. کنترل خاصی هم نمی خواد به راحتی با یک div و افزودن a به آن قضیه حل می شود. (شبیه این (http://www.novindiet.com/Clinic.aspx?culture=fa-IR&clinic=51))

خوب شمـا حجم یه Eshop خیلی بزرگ رو با این سایت CMS یکی می کنید من حجم محصولات و گروه ها م خیلی زیاده

Alireza_Salehi
سه شنبه 25 خرداد 1389, 10:36 صبح
خوب شمـا حجم یه Eshop خیلی بزرگ رو با این سایت CMS یکی می کنید من حجم محصولات و گروه ها م خیلی زیاده
sitemap که میگید نه، این روش هم میگید نه، نگفتم دقیقا مثل اون بلکه منظورم این بود که به کنترل خاصی نیاز نیست دینامیک میشه سلسله مراتب رو نشان داد حالا هر چه قدر بزرگ و زیاد باشد، سربار زیادی هم نداره.

mehdi.mousavi
سه شنبه 25 خرداد 1389, 11:01 صبح
سلام.
شما دقیقا مشکلتون چی هستش؟ فرض میکنیم 3 میلیون رکورد در بانک وجود داره. در آن واحد کاربر میتونه یک محصول رو ببینه و هر محصول 10 Level ممکنه بیاد تو. به این ترتیب، با یه Recursive CTE ساده (بشرطیکه بانک درست طراحی شده باشه)، میشه ظرف چند لحظه Breadcrumb مزبور رو استخراج کرد و نمایش داد. اینجا هر روشی مطرح شدش، شما میگید نه. بنظر میرسه محدودیتهایی برای خودتون ایجاد کرده اید که به هر Solution (مناسب و غیر مناسب) ای نه میگید.

اگر این اطلاعات در حال حاضر در Query String وجود داره، پس اصلا دیگه نیازی نیست حتی به بانک رجوع کنید و با چند خط JavaScript میشه DOM Document رو تغییر داد و Breadcrumb مزبور رو نشون داد. اما گمان نمیکنم همه این اطلاعات در URL وجود داشته باشه. بطور مثال، شما برای هر دسته، باید Label و ID اون دسته رو (حداقل) داشته باشید تا بتونید Navigation Bar مزبور رو ایجاد کنید. که اگر چنین اطلاعات فربهی رو در URL داشته باشید، باید دوباره در Design برنامه تجدید نظر کنید.

همونطور که گفتم، شما میتونید با نوشتن یه Custom SiteMap Provider به هدفتون برسید بدون اینکه سرباری روی سیستم داشته باشه. قرار نیست با هر Hit ای که هر صفحه ای میخوره، شما SiteMap رو به روز کنید. کافیه یکبار بسازید، Cache اش کنید، و از اون پس از Cache مربوطه برای ارائه اطلاعات SiteMap استفاده کنید.

باز هم اگر شرایط اجرایی و محدودیتهایی رو که دارید بفرمایید، بهتر میشه راهنمایی کرد و الا اینکه هر کسی یه روشی بده، و شما هم با آوردن یه نه و یه عبارت چند کلمه ای اون روش رو رد کنید، کار شایسته ای نیست و فقط زمان دوستان گرفته میشه.

موفق باشید.

z_bluestar
چهارشنبه 26 خرداد 1389, 11:46 صبح
با توجه به راهنمایی دوستان میشه برای حل این کـار 2 راه وجود داره .
یک راه استفاده از StaticSiteMapProvider هست که اگه از این راه استفاده کنم , مجبورم خودم تمام Category ها رو بخونم و Level به Level اضافه کنم .
که کد کلاسش رو براتون در ادامه میذارم

ولی یک راه دیگه که یکی از دوستان معرفی کردن الگوریتمی است به نام Row Range برای بدست آوردن row های parent در Sql Server که به وسیله اون میشه Url ها رو بدست آورد و مشغول کـار بر روی اون هستم و در صورت اتمام اون رو هم اینجـا قرار میدم .

اگه بشه این راه رو با هم استفاده کرد فکر کنم بهترین باشه :متفکر:
یعنی فقط زمان دیدن صفحات محصولات یا گروه محصولات متناسب با QueryString اون صفحه بره URL های Parent هاشو از DataBase بیاره و به sitemap اضافه کنه ؟؟

کلاس StaticSiteMapProvider:


namespace abcconstruct.Classes
{
public class MySitemapProvider : StaticSiteMapProvider
{
static readonly string _errmsg1 = "Duplicate node ID";
SiteMapNode _root = null;
public override SiteMapNode BuildSiteMap()
{

if (_root != null)
return _root;
Dictionary<Guid, SiteMapNode> nodes = new Dictionary<Guid, SiteMapNode>();

Guid id = Guid.NewGuid();
string[] roles = new string[] { "*" };

_root = new SiteMapNode(this, id.ToString(), "~/Default.aspx", "Home", "ABC Construct Home Page");
_root.Roles = roles;

if (nodes.ContainsKey(id))
throw new ConfigurationErrorsException(_errmsg1);

nodes.Add(id, _root);
AddNode(_root, null);

Guid ContentPages = Guid.NewGuid();
SiteMapNode Page = CreateNode(_root, nodes, ContentPages, "Content Page", "General information about our company", "", roles);
GetPageNames(Page, nodes, roles);

CreateNode(_root, nodes, Guid.NewGuid(), "News", "Company news", "~/News.aspx", roles);
CreateNode(_root, nodes, Guid.NewGuid(), "Contact Us", "Our contact information", "~/FAQ.aspx", roles);

return _root;
}
private void GetPageNames(SiteMapNode parent, Dictionary<Guid, SiteMapNode> nodes, string[] roles)
{
DataSet ds = DataLayer.Contents.SelectAll(2);
foreach (DataRow Row in ds.Tables["Contents"].Rows)
{
CreateNode(parent, nodes, Guid.NewGuid(), Row["ContentsTitle"].ToString(), Row["ContentsTitle"].ToString(), "~/ShowContents.aspx?ID=" + Row["ID"].ToString(), roles);
}
ds.Dispose();
}
private SiteMapNode CreateNode(SiteMapNode parent, Dictionary<Guid, SiteMapNode> nodes, Guid id, string title, string desc, string url, string[] roles)
{
SiteMapNode node = new SiteMapNode(this, id.ToString(), url, title, desc);
node.Roles = roles;
if (nodes.ContainsKey(id))
throw new ConfigurationErrorsException(_errmsg1);
nodes.Add(id, node);
AddNode(node, parent);
return node;
}
protected override SiteMapNode GetRootNodeCore()
{
BuildSiteMap();
return _root;
}

}
}


و کدی که باید به Web.Config اضافه بشه .

<system.web>
<siteMap defaultProvider="MySiteMapProvider" enabled="true">
<providers>
<clear />
<add name="MySiteMapProvider" type="abcconstruct.Classes.MySitemapProvider" securityTrimmingEnabled="true" />
</providers>
</siteMap>