1 <?php
2
3 class MonumentForm extends Catalog {
4
5 static $allowed_children = array('Monument');
6
7 static $subpage_children = 'Monument';
8
9 static $defaults = array(
10 'ShowInMenus' => 0,
11 );
12
13 static $simple_order = false;
14
15 static function set_simple_order($val = true) {
16 self::$simple_order = ($val) ? true : false;
17 }
18
19 static function calc_grav_price($type, $text) {
20 $sc = SiteConfig::current_site_config();
21 $price = 0;
22 if ($type == 'person') {
23 if ($sc->FIOPriceType == 'fixed') {
24 $price = $sc->FIOTotalGravPrice;
25 } else {
26 $charsCount = mb_strlen(trim(preg_replace('/\s+/', '', trim($text))));
27 $price = ($charsCount * $sc->FIOLetterGravPrice);
28 }
29 }
30
31 if ($type == 'epitaph') {
32 if ($sc->EpitaphPriceType == 'fixed') {
33 $price = $sc->EpitaphTotalGravPrice;
34 } else {
35 $charsCount = mb_strlen(trim(preg_replace('/\s+/', '', trim($text))));
36 $price = ($charsCount * $sc->EpitaphLetterGravPrice);
37 }
38 }
39 return $price;
40 }
41
42 function MinPrice() {
43 if (($products = $this->filteredProducts()) && $products->Count()) {
44 $products->sort('Price');
45 return (float)$products->First()->Price;
46 }
47 }
48
49 function PersonsDataLink($count) {
50 return $this->Link("persons_data/{$count}");
51 }
52
53 function PhotoCategoryItemsLink() {
54 return $this->Link("photo_category_items");
55 }
56
57 function MonumentPersons($count=false) {
58 $sc = SiteConfig::current_site_config();
59 if (!$count) {
60 $count = $sc->MaxFIOCount;
61 }
62 $persons = new DataObjectSet();
63 for($i = 1; $i <= $count; $i++) {
64 $persons->push(new ArrayData(array(
65 'Count' => $i,
66 'Title' => _t("MonumentPersons.Count_{$i}"),
67 'Link' => $this->PersonsDataLink($i),
68 )));
69 }
70 return $persons;
71 }
72
73 function PortraitTypes() {
74 if ($portraitTypes = DataObject::get('PortraitType')) {
75 return $portraitTypes;
76 }
77 return false;
78 }
79
80 function MonumentEpitaphs() {
81 if ($epitaphs = DataObject::get('Epitaph')) {
82 return $epitaphs;
83 }
84 return false;
85 }
86
87 function MonumentPhotoCategories() {
88 if ($monumentPhotoCategories = DataObject::get('MonumentPhotoGallery')) {
89 return $monumentPhotoCategories;
90 }
91 return false;
92 }
93 }
94
95 class MonumentForm_Controller extends Catalog_Controller {
96
97 function persons_data($request) {
98 if ($count = (int)$request->param('ID')) {
99 $sc = SiteConfig::current_site_config();
100 if ($count > $sc->MaxFIOCount) {
101 $count = $sc->MaxFIOCount;
102 }
103
104 $fields = new FieldSet();
105 for($i = 1; $i <= $count; $i++) {
106 $fields->push(new LiteralField('PersonData', '<div class="monument_personsInput" data-num="'.$i.'" data-price="0">'));
107 $fields->push(new LiteralField('PersonNumber', '<p class="monument_optionsTitle">' . sprintf(_t("MonumentForm.PersonNumber"), $i). '</p>'));
108 $fields->push(new TextField('FIO['.($i-1).']', _t('MonumentForm.FIO')));
109 $fields->push($df = new TextField('Date1['.($i-1).']', _t('MonumentForm.Date1')));
110 $df->setHTML5Attribute('pattern', '\d\d\.\d\d\.\d\d\d\d');
111 $df->addExtraAttribute('data-mask', '\d\d\.\d\d\.\d\d\d\d');
112 $fields->push($df = new TextField('Date2['.($i-1).']', _t('MonumentForm.Date2')));
113 $df->setHTML5Attribute('pattern', '\d\d\.\d\d\.\d\d\d\d');
114 $df->addExtraAttribute('data-mask', '\d\d\.\d\d\.\d\d\d\d');
115 $fields->push(new SimpleImageField('PortraitImage['.($i-1).']', _t('MonumentForm.PortraitImage')));
116 $fields->push(new LiteralField('PersonData', '</div>'));
117 }
118 $portraitTypes = DataObject::get('PortraitType', "MaxPersonsCount <= {$count}");
119 return $this->customise(array(
120 'Fields' => $fields,
121 'PortraitTypes' => $portraitTypes,
122 'MonumentPersons' => $this->MonumentPersons($count),
123 ))->renderWith('PersonsMonumentData');
124 }
125 }
126
127 function photo_category_items($request) {
128 if ($category = DataObject::get_by_id('MonumentPhotoGallery', (int)$request->param('ID'))) {
129 if ($category->Items() && $category->Items()->Count()) {
130 return $this->customise(array('Items' => $category->Items()))->renderWith('PhotoCategoryItems');
131 }
132 }
133 }
134
135 function grav_price() {
136 $rs = 0;
137 $price = 0;
138 if (isset($_GET['type']) && in_array($_GET['type'], array('person', 'epitaph'))) {
139 $text = isset($_GET['text']) ? trim($_GET['text']) : '';
140 $price = MonumentForm::calc_grav_price($_GET['type'], $text);
141 }
142 return json_encode(array('rs' => $rs, 'price' => $price));
143 }
144
145 function AddMonumentToBasketForm() {
146 $fields = new FieldSet();
147 $sc = SiteConfig::current_site_config();
148
149 $fields->push(new HiddenField('MonumentID'));
150 $fields->push(new HiddenField('PolishingID'));
151 $fields->push(new HiddenField('PersonCount'));
152
153 $fields->push(new HiddenField('PortraitTypeID'));
154 $fields->push(new HiddenField('FlowerGardenSizeID'));
155
156 $fields->push($ef = new TextAreaField('Epitaph', 'Общая для всех персон эпитафия'));
157 $ef->addExtraAttribute("data-price", "0");
158 if ($epitaphs = DataObject::get('Epitaph')) {
159 $fields->push(new DropdownField('Epitaphs', _t('MonumentForm.Epitaphs'), $epitaphs->map('ID', 'Text', 'не выбрано')));
160 }
161
162
163 if ($sc->MaxImageCount) {
164 for($i = 1; $i <= $sc->MaxImageCount; $i++) {
165 $fields->push(new HiddenField("GalleryImage{$i}ID"));
166 }
167 }
168
169
170 if ($epitaphs) {
171 $fields->push(new DropdownField('TileEpitaphs', _t('MonumentForm.TileEpitaphs'), $epitaphs->map('ID', 'Text', 'не выбрано')));
172 }
173 $fields->push($ef = new TextAreaField('TileEpitaph', 'Общая для всех персон эпитафия'));
174 $ef->addExtraAttribute("data-price", "0");
175
176 if ($sc->MaxTileImageCount) {
177 for($i = 1; $i <= $sc->MaxTileImageCount; $i++) {
178 $fields->push(new HiddenField("TileGalleryImage{$i}ID"));
179 }
180 }
181
182 $fields->push(new HiddenField('FIOPriceType', 'FIOPriceType', $sc->FIOPriceType));
183 $fields->push(new HiddenField('FIOLetterGravPrice', 'FIOLetterGravPrice', $sc->FIOLetterGravPrice));
184 $fields->push(new HiddenField('FIOTotalGravPrice', 'FIOTotalGravPrice', $sc->FIOTotalGravPrice));
185
186 $fields->push(new HiddenField('EpitaphPriceType', 'EpitaphPriceType', $sc->EpitaphPriceType));
187 $fields->push(new HiddenField('EpitaphLetterGravPrice', 'EpitaphLetterGravPrice', $sc->EpitaphLetterGravPrice));
188 $fields->push(new HiddenField('EpitaphTotalGravPrice', 'EpitaphTotalGravPrice', $sc->EpitaphTotalGravPrice));
189
190 $fields->push(new HiddenField('MaxFIOCount', 'MaxFIOCount', $sc->MaxFIOCount));
191 $fields->push(new HiddenField('MaxImageCount', 'MaxImageCount', $sc->MaxImageCount));
192 $fields->push(new HiddenField('MaxTileImageCount', 'MaxTileImageCount', $sc->MaxTileImageCount));
193
194 $form = new Form(
195 $this,
196 'AddMonumentToBasketForm',
197 $fields,
198 new FieldSet(new FormAction('addToCart', _t('MonumentForm.AddToCart')))
199 );
200 $form->disableSecurityToken();
201
202 return $form;
203 }
204
205 function addToCart($data, $form) {
206
207 if (MonumentForm::$simple_order) {
208 Cart::clear();
209 }
210
211 if (isset($data['MonumentID']) && is_numeric($data['MonumentID'])) {
212 $product = DataObject::get_by_id('Monument', $data['MonumentID']);
213 $itemData = array();
214 $itemData['ID'] = 0;
215 $itemData['Title'] = $product->FullTitle();
216 $itemData['LinkedID'] = $product->ID;
217 $itemData['ItemPrice'] = 0;
218 $itemData['OrderID'] = 0;
219 $itemData['Quantity'] = 1;
220
221 $itemData['NeedMonumentLayout'] = (isset($data['NeedMonumentLayout'])) ? (int)$data['NeedMonumentLayout'] : 0;
222 $itemData['FlowerGardenSizeID'] = (isset($data['FlowerGardenSizeID'])) ? (int)$data['FlowerGardenSizeID'] : 0;
223 $itemData['PolishingID'] = (isset($data['PolishingID'])) ? (int)$data['PolishingID'] : 0;
224
225 $item = Object::create('OrderItem', $itemData);
226 $item->write();
227 $item->RealItemID = $item->ID;
228
229 if (isset($data['FIO'])) {
230 $persons = new DataObjectSet();
231 $images = array();
232 foreach($data['FIO'] as $key=>$fio) {
233 if ($fio) {
234 $person = new Person();
235 $person->OrderItemID = $item->ID;
236 $person->FIO = Convert::raw2sql(trim($fio));
237 $person->Date1 = Convert::raw2sql(trim($data['Date1'][$key]));
238 $person->Date2 = Convert::raw2sql(trim($data['Date2'][$key]));
239 $person->write();
240 $item->PersonCount++;
241
242 if ($data['PortraitImage']['size'][$key]) {
243 $images[$person->ID] = array(
244 'name' => $data['PortraitImage']['name'][$key],
245 'type' => $data['PortraitImage']['type'][$key],
246 'tmp_name' => $data['PortraitImage']['tmp_name'][$key],
247 'size' => $data['PortraitImage']['size'][$key],
248 );
249 }
250 }
251 }
252
253 if (count($images)) {
254 $folder = Folder::findOrMake('portraits');
255 foreach($images as $personID=>$photosData) {
256 $person = DataObject::get_by_id('Person', $personID);
257 $fileID = $folder->addUploadToFolder($photosData);
258 $person->PhotoID = $fileID;
259 $person->write();
260 }
261 }
262 }
263
264 $item->Epitaph = (isset($data['Epitaph'])) ? Convert::raw2sql(trim($data['Epitaph'])) : '';
265 $item->TileEpitaph = (isset($data['TileEpitaph'])) ? Convert::raw2sql(trim($data['TileEpitaph'])) : '';
266
267 if (isset($data['PortraitTypeID']) && ($type = DataObject::get_by_id('PortraitType', (int)$data['PortraitTypeID']))) {
268 $item->PortraitTypeID = $type->ID;
269 $item->PortraitCount = (int)$data['PortraitCount'];
270 }
271
272 for($i = 1; $i < 4; $i++) {
273 if (isset($data["GalleryImage{$i}ID"]) && ($image = DataObject::get_by_id('MonumentGalleryItem', (int)$data["GalleryImage{$i}ID"]))) {
274 $item->{"GalleryImage{$i}ID"} = $image->ID;
275 }
276 if (isset($data["TileGalleryImage{$i}ID"]) && ($image = DataObject::get_by_id('MonumentGalleryItem', (int)$data["TileGalleryImage{$i}ID"]))) {
277 $item->{"TileGalleryImage{$i}ID"} = $image->ID;
278 }
279 }
280
281 $item->ItemPrice = $item->calculateItemPrice();
282 $item->write();
283
284 Cart::add_new_item($item);
285 Session::clear('Cart.Process');
286
287
288 if (!$this->isAjax())
289 Director::redirectBack();
290 return $this->CartBlock();
291
292 }
293 }
294 }
295
296
[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.
-