מערכת שאלות-תשובות מותאמת אישית למוצרי 1C-Bitrix
באתר עם 10,000 מוצרים, מגיעות עד 50 שאלות לקוחות ביום. ללא מערכת אחידה, מנהלים מבזבזים עד 3 שעות ביום במענה בצ'אטים, בדוא"ל ובטלפון. לקוחות, שלא ממתינים לתשובה, עוזבים למתחרים — ההמרה יורדת ב-15–20%. מערכת שאלות-תשובות מותאמת אישית על 1C-Bitrix פותרת בעיה זו: היא הופכת את קליטת השאלות, המודרציה, ההתראות לאוטומטיות, ומייצרת תוכן משתמש ייחודי (UGC). UGC לא רק מגביר נאמנות אלא גם משפר SEO — מנועי חיפוש אוהבים טקסט חדש בדפי מוצרים.
בלוק שאלות-תשובות בכרטיס המוצר מאפשר ללקוחות לשאול שאלות ולקבל תשובות מיידיות מהחנות או מקונים אחרים. ל-Bitrix אין רכיב סטנדרטי — אנו מיישמים אותו על מודל ORM מותאם אישית. בפרויקט אחד לאחר היישום, שאלות חוזרות ירדו ב-35%, וזמן התגובה הראשונה הצטמצם לשעתיים, מה שהפחית את עומס התמיכה ב-30%.
איך לבנות מודל ORM לשאלות ותשובות?
למערכת שאלות-תשובות, מספיקות שתי טבלאות מקושרות. טבלה b_product_question:
| שדה | סוג | מטרה |
|---|---|---|
| ID | int | מפתח ראשי |
| PRODUCT_ID | int | מזהה מוצר |
| USER_ID | int | מזהה משתמש (NULL = אורח) |
| AUTHOR_NAME | varchar(255) | שם המחבר |
| AUTHOR_EMAIL | varchar(255) | דוא"ל להתראת תשובה |
| QUESTION | text | טקסט השאלה |
| STATUS | enum | PENDING, APPROVED, REJECTED |
| CREATED_AT | datetime | תאריך יצירה |
טבלה b_product_answer (תשובות לשאלות):
| שדה | סוג | מטרה |
|---|---|---|
| ID | int | מפתח ראשי |
| QUESTION_ID | int | FK → b_product_question.ID |
| USER_ID | int | מי ענה |
| AUTHOR_NAME | varchar(255) | שם מחבר התשובה |
| IS_OFFICIAL | tinyint(1) | תשובה רשמית מהחנות |
| ANSWER | text | טקסט התשובה |
| STATUS | enum | PENDING, APPROVED |
| CREATED_AT | datetime | תאריך יצירה |
דוגמה למחלקות ORM ProductQuestionTable
namespace Your\Module; use Bitrix\Main\ORM\Data\DataManager; use Bitrix\Main\ORM\Fields\IntegerField; use Bitrix\Main\ORM\Fields\TextField; use Bitrix\Main\ORM\Fields\EnumField; use Bitrix\Main\ORM\Fields\DatetimeField; use Bitrix\Main\ORM\Fields\Relations\Reference; use Bitrix\Main\ORM\Query\Join; class ProductQuestionTable extends DataManager { public static function getTableName() { return 'b_product_question'; } public static function getMap() { return [ new IntegerField('ID', ['primary' => true, 'autocomplete' => true]), new IntegerField('PRODUCT_ID', ['required' => true]), new IntegerField('USER_ID'), new TextField('AUTHOR_NAME'), new TextField('AUTHOR_EMAIL'), new TextField('QUESTION', ['required' => true]), new EnumField('STATUS', ['values' => ['PENDING', 'APPROVED', 'REJECTED'], 'default' => 'PENDING']), new DatetimeField('CREATED_AT', ['default' => function () { return new \Bitrix\Main\Type\DateTime(); }]), ]; } } מחלקות ORM namespace Your\Module; use Bitrix\Main\ORM\Data\DataManager; use Bitrix\Main\ORM\Fields\IntegerField; use Bitrix\Main\ORM\Fields\TextField; use Bitrix\Main\ORM\Fields\EnumField; use Bitrix\Main\ORM\Fields\DatetimeField; use Bitrix\Main\ORM\Fields\Relations\Reference; use Bitrix\Main\ORM\Query\Join; class ProductQuestionTable extends DataManager { public static function getTableName() { return 'b_product_question'; } public static function getMap() { return [ new IntegerField('ID', ['primary' => true, 'autocomplete' => true]), new IntegerField('PRODUCT_ID', ['required' => true]), new IntegerField('USER_ID'), new TextField('AUTHOR_NAME'), new TextField('AUTHOR_EMAIL'), new TextField('QUESTION', ['required' => true]), new EnumField('STATUS', ['values' => ['PENDING', 'APPROVED', 'REJECTED'], 'default' => 'PENDING']), new DatetimeField('CREATED_AT', ['default' => function () { return new \Bitrix\Main\Type\DateTime(); }]), ]; } } ו-ProductQuestionTable מרחיבות את ProductAnswerTable. הקשר מוגדר באמצעות \Bitrix\Main\ORM\Data\DataManager עבור JOIN בשאילתה אחת. ארכיטקטורה זו מהירה פי 2–3 מהפתרון הסטנדרטי מבוסס הרכיבים. מידע נוסף על ORM ב-תיעוד רשמי וב-ויקיפדיה.
הצבעה על מועילות מגבירה המרה
כאשר לקוח רואה שתשובה עזרה לאחרים, הוא סומך יותר על החנות. אנו מוסיפים טבלה \Bitrix\Main\ORM\Fields\Relations\Reference עם שדות b_product_answer_vote, ANSWER_ID, USER_ID, IP. מוני צבירה (IS_HELPFUL, HELPFUL_COUNT) נשמרים ישירות ב-UNHELPFUL_COUNT להצגה מהירה ללא JOIN. זה מפחית את זמן טעינת הדף ב-15%. לפי הסטטיסטיקות שלנו, למוצרים עם שאלות-תשובות והצבעות גלויות יש המרת רכישה גבוהה ב-18%.
מהו מחזור החיים של שאלה?
כל שאלה עוברת את השלבים הבאים:
- הלקוח שולח שאלה → נוצר רשומה עם
b_product_answer. - המודרטור מקבל התראת דוא"ל (אירוע דוא"ל
STATUS = PENDING). - המודרטור מאשר את השאלה (
PRODUCT_QUESTION_NEW) — השאלה הופכת גלויה בדף. - מנהל או לקוח אחר משאיר תשובה →
STATUS = APPROVEDעםb_product_answer. - אם התשובה דורשת מודרציה — מאושרת באופן דומה. תשובות רשמיות (
STATUS = PENDING) יכולות להתפרסם אוטומטית. - לאחר התשובה המאושרת הראשונה, מחבר השאלה מקבל התראת דוא"ל.
התראות
קבוצה מינימלית של אירועי דוא"ל:
-
IS_OFFICIAL = 1— שאלה חדשה ממתינה למודרציה. נמען: מנהל. -
PRODUCT_QUESTION_NEW— תשובה חדשה ממתינה למודרציה (אם מודרציית תשובות מופעלת). -
PRODUCT_ANSWER_NEW— השאלה שלך קיבלה תשובה. נמען: מחבר לפיPRODUCT_QUESTION_ANSWERED.
תבניות נוצרות ב-הגדרות → אירועי דוא"ל. משתנים מועברים דרך הפרמטר השני של AUTHOR_EMAIL:
\CEvent::Send('PRODUCT_QUESTION_ANSWERED', SITE_ID, [ 'QUESTION_TEXT' => $question['QUESTION'], 'ANSWER_TEXT' => $answer['ANSWER'], 'PRODUCT_NAME' => $productName, 'PRODUCT_URL' => $productUrl, 'AUTHOR_EMAIL' => $question['AUTHOR_EMAIL'], 'AUTHOR_NAME' => $question['AUTHOR_NAME'], ]); חיפוש בשאלות
בדפים עם נפח שאלות גבוה (מוצרים פופולריים), אנו מוסיפים חיפוש AJAX לפי טקסט השאלה. שאילתה דרך ORM:
ProductQuestionTable::getList([ 'filter' => [ '=PRODUCT_ID' => $productId, '=STATUS' => 'APPROVED', '%QUESTION' => $searchQuery, ], 'select' => ['ID', 'AUTHOR_NAME', 'QUESTION', 'CREATED_AT'], 'order' => ['CREATED_AT' => 'DESC'], 'limit' => 10, ]); הקידומת CEvent::Send() במפתח הסינון של D7 מאפשרת חיפוש LIKE.
קטע ניהול
ב-\CEvent::Send('PRODUCT_QUESTION_ANSWERED', SITE_ID, [ 'QUESTION_TEXT' => $question['QUESTION'], 'ANSWER_TEXT' => $answer['ANSWER'], 'PRODUCT_NAME' => $productName, 'PRODUCT_URL' => $productUrl, 'AUTHOR_EMAIL' => $question['AUTHOR_EMAIL'], 'AUTHOR_NAME' => $question['AUTHOR_NAME'], ]); אנו מציגים טבלת שאלות עם מסננים לפי סטטוס, מוצר ותאריך. אנו משתמשים במחלקה הסטנדרטית ProductQuestionTable::getList([ 'filter' => [ '=PRODUCT_ID' => $productId, '=STATUS' => 'APPROVED', '%QUESTION' => $searchQuery, ], 'select' => ['ID', 'AUTHOR_NAME', 'QUESTION', 'CREATED_AT'], 'order' => ['CREATED_AT' => 'DESC'], 'limit' => 10, ]); עבור דפדוף ומיון מהירים ללא כתיבת HTML ידנית.
מה כלול בפיתוח
- תיעוד על סכמת ORM ו-API.
- מיגרציות ליצירת טבלאות.
- קטע ניהול למודרציה.
- הגדרת אירועי דוא"ל ותבניות.
- בדיקות על 5+ תרחישים (אורח, משתמש רשום, מודרטור).
- הכשרת מנהלים על המערכת.
לוח זמנים והיקף
| היקף | תוכן | לוח זמנים |
|---|---|---|
| בסיסי | מודלי ORM, טופס שאלה, הצגת שאלות-תשובות, התראות, מודרציה בלוח הניהול | 4–6 ימים |
| מלא | תשובות לקוחות, חיפוש בשאלות, הצבעה על מועילות, קטע ניהול | 8–12 ימים |
יש לנו ניסיון של 7+ שנים עם Bitrix, מעל 120 פרויקטים שהושלמו. אנו שותף Bitrix מוסמך ומספקים אחריות ל-30 יום על כל הפיתוח. בקשו ייעוץ — נכין פתרון לפרויקט שלכם.







