MMSHFE
یک شنبه 23 بهمن 1390, 10:03 صبح
چند روز قبل یکی از دوستان (http://barnamenevis.org/member.php?129163-mahmod2000) توی این تاپیک (http://barnamenevis.org/showthread.php?327243-%D8%A7%DB%8C%D9%86-%DA%A9%D8%AF-%DA%86%D8%B1%D8%A7-%D9%88%D8%A7%D8%B3%D9%87-%D8%B3%D8%A7%DB%8C%D8%AA-%D8%AF%DB%8C%DA%AF%D9%87-%DA%A9%D8%A7%D8%B1-%D9%86%D9%85%DB%8C%DA%A9%D9%86%D9%87%D8%9F&p=1439164) کدی رو به نقل از سایت w3schools گذاشتن که برای خوندن RSS سایتها بکار میرفت ولی با برخی از سایتها مشکل داشت. وقتی دقیقتر بررسیش کردم، دیدم نه تنها با سایتهای ایرانی یکسری مشکلات داره (بیشتر بخاطر ساختار غیراستاندارد RSS این سایتها) بلکه با فیدهای ATOM هم مشکل داره و نمیتونه آدرس سایت رو به درستی از داخل اون سایتها استخراج کنه. برای همین کمی اون کد رو تغییر دادم و نهایتاً کدی شد که ضمیمه کردم. مزایای این اسکریپت:
1- استفاده از jQuery و AJAX
2- امکان تعیین تعداد اخبار برای نمایش
3- امکان ذخیره آدرس فیدها در دیتابیس
4- سازگاری مناسب با فیدهای سایتهای مختلف
5- وجود این آموزش درخصوص نحوه کار اسکریپت :چشمک:
-----
توضیح کدها:
فایل config.php که مربوط به تنظیمات هست و کار خاصی انجام نمیده، فقط یادتون باشه حتماً اون رو ویرایش کنید و نام کاربری و رمز عبور و... رو متناسب با تنظیمات سرور خودتون اصلاح کنید.
فایل index.php هم که یک فرم ساده است برای دریافت اطلاعات از کاربر (اخبار چه سایتی رو میخواد و چندتا خبر باید نشون داده بشه). فقط به روش استفاده از AJAX توسط jQuery توی اسکریپت دقت کنید.
و اما فایل getrss.php که اصل کاری هست:
توی این فایل ابتدا عنوان فید و تعداد عناصر از ورودی با روش Get دریافت میشه و آدرس اون فید از دیتابیس استخراج شده و توی متغیر xml$ ذخیره میشه.
بعد، یک شئ از کلاس DOMDocument ایجاد میشه. این کلاس برای پردازش اسناد با قالب HTML و XML و... (کلاً هرچی آخرش ML داره!) بکار میره و میتونیم با استفاده از توابع اون، عناصر رو برحسب تگ مربوطه استخراج کنیم و یکسری کارهای دیگه که اگه خیلی بهش علاقه دارین، میتونید از اینجا (http://ir.php.net/manual/en/class.domdocument.php) توضیحاتش رو بخونید).
خوب ابتدا با استفاده از تابع getElementsByTagName عنصر channel استخراج میشه. دقت کنید که خروجی این تابع، مجموعه ای از عناصر هست که برای استخراج هرکدوم، باید تابع item رو صدا بزنیم و شماره ترتیب عنصر رو به این تابع بدیم. مثلاً برای استخراج اولین عنصر با تگ channel باید (item(0 رو صدا بزنیم.
در ادامه، عنوان و لینک و توضیحات سایت توسط تگهای مربوطه از داخل عنصر channel مربوطه استخراج میشه. از اونجا که در فیدهای ATOM یک تگ atom اضافه داریم و این تگ از نوع تگهای تک هست، با (item(0 نمیتونیم لینک رو استخراج کنیم و از (item(1 استفاده میکنیم چون اولین عنصر به تگ atom داره اشاره میکنه نه به تگ لینک!
از اینجا به بعد، عناصر item توسط همون تابع قبلی، توی متغیر x$ قرار میگیرن. ابتدا با خاصیت length تعدادش رو بدست میاریم. بعد چک میکنیم ببینیم تعدادی که کاربر میخواسته، یک عدد بزرگتر از صفر و کوچکتر از این تعداد هست یا نه. اگه بود، تعداد رو همون عدد درنظر میگیریم وگرنه، تعداد میشه کل اخباری که فید مربوطه نشون میده.
حالا با یک حلقه for، یکی یکی عناصر title و link و description رو از داخل عنصر item مربوطه استخراج کرده و نشون میدیم. به همین راحتی!
اگه سؤالی بود یا جایی از کد نیاز به توضیح بیشتر داشت، در خدمتم.
موفق باشید.
1- استفاده از jQuery و AJAX
2- امکان تعیین تعداد اخبار برای نمایش
3- امکان ذخیره آدرس فیدها در دیتابیس
4- سازگاری مناسب با فیدهای سایتهای مختلف
5- وجود این آموزش درخصوص نحوه کار اسکریپت :چشمک:
-----
توضیح کدها:
فایل config.php که مربوط به تنظیمات هست و کار خاصی انجام نمیده، فقط یادتون باشه حتماً اون رو ویرایش کنید و نام کاربری و رمز عبور و... رو متناسب با تنظیمات سرور خودتون اصلاح کنید.
فایل index.php هم که یک فرم ساده است برای دریافت اطلاعات از کاربر (اخبار چه سایتی رو میخواد و چندتا خبر باید نشون داده بشه). فقط به روش استفاده از AJAX توسط jQuery توی اسکریپت دقت کنید.
و اما فایل getrss.php که اصل کاری هست:
توی این فایل ابتدا عنوان فید و تعداد عناصر از ورودی با روش Get دریافت میشه و آدرس اون فید از دیتابیس استخراج شده و توی متغیر xml$ ذخیره میشه.
بعد، یک شئ از کلاس DOMDocument ایجاد میشه. این کلاس برای پردازش اسناد با قالب HTML و XML و... (کلاً هرچی آخرش ML داره!) بکار میره و میتونیم با استفاده از توابع اون، عناصر رو برحسب تگ مربوطه استخراج کنیم و یکسری کارهای دیگه که اگه خیلی بهش علاقه دارین، میتونید از اینجا (http://ir.php.net/manual/en/class.domdocument.php) توضیحاتش رو بخونید).
خوب ابتدا با استفاده از تابع getElementsByTagName عنصر channel استخراج میشه. دقت کنید که خروجی این تابع، مجموعه ای از عناصر هست که برای استخراج هرکدوم، باید تابع item رو صدا بزنیم و شماره ترتیب عنصر رو به این تابع بدیم. مثلاً برای استخراج اولین عنصر با تگ channel باید (item(0 رو صدا بزنیم.
در ادامه، عنوان و لینک و توضیحات سایت توسط تگهای مربوطه از داخل عنصر channel مربوطه استخراج میشه. از اونجا که در فیدهای ATOM یک تگ atom اضافه داریم و این تگ از نوع تگهای تک هست، با (item(0 نمیتونیم لینک رو استخراج کنیم و از (item(1 استفاده میکنیم چون اولین عنصر به تگ atom داره اشاره میکنه نه به تگ لینک!
از اینجا به بعد، عناصر item توسط همون تابع قبلی، توی متغیر x$ قرار میگیرن. ابتدا با خاصیت length تعدادش رو بدست میاریم. بعد چک میکنیم ببینیم تعدادی که کاربر میخواسته، یک عدد بزرگتر از صفر و کوچکتر از این تعداد هست یا نه. اگه بود، تعداد رو همون عدد درنظر میگیریم وگرنه، تعداد میشه کل اخباری که فید مربوطه نشون میده.
حالا با یک حلقه for، یکی یکی عناصر title و link و description رو از داخل عنصر item مربوطه استخراج کرده و نشون میدیم. به همین راحتی!
اگه سؤالی بود یا جایی از کد نیاز به توضیح بیشتر داشت، در خدمتم.
موفق باشید.