سلام کاربران گرامی حال شما خوبه ؟ امیدوارم که شاد باشید با اموزشی دیگر در زمینه جوملا درخدمتون هستیم..
جوملا ۲٫۵ با افزونه جستجو در هسته مجتمع شده است و یک سری توابع جستجوی هوشمند را بوجود آورده است. در مستندات جوملا آموزشهای خوبی برای نوشتن پلاگین جستجو هوشمند وجود دارد. با این حال فرض بر این است که مجتمع سازی با بانک اطلاعاتی جوملا توسط MageBridge انجام شده است.
اکنون ما اقدام به نوشتن یک پلاگین جستجوی هوشمند مجتمع با Magento میکنیم و فکر میکنیم که این یک ایده خوب است و آنرا با شما به اشتراک میگذاریم.
توابع اصلی جستجو هوشمند
در پلاگینهای قدیمی جستجو در جوملا، جستجو مستقیما در پایگاه داده انجام میباشد. اما توابع جدید جستجو هوشمند فهرست بندی را براساس API را محیا میکند. پلاگینهای هنوز میتوانند محتوا را ارائه دهند اما جستجو هوشمند میتواند تعیین کند که چگونه این مطلب فهرست بندی شده و جستجو شود.
پلاگینهای جستجو هوشمند به سادگی میتوانند با استفاده از کلاس FinderIndexerAdapter ایجاد شوند (به جای کلاس پیش فرض پلاگینها که JPlugin است).
کلاس FinderIndexerAdapter کار توسعه دهندگان پلاگین را بسیار ساده نموده است (به بخش مستندات جوملا، راهنمای ایجاد پلاگین جستجوی هوشمند مراجعه نمایید).
جدول خود را تعریف نمایید و متد getListQuery() را فراخوانی نمایید اما فرض بر این است محتوا شما در جدول داخل جوملا به اشتراک گذاشته شده است. با استفاده از MageBridge که از طریق API درخواستهایش از راه دور توسط http ارسال میکند و لذا در این آموزش هم صدق نمیکند.
فراخوانی getContentCount()
زمان فهرست بندی محتوا ۲ راه برای واکشی اولین محل محتوا وجود دارد، اولین راه واکشی همه محتواها برای یک بار و دومین راه واکشی همه در دستهها میباشد. افزونههای جستجو واکشی محتوا در دستهها را تسهیل میکنند.
برای فهمیدم اینکه چه تعداد دسته برای اولین محل نیاز است ما ابتدا نیاز داریم که بدانیم چه تعداد آیتم محتوا داریم. این کار با استفاده از متد getContentCount() امکان پذیر است اما یک پرس و جو در پایگاه داده ایجاد میکند. شما میتوانید این متد را براساس خواسته خود فراخوانی نمایید.
protected function getContentCount()
{
return 10; // replace this with your own logic
}
در این مورد ما از متد MageBridge که مانند یک ارتباط پل به Magento برای دریافت تعداد همه محصولات استفاده میکنیم. به خاطر اینکه هنوز هیچ منبع API ای به این منظور ایجاد نشده است و ما اولین منبع API را به نام magebridge_product.count() ایجاد میکنیم.
فراخوانی getItems()
دومین متد متکی به متد getListQuery() است، متد getItems() میباشدکه البته اطلاعات واقعی را بازگردانده و فهرست بندی میکند. بازگرداندن نتایج باید به صورت اعضا یک آرایه نوع FinderIndexerResult باشد.
protected function getItems($offset, $limit, $sql = null)
{
return array();
}
در این مورد ما مجددا با استفاده از Magento API محصولات را واکشی میکنیم و آنها را در آرایه قرار میدهیم. در حین واکشی محصولات ما از آرگمانهای $offset و $limit برای واکشی یک صفحه مشخص در Magento استفاده میکنیم.
آرگمان $sql زمانی نیاز است که فراخوانی این متد به درستی انجام شده باشد.
برخی خصلتها
در این مورد type_id پرچم هر $item است که بدرستی مشخص نشده است. در بانک اطلاعات جستجو این مقدار برابر ۰ است. لذا ما آنرا در متد getTypeId() اجرا میکنیم تا پرچم آن تنظیم شود:
$item->type_id = $this->getTypeId();
جستجوگر پایگاه داده همچنین اشاره دارد به list_price و sale_price. در حقیقت ما هم نمیدانیم که برای چه هستند و از آنها برای دریافت قیمت محصولات Magento استفاده میکنیم.
در مستندات جوملا همچنین به متدهای translateState()، getUrl() و getStateQuery()اشاره شده است که برای ما کاربرد ندارد.
فراخوانی getItem()
در این مورد ما هنوز متد getItem() را فراخوانی نکردهایم. این متد زمانی مفید است که یک آیتم محتوا نیاز به فهرست بندی مجدد داشته باشد. برای مثال بعد از ویرایش در بخش مدیریت سایت، نیاز است تا پلاگین رویداد به اولین موقعیت پرت شود بعد از اینکه پلاگین جستجو یکی از رویدادها را برداشت نمود. ما از این بخش میگذریم چون نیاز به کار بسیار زیادی دارد.
بخش مدیریت Magento به رویداد catalog_product_save_after نیاز دارد. این امر نیاز به برداشت توسط MageBridge از لیست رویدادها و ارسال آن به جوملا میباشد.
در جوملا پلاگین MageBridge-Magento نیاز دارد که رویدادها را به رویدادهای جوملا ترجمه نماید به عنوان مثال mageCatalogProductSaveAfter که میتواند پس از برداشت کردن توسط پلاگین جستجو مجددا آیتم را فهرست بندی مجدد نماید.
MageBridge API به این منظور کاملا اماده میباشد اما اجازه بدهید تا اول جستجو هوشمند آن چیزی را که میخواهیم به ما بدهد.