PDA

View Full Version : مبتدی: سیستم تگ (برچسب) برای یک CMS پی اچ پی



farzad231
سه شنبه 24 تیر 1393, 14:18 عصر
سلام و عرض احترام

برای یک CMS که دارم می نویسمش، نیاز دارم بخش تگ (برچسب) بزارم .

بهترین و راحت ترین راهی که بشه برای مطالب این CMS بخش برچسب رو قرار داد چه راهی هست؟


خودم یک راه به نظرم رسید که یک فایل tag.php باشه که نام تگ رو بگیره ،
با htaccess تبدیل به url.com/tag/mytag بشه . تگ ها با explode یکی یکی جدا بشن برن توی آرایه و توی هر آرایه برای هر مطلب سرچ بشه
و در نهایت اگر داخل اون آرایه از مطلب بود، اون مطلب نمایش داده بشه !
ولی اینطوری حجم زیادی از کوئری باید انجام بشه، هرگز الگوریتم خوبی نیست.


چه پیشنهادی دارید؟ http://forum.wp-parsi.com/public/style_emoticons/default/smile.png

prans.info
سه شنبه 24 تیر 1393, 14:31 عصر
یه جدول جداگانه از جدول پست میسازی که سه تا فیلد داشته باشه (id/postid/tag) و هنگام ارسال مطلب برچسب ها رو میریزی تویه جدول تگ
با اچ تی اکسس یا با $_GET و... برچسب رو میگیری و تویه جدول تک سرچ می کنی و هرچی پیدا کردی رو postid اونا رو میگیری و بعد هم مطلب رو میگیری و نشون میدی

rash44
سه شنبه 24 تیر 1393, 17:39 عصر
در زمان ارسال مطلب ، تگ ها رو خود نوسنده باید وارد کنه یا اینکه سیستم از بین مطلب ، انتخاب کنه ؟

DR.HTML
سه شنبه 24 تیر 1393, 18:14 عصر
سیستم تگ گذاری کلا توسط انسانه حتی توی جوملا وردپرس و .. توسط نویسنده وارد میشه

حالا اومدن براش پلاگین نوشتن از توی مطلب در بیاره تگ هارو و اما در کل چیز جالبی در نمیاد

farzad231
سه شنبه 24 تیر 1393, 18:16 عصر
یه جدول جداگانه از جدول پست میسازی که سه تا فیلد داشته باشه (id/postid/tag) و هنگام ارسال مطلب برچسب ها رو میریزی تویه جدول تگ
با اچ تی اکسس یا با $_GET و... برچسب رو میگیری و تویه جدول تک سرچ می کنی و هرچی پیدا کردی رو postid اونا رو میگیری و بعد هم مطلب رو میگیری و نشون میدی

ممنون پرنس جان، دارم می نویسم اگر مشکلی خوردم ممنون میشم توضیح بدی :X


در زمان ارسال مطلب ، تگ ها رو خود نوسنده باید وارد کنه یا اینکه سیستم از بین مطلب ، انتخاب کنه ؟

بله تگ ها توسط نویسنده وارد میشن.

وردپرس رو اگر دیده باشید، عین همون میخوام. یک فیلد میخوام بزارم تگ ها رو با "," وارد کنه ، بعد تک به تک اونها بشن یک صفحه ، و اگر مطلبی با اون تگ شده بود ، مطلبش لیست بشه. همین.
البته امکان حذف تگ و ویرایش هم داشته باشه مطالبش .

farzad231
سه شنبه 24 تیر 1393, 18:17 عصر
سیستم تگ گذاری کلا توسط انسانه حتی توی جوملا وردپرس و .. توسط نویسنده وارد میشه

حالا اومدن براش پلاگین نوشتن از توی مطلب در بیاره تگ هارو و اما در کل چیز جالبی در نمیاد

متوجه نشدم :دی
ولی به هر حال با توجه به سیستمی که دارم آماده می کنم این بحش حیاطیه ...

prans.info
سه شنبه 24 تیر 1393, 19:06 عصر
در زمان ارسال مطلب ، تگ ها رو خود نوسنده باید وارد کنه یا اینکه سیستم از بین مطلب ، انتخاب کنه ؟
کار سختی نیست و به راحتی میشه انجام داد و حتی سیستم خوبی برای این بخش نوشت که کاملا هوشمندانه و دقیق برچسب بزنه ... (تویه نت فانکشن ها و کلاس های ساده ای در این مورد هست )

prans.info
سه شنبه 24 تیر 1393, 19:07 عصر
ممنون پرنس جان، دارم می نویسم اگر مشکلی خوردم ممنون میشم توضیح بدی :X



بله تگ ها توسط نویسنده وارد میشن.

وردپرس رو اگر دیده باشید، عین همون میخوام. یک فیلد میخوام بزارم تگ ها رو با "," وارد کنه ، بعد تک به تک اونها بشن یک صفحه ، و اگر مطلبی با اون تگ شده بود ، مطلبش لیست بشه. همین.
البته امکان حذف تگ و ویرایش هم داشته باشه مطالبش .
موردی نیست شما هر جایی به مشکل برخوردی من در خدمتم ...

farzad231
سه شنبه 24 تیر 1393, 20:18 عصر
کار سختی نیست و به راحتی میشه انجام داد و حتی سیستم خوبی برای این بخش نوشت که کاملا هوشمندانه و دقیق برچسب بزنه ... (تویه نت فانکشن ها و کلاس های ساده ای در این مورد هست )

در این مورد توضیح میدی عزیز ؟
مثلاً بر اساس تکرار کلمات کار کنه ؟ یا .... ؟
چه الگوریتمی برای خروج کلمات اصلی یک مطلب برای انتخاب به عنوان برچسب مد نظر شماست؟


ممنون از اینکه شرکت می کنی تو تاپیک :x

prans.info
سه شنبه 24 تیر 1393, 21:24 عصر
در این مورد توضیح میدی عزیز ؟
مثلاً بر اساس تکرار کلمات کار کنه ؟ یا .... ؟
چه الگوریتمی برای خروج کلمات اصلی یک مطلب برای انتخاب به عنوان برچسب مد نظر شماست؟


ممنون از اینکه شرکت می کنی تو تاپیک :x
دو سه روزه بعضی وقت ها به این مورد فکر می کنم (قراره تویه اسکریپتم اجرا کنم).
چیزی که به ذهنم رسیده و اکثرا هم تویه فانکشن های آماده دیدم اینه :
تویه مرحله اول یه سری فیلتر ها انجام میدیم مثلا چیز هایی مثل "که / برای / را" و... رو از متن حذف می کنیم .
تویه مرحله دوم کلمات رو تویه با explode تویه متغییر بصورت آرایه ذخیره می کنیم .
تویه مرحله سوم تکرار کلمات رو بررسی می کنیم (روش فکر نکردم با چه تابعی یا الگوریتمی :D).
(این مرحله میشه وجود نداشته باشه) تویه مرحله چهارم یه سری چیز ها رو به اول و آخر برچسب هایی که پیدا کردیم اضافه می کنیم که برای هر سایتی میتونه خاص باشه مثال :
برچسب ما اینه :
لینوکس
سایت ما یه سایت دانلود هست و قبلا اون کلمات که باید اضافه بشه رو معرفی کردیم به سیستم و برچسب هامون میشه :
لینوکس
دانلود لینوکس
دانلود لینوکس با لینک مستقیم
و...

farzadyazdan
سه شنبه 24 تیر 1393, 22:32 عصر
سلام دوستان
من خودم در یکی از پروژه هام به این صورت کار کردم:
1- در جدول post یک فیلد به نام tags ایجاد کردم
2- کاربر در هنگام ورود اطلاعات برچسب های خودش را با یک علامت جدا کننده مثل "|" از هم جدا میکنه
3- برای نمایش و جداسازی از روش زیر استفاده کردم:



protected function get_tags($contentTags)
{
$tags = explode('|', $contentTags);
$tags = array_map('trim', $tags);
foreach ($tags as $tag)
{
$keywords[] = ['tag' => $tag, 'url' => str_replace(' ', '+', $tag)];
}
return $keywords;
}

تشریح کد:

تگ هایی که در فیل tags در جدول post ذخیره شده رو به عنوان ورودی وارد می کنیم
در مرحله بعد به کمک تابع explode وعلامت های جدا کننده برچسب ها رو در یک آرایه قرار میدیم
از اونجایی که بین کلمات ممکنه فضاهای خالی (space) وجود داشته باشه با استفاده از array_map و trim این فاصله هارو از بین میبریم
در مرحله بعد هم یک آرایه جدید با دو تا ایندکس با نام های tag و url ایجاد شده که برای نشان دادن برچسب و url استفاده میشه. حالا سوال اینجاست که این آرایه دوم به چه درد میخوره در مرحله قبل اگر یادتون باشه ما فضا های خالی ابتدا و انتهای برچسب ها رو حدف کردیم در این مرحله ما فضاهای خالی رو با علامت + پر کردیم تا در هنگام نمایش url مشکلی پیش نیاد به این مثال توجه کنید:

برچسب: طراحی سایت | توسعه وب

اگه دقت کنید میبینید که برچسب ها از دو کلمه تشکیل شده اگر از متد بالا استفاده کنیم
خروجی به این شکل خواهد بود:


$keywords = [
0 => ['url' => 'طراحی+سایت', 'tag' => 'طراحی سایت'],
1 => ['url' => 'توسعه+وب', 'tag' => 'توسعه وب']
]

حالا برای نمایش از این کد استفاده میکنم:


foreach($tags as $tag)
{
<li> <a href="search.php?".$tag['url']>$tag['tag']</a> </li>
}

سوالی داشتین بپرسین
موفق باشید

farzad231
جمعه 03 مرداد 1393, 19:33 عصر
ممنون دوستان متد کار رو گرفتم

فرض کنید من از یک جدول جدا استفاده کنم یا اصلاً یک فیلد برای تگ های هر مطلب در همون جدول پست ها در نظر بگیرم .

حالا مشکل اینجاست که
1- وقتی نام یک برچسب ، درخواست میشه ، باید تمامی مطالبی که اون برچسب رو خوردن به نمایش دربیان.
2- وقتی که یک مطلب بخواد برچسب هاش ویرایش بشه. یعنی کم یا زیاد بشه.

این دو مورد رو یه کم توضیح میدید چطور اجرا کنیم ؟


خیلی ممنون از همیاری تون .

arash691
جمعه 03 مرداد 1393, 22:39 عصر
سلام دوستان
من خودم در یکی از پروژه هام به این صورت کار کردم:
1- در جدول post یک فیلد به نام tags ایجاد کردم
2- کاربر در هنگام ورود اطلاعات برچسب های خودش را با یک علامت جدا کننده مثل "|" از هم جدا میکنه
3- برای نمایش و جداسازی از روش زیر استفاده کردم:



protected function get_tags($contentTags)
{
$tags = explode('|', $contentTags);
$tags = array_map('trim', $tags);
foreach ($tags as $tag)
{
$keywords[] = ['tag' => $tag, 'url' => str_replace(' ', '+', $tag)];
}
return $keywords;
}

تشریح کد:

تگ هایی که در فیل tags در جدول post ذخیره شده رو به عنوان ورودی وارد می کنیم
در مرحله بعد به کمک تابع explode وعلامت های جدا کننده برچسب ها رو در یک آرایه قرار میدیم
از اونجایی که بین کلمات ممکنه فضاهای خالی (space) وجود داشته باشه با استفاده از array_map و trim این فاصله هارو از بین میبریم
در مرحله بعد هم یک آرایه جدید با دو تا ایندکس با نام های tag و url ایجاد شده که برای نشان دادن برچسب و url استفاده میشه. حالا سوال اینجاست که این آرایه دوم به چه درد میخوره در مرحله قبل اگر یادتون باشه ما فضا های خالی ابتدا و انتهای برچسب ها رو حدف کردیم در این مرحله ما فضاهای خالی رو با علامت + پر کردیم تا در هنگام نمایش url مشکلی پیش نیاد به این مثال توجه کنید:

برچسب: طراحی سایت | توسعه وب

اگه دقت کنید میبینید که برچسب ها از دو کلمه تشکیل شده اگر از متد بالا استفاده کنیم
خروجی به این شکل خواهد بود:


$keywords = [
0 => ['url' => 'طراحی+سایت', 'tag' => 'طراحی سایت'],
1 => ['url' => 'توسعه+وب', 'tag' => 'توسعه وب']
]

حالا برای نمایش از این کد استفاده میکنم:


foreach($tags as $tag)
{
<li> <a href="search.php?".$tag['url']>$tag['tag']</a> </li>
}

سوالی داشتین بپرسین
موفق باشید

روش خوبی هستش منم استفاده کرده بودم فقط یه مشکلی که داره اینه که اگر بخوایم به تگ ها لینک بدیم که اگه کاربر روی اون کلیک کرد همه ی پست هایی که اون تگ رو دارن نشون داده بشه نمیتونه بدرستی عمل بکنه خودم از like تو sql استفاده کردم ولی مشکل سر کلماتی هست مثل c , c++ و یا c# که چون همشون c داره جزء خروجی بحساب میاد ... :متفکر: