1 <?php
2
3 4 5 6 7 8
9 class ImportTask extends ScheduledTask {
10
11 private $filename = '/_import/import.xml';
12
13 function filename() {
14 return ASSETS_PATH . $this->filename;
15 }
16
17 18 19 20
21 function clearDatabase($class='Product') {
22
23 $result = DB::query("SELECT ID FROM `SiteTree` WHERE ClassName LIKE '{$class}'");
24 $delete = array();
25 foreach ($result as $row) {
26 DB::query("DELETE FROM Page WHERE ID=" . $row['ID']);
27 DB::query("DELETE FROM Page_Live WHERE ID=" . $row['ID']);
28 DB::query("DELETE FROM Page_versions WHERE ID=" . $row['ID']);
29 if ('Product') {
30 DB::query("DELETE FROM MediawebPage WHERE ID=" . $row['ID']);
31 DB::query("DELETE FROM MediawebPage_Live WHERE ID=" . $row['ID']);
32 DB::query("DELETE FROM MediawebPage_versions WHERE ID=" . $row['ID']);
33 }
34 }
35 DB::query("DELETE FROM SiteTree WHERE ClassName LIKE '" . $class . "'");
36 DB::query("DELETE FROM SiteTree_Live WHERE ClassName LIKE '" . $class . "'");
37 DB::query("DELETE FROM SiteTree_versions WHERE ClassName LIKE '" . $class . "'");
38
39 DB::query("TRUNCATE `{$class}`;");
40 DB::query("TRUNCATE `{$class}_Live`;");
41 DB::query("TRUNCATE `{$class}_versions`;");
42
43 }
44
45 46 47
48 function process() {
49 if (!file_exists($this->filename())) return;
50
51 ini_set('max_execution_time', 3600);
52
53
54
55 if (class_exists('LogItem')) LogItem::enable(false);
56
57
58 if (class_exists('AssociatedFolderDecorator'))
59 AssociatedFolderDecorator::$createFolders = false;
60
61
62 Versioned::$versions_ttl = 1;
63
64
65 $config = new ImportConfig();
66 if (!file_exists($this->filename())) {
67 $config->setStatus('error');
68 $config->setMessage('Отсутствует файл выгрузки');
69 $config->write();
70 return;
71 }
72
73
74 if ($config->getStatus() == 'start' || $config->getStatus() == 'clear') {
75 $config->setStatus('clear');
76 $config->write();
77
78 if ($config->clearDatabaseCatalog) {
79 $this->clearDatabase('Catalog');
80 $config->clearDatabaseCatalog = false;
81 }
82
83 if ($config->clearDatabaseProducts) {
84 $this->clearDatabase();
85 $config->clearDatabaseProducts = false;
86 }
87
88 $config->setStatus('write_catalog');
89 $config->write();
90 }
91
92 $import = new WebylonImportCatalog($this->filename(), 'Upload');
93
94 if ($import->parse()) {
95 while ($config->getStatus() != 'end' && $config->getStatus() != 'error') {
96 switch ($config->getStatus()) {
97 case 'write_catalog':
98 if ($import->writeCatalogIntoDB()) {
99 $config->onlyOffers = true;
100 $config->setStatus('write_product');
101 $config->write();
102 } else {
103 $config->onlyOffers = true;
104 $config->setStatus('error');
105 $config->setMessage('Ошибка при импорте каталога: ' . $import->getMessage());
106 $config->write();
107 }
108 break;
109
110 case 'write_product':
111 if ($import->writeOffersIntoDB()) {
112 if (!$config->clearDatabaseCatalog || !$config->clearDatabaseProducts) {
113 $config->setStatus('unpublish');
114 } else {
115
116 @unlink($this->filename().'.bak');
117 rename($this->filename(), $this->filename().'.bak');
118 $config->setStatus('end');
119 }
120 $config->write();
121 } else {
122 $config->setStatus('error');
123 $config->setMessage(sprintf('Ошибка при импорте товара: %d (%s)', $config->getCursor(), $import->getMessage()));
124 $config->write();
125 }
126 break;
127
128 case 'unpublish':
129 if ($import->unpublishNotUpdated()) {
130
131 @unlink($this->filename().'.bak');
132 rename($this->filename(), $this->filename().'.bak');
133 $config->setStatus('delete_bad_images');
134 $config->write();
135 } else {
136 $config->setStatus('error');
137 $config->setMessage('Ошибка при снятии с публикации: ' . $import->getMessage());
138 $config->write();
139 }
140 break;
141
142 case 'delete_bad_images':
143 if ($import->deleteBadImages()) {
144 $config->setStatus('end');
145 $config->write();
146 } else {
147 $config->setStatus('error');
148 $config->setMessage('Ошибка при удалении отсутствующих файлов: ' . $import->getMessage());
149 $config->write();
150 }
151 break;
152
153 default:
154 break;
155 }
156 }
157 if ($config->getStatus() == 'end') {
158 $config->endTime = time();
159 $config->write();
160 }
161 162 163 164 165 166 167
168 } else {
169 $config->setStatus('error');
170 $config->setMessage('Ошибка в формате файла: ' . $import->getMessage());
171 $config->write();
172 }
173 }
174
175 }
176
177
[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the
Silverstripe Forums to ask development related questions.
-