רשימת מועדפים ב-1C-Bitrix: מועדפים מותאמים אישית או מוצרים שנדחו?
הנה תרחיש טיפוסי: בעל חנות מקוונת ב-Bitrix מבקש פיצ'ר של "שמירה למועדפים", אבל מתברר שמנגנון המוצרים שנדחו הסטנדרטי בעגלה לא עובד—כשמנסים לבצע הזמנה, המועדפים נמחקים. או שמשתמשים מתלוננים שאחרי התחברות הרשימה נעלמת. נתקלנו בזה עשרות פעמים ופיתחנו שתי גישות מוכחות. הניסיון שלנו: מעל 10 שנות פיתוח ב-1C-Bitrix, יותר מ-60 פרויקטים עם רשימת מועדפים, אחריות ל-12 חודשים על כל אחד. בממוצע, עבודה עם טבלה מותאמת אישית מהירה פי 3 עבור קטלוגים עם 10,000 מוצרים.
למה מוצרים שנדחו בעגלה הם לא תמיד הפתרון?
המודול המובנה sale מאפשר לסמן מוצר עם דגל DELAY = Y. טכנית, זה רק רשומה בטבלת b_sale_basket:
$basket = \Bitrix\Sale\Basket::loadItemsForFUser( \Bitrix\Sale\Fuser::getId() );
$item = $basket->createItem('catalog', $productId);
$item->setFields([
'QUANTITY' => 1,
'DELAY' => 'Y',
'NAME' => $productName,
'PRICE' => $price,
'CURRENCY' => 'RUB',
]);
$basket->save();הרכיב $basket = \Bitrix\Sale\Basket::loadItemsForFUser( \Bitrix\Sale\Fuser::getId() ); $item = $basket->createItem('catalog', $productId); $item->setFields([ 'QUANTITY' => 1, 'DELAY' => 'Y', 'NAME' => $productName, 'PRICE' => $price, 'CURRENCY' => 'RUB', ]); $basket->save(); עם הפרמטר bitrix:sale.basket.basket מציג את הפריטים האלה. חיסרון: פריטים שנדחו הם חלק מהעגלה. כשהעגלה נמחקת (למשל, אחרי תשלום), כל הפריטים שנדחו אובדים. אין גם הפרדה בין "בעגלה" ל"רשימת מועדפים" ברמת הממשק. רשימת מועדפים מלאה דורשת ישות נפרדת.
מקרה בוחן: ממוצרים שנדחו למותאם אישית
היה לנו לקוח עם קטלוג של 15,000 מוצרים שהשתמש בתחילה במוצרים שנדחו. משתמשים התלוננו שפריטים נעלמו אחרי רכישה. העברנו אותם לטבלה מותאמת אישית. זמן הטעינה של דף המועדפים ירד מ-2.5 שניות ל-0.8 שניות, והתלונות של המשתמשים פסקו. הפרויקט לקח יומיים.
איך לבנות רשימת מועדפים מלאה על טבלה מותאמת אישית?
לאחסון בלתי תלוי בסשן וסנכרון בין מכשירים, אנו משתמשים בטבלה נפרדת. דוגמת DDL:
CREATE TABLE user_favorite_products (
ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
USER_ID INT NOT NULL,
PRODUCT_ID INT NOT NULL,
DATE_ADD DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_user_product (USER_ID, PRODUCT_ID)
);מחלקת ORM דרך SHOW_DELAY = Y מאפשרת שיטות סטנדרטיות של CREATE TABLE user_favorite_products ( ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, USER_ID INT NOT NULL, PRODUCT_ID INT NOT NULL, DATE_ADD DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_user_product (USER_ID, PRODUCT_ID) ); , \Bitrix\Main\ORM\Data\DataManager, add. הוספה/מחיקה דרך בקר AJAX:
class Favorite extends \Bitrix\Main\Engine\Controller
{
public function addAction(int $productId): array
{
$result = FavoriteTable::add([
'USER_ID' => \Bitrix\Main\Engine\CurrentUser::get()->getId(),
'PRODUCT_ID' => $productId,
]);
return $result->isSuccess() ? ['status' => 'ok'] : ['error' => $result->getErrors()];
}
} איך לסנכרן מועדפים למשתמשים לא מחוברים?
משתמשים לא מחוברים לא צריכים רשומה במסד נתונים. אנו מאחסנים מערך של מזהי מוצרים ב-delete:
- בלחיצה על "הוסף למועדפים" — הוסף/הסר מזהה מהמערך ועדכן את localStorage.
- בטעינת הדף, בדוק התחברות: אם אורח, קרא מ-localStorage והצג אייקוני מועדפים.
- בהתחברות, שלח את המזהים שנצברו לשרת דרך AJAX, שמכניס אותם לטבלה. זה מונע אובדן נתונים.
- אחרי הסנכרון, נקה את localStorage כדי למנוע כפילויות.
השוואת גישות
| היבט | מוצרים שנדחו (עגלה) | טבלה מותאמת אישית |
|---|---|---|
| אחסון | b_sale_basket | user_favorite_products |
| קשור לעגלה | כן | לא |
| תמיכה באורחים | סשן בלבד | localStorage + סנכרון |
| מורכבות יישום | ~2-4 שעות | 1-2 ימי עבודה |
| גמישות ממשק | מוגבלת | התאמה מלאה |
טבלה מותאמת אישית נותנת שליטה מלאה: אפשר להוסיף שדות (צבע, מידה), לקבץ רשימות, להציג מועדפים בנפרד מהעגלה. זה חשוב במיוחד לקטלוגים גדולים עם 10,000+ פריטים. לפי המדידות שלנו, שאילתה לטבלה מותאמת אישית רצה פי 3 מהר יותר מאשר select מ-getList עם פילטר class Favorite extends \Bitrix\Main\Engine\Controller { public function addAction(int $productId): array { $result = FavoriteTable::add([ 'USER_ID' => \Bitrix\Main\Engine\CurrentUser::get()->getId(), 'PRODUCT_ID' => $productId, ]); return $result->isSuccess() ? ['status' => 'ok'] : ['error' => $result->getErrors()]; } } .
איך לשלב רשימת מועדפים עם קטלוג קיים?
במהלך האינטגרציה, אנו מתאימים את תבנית רכיב הקטלוג: מוסיפים כפתור "מועדפים" עם מצב (פעיל/לא פעיל) ומונה. אנו משתמשים באירוע localStorage כדי להוסיף סעיף לחשבון האישי. לקישוריות, אנו משתמשים ב-cache מתויג עם תג OnBuildGlobalMenu. טעות אופיינית היא לשכוח אינדקס ייחודי על favorite, מה שמוביל לרשומות כפולות בלחיצות חוזרות. כמו כן, טפל במקרה שבו אורח כבר מחובר בכרטיסייה אחרת—הסנכרון עלול לאבד נתונים. השתמש ב-localStorage עבור אורחים, לא בסשן, אחרת הרשימה לא תשרוד רענון דף.
מה כלול בעבודה
- מפרט טכני עם תיאור לוגיקה וממשק.
- פיתוח רכיב כפתור "מועדפים" עם מצבים ומונה.
- בקר שרת להוספה/מחיקה.
- אחסון אורחים (localStorage) וסנכרון בהתחברות.
- אינטגרציה לקטלוג הקיים עם התאמת תבנית.
- תיעוד והוראות למנהל תוכן.
- גישה למאגר הקוד.
- אחריות קוד ל-12 חודשים.
שלבי העבודה
| שלב | משך | תוצאה |
|---|---|---|
| ניתוח | 2-4 שעות | מפרט טכני |
| עיצוב | 1-2 ימים | ארכיטקטורת מסד נתונים |
| פיתוח | 2-4 ימים | אב טיפוס עובד |
| אינטגרציה | 1-2 ימים | שילוב בקטלוג |
| בדיקות | יום אחד | דוח QA |
| תיעוד | 4 שעות | הוראות |
עלות ולוחות זמנים
לוחות הזמנים תלויים בגישה הנבחרת. מוצרים שנדחו סטנדרטיים: מ-2 עד 4 שעות. רשימת מועדפים מותאמת אישית עם סנכרון: מיום עבודה אחד עד יומיים. אינטגרציות מורכבות (למשל, סנכרון עם אפליקציה ניידת) נדונות בנפרד. העלות מחושבת באופן אישי לאחר ניתוח הפרויקט שלך. פנה אלינו—ננתח את המקרה שלך ונשוב עם הצעה. הזמן יישום רשימת מועדפים במפתח. זה חוסך זמן בפיתוח מאפס ומונע טעויות אופייניות.
לחקר ארכיטקטורה, אנו ממליצים על תיעוד Bitrix ORM ו-ויקיפדיה על Web Storage API.

