ייצוא מוצרים מותאם אישית: CSV, Excel, XML, JSON לכל דרישה
לאחרונה פנה אלינו לקוח: חנות מקוונת עם 50,000 מוצרים. שווקים דרשו XML ו-CSV בפורמטים שונים, הנהלת חשבונות הייתה זקוקה ל-Excel עבור 1C, ואנליסטים רצו JSON. בכל פעם מפתחים כתבו סקריפט חדש, ובזבזו ימים. שגיאות במיפוי שדות גרמו לכך שהמחיר ללא מע"מ נשלח ל-Wildberries. זו סיטואציה טיפוסית לעסק בצמיחה כאשר מחלקות מבקשות פורמטים שונים ואין פתרון אחיד.
הצענו ארכיטקטורה אחת — תבנית Builder + Writer. היא מכסה את כל התרחישים ללא כפילות קוד. כעת הלקוח בוחר תבנית ייצוא מלוח הניהול, לוחץ על "הורדה", ומקבל את פורמט הקובץ הדרוש תוך שניות.
מדוע ייצוא גמיש הוא מורכב?
- פורמטים שונים: CSV לא תומך בנתונים מקוננים, XML הוא תקן עבור 1C ושווקים, JSON נוח עבור APIs, אבל עבור גדלים >50 MB NDJSON עדיף.
- כל נמען רוצה סט שדות משלו: עבור Yandex.Market צריך SKU, שם, מחיר, מלאי; עבור אינסטגרם רק תמונה וקישור.
- נפח נתונים: קטלוג יכול לגדול למאות אלפי פריטים. טעינת
json_encodeפשוטה לזיכרון תפיל את השרת.
איך עובד ייצוא אסינכרוני?
עבור קטלוגים גדולים, הייצוא רץ ברקע דרך תור. משימה מקבלת את תצורת התבנית, עוברת על מוצרים בקבוצות של 1000 רשומות, ומעבירה אותן ל-Writer. המשתמש מקבל הודעה כשהקובץ מוכן. זה מונע חסימת האתר ומאפשר ייצוא אפילו של מיליוני מוצרים.
איך אנחנו בונים ייצוא: תבנית Builder + Writer
הפרדנו את לוגיקת יצירת הנתונים (Builder) מכתיבת הקבצים (Writer). ה-Builder מקבל שרשרת של מתודות להגדרת שדות ומסננים, ואז עובר על מסד הנתונים בקבוצות ומעביר שורות ל-Writer.
interface ExportWriterInterface {
public function open(string $filePath): void;
public function writeHeader(array $columns): void;
public function writeRow(array $row): void;
public function close(): string; // возвращает путь к файлу
}ה-Builder שומר את התצורה ויכול לפתור שדות קשורים (קטגוריה, תמונות, מאפיינים) באמצעות ביטוי התאמה. עבור CSV: אנו מוסיפים BOM עבור Excel, ומשתמשים ב-interface ExportWriterInterface { public function open(string $filePath): void; public function writeHeader(array $columns): void; public function writeRow(array $row): void; public function close(): string; // возвращает путь к файлу } עם תו מפריד fputcsv.
class CsvWriter implements ExportWriterInterface {
private $handle;
public function open(string $filePath): void {
$this->handle = fopen($filePath, 'w');
fwrite($this->handle, "\xEF\xBB\xBF");
}
public function writeHeader(array $columns): void {
fputcsv($this->handle, $columns, ';', '"');
}
public function writeRow(array $row): void {
fputcsv($this->handle, $row, ';', '"');
}
public function close(): string {
fclose($this->handle);
return $this->filePath;
}
}עבור Excel אנו משתמשים ב-OpenSpout הזורם — הוא כותב שורות ישירות לזרם ZIP, תוך צריכת ~10 MB זיכרון ללא קשר לגודל הקובץ. עבור נפחי JSON גדולים — NDJSON (אובייקט אחד בכל שורה). XML — דרך XMLWriter עם אלמנטים ;.
טבלת השוואת פורמטים
| פורמט | ביצועים | גודל קובץ | קינון | נפח מומלץ |
|---|---|---|---|---|
| CSV | גבוה | קטן | לא | עד 100,000 שורות |
| XLSX | בינוני | בינוני | לא | עד 1,000,000 שורות (עם OpenSpout) |
| XML | נמוך | גדול | כן | עד 50,000 מוצרים |
| JSON/NDJSON | גבוה | בינוני | כן | עד 500,000 אובייקטים (NDJSON) |
השוואה בין ייצוא ידני לאוטומטי
| פרמטר | ידני (סקריפט חדש בכל פעם) | אוטומטי (Builder + Writer) |
|---|---|---|
| זמן פיתוח לפורמט חדש | 1-2 ימים | 0 (בחירת תבנית) |
| שגיאות מיפוי | תכופות | מבוטלות (תצורה אחת) |
| ביצועים בנפח גדול | איטי, קריסת זיכרון | זרימה, ~10 MB |
| התאמה לדרישות חדשות | כתיבה מחדש מלאה | הוספת שדה ל-Builder |
דוגמה לתצורת Builder
$builder = new ProductExportBuilder();
$builder->addField('sku', function ($product) {
return $product->sku;
})->addField('name', function ($product) {
return $product->name;
})->addField('price', function ($product) {
return round($product->price, 2);
})->addField('category', function ($product) {
return $product->category->name;
})->filterBy('price', '>', 100)->chunkSize(1000); מה כלול ביישום
- פיתוח Builder עם תמיכה בשדות מותאמים אישית, מסננים וחלוקה לקבוצות (1000 רשומות).
- סט Writers עבור CSV (עם BOM), XLSX (OpenSpout), XML, JSON (כולל NDJSON).
- ייצוא אסינכרוני לקבצים גדולים: מוצרים מיוצאים ברקע דרך תור, המשתמש מקבל הודעה.
- תבניות ייצוא — נשמרות במסד הנתונים, יכולות לכלול טרנספורמציות (עיגול מחירים, חיתוך תמונות).
- דף הורדה מוכן עם בקרת גישה וסוגי MIME.
- תיעוד להגדרת תבניות ופריסה.
כמה זמן זה לוקח?
- גרסה בסיסית (CSV + Excel + Builder עם חלוקה לקבוצות) — יומיים.
- הוספת XML, JSON, NDJSON ומשימה אסינכרונית — +יום אחד.
- תבניות, טרנספורמציות, הורדה — +יום אחד.
העלות הסופית מחושבת באופן אישי לאחר ניתוח הנפח והמורכבות של הקטלוג. צרו קשר — נבחן את הפרויקט שלכם תוך יום עסקים אחד.
למהנדסים שלנו יש ניסיון של 5+ שנים ב-Laravel ו-PHP. השלמנו 30+ פרויקטי ייצוא לאינטגרציה עבור חנויות עם קטלוגים של עד 500,000 מוצרים. אנו מבטיחים שהקבצים יהיו תואמים ל-1C, לשווקים שלכם ולמערכות BI. הזמינו פתרון סוהר — קבלו ייצוא גמיש שחוסך שעות עבודה למפתחים שלכם.







