Images * @copyright Tamaranga */ class Images extends FormBlock { public function init() { parent::init(); $this->setTemplate('form/blocks/images', 'listings'); $this->setKey('images'); $this->setTitle(_t('item-form', 'Photos')); } public function data() { $data = parent::data(); $data['visible'] = $this->visible(); $images = Listings::itemImages($this->form->recordID()); $data['imgcnt'] = $this->form->item['imgcnt'] ?? 0; $data['images'] = []; $data['images_hash'] = ''; $limit = $this->limit(); if ($data['imgcnt']) { $key = $images->rotateSize(); $imagesData = $images->getData($data['imgcnt']); $imagesData = $this->app->filter('listings.form.item.images.data', $imagesData); $cnt = 0; foreach ($imagesData as $v) { $cnt++; if ($limit && $cnt > $limit) { continue; } $data['images'][$v['id']] = [ 'id' => $v['id'], 'filename' => $v['filename'], 'url' => $images->getURL($v, $key, false), 'rotate' => $images->rotateAvailable($v), ]; } $data['images_hash'] = $images->getLastUploaded(); } $settings = [ 'limit' => $images->getLimit(), 'catLimit' => $limit, 'maxSize' => $images->getMaxSize(true), ]; $settings = array_merge($settings, $this->imagesOptimization()); $data['settings'] = $settings; return $data; } public function onImageUploadAction() { $result = []; do { $itemId = $this->form->item['id'] ?? 0; $images = Listings::itemImages($itemId); $res = $images->uploadQQ(); if ($res) { if (! empty($res['image_id'])) { $result['id'] = $res['image_id']; } else { $result['id'] = $res['filename'] ?? ''; } } if ($itemId) { $this->checkModerated(); } } while (false); return $this->ajaxResponseForm($result); } public function onImageDeleteAction() { $itemId = $this->form->item['id'] ?? 0; $id = $this->request->post('id', TYPE_STR); $images = Listings::itemImages($itemId); if ($itemId) { if (Listings::isItemOwner($itemId, $this->form->item['user_id'] ?? 0)) { $images->deleteImage($id); } } else { $images->deleteTmpFile($id); } return $this->ajaxResponseForm(); } public function onSubmitAddAfterSaveEvent($p) { if (empty($p['id']) || empty($p['data'])) { return; } if (! $this->limit()) { return; } # антиспам фильтр: проверка дубликатов изображений $checkImagesDuplicates = $this->config('listings.items.spam.duplicates.images', false, TYPE_BOOL); # сохраняем / загружаем изображения $itemId = $p['id']; $images = Listings::itemImages($itemId); $images->setAssignErrors(false); $images->setUserID($p['data']['user_id'] ?? User::id()); if (! empty($checkImagesDuplicates)) { if ($images->filesHashExists($images->filesHash(true, 'images'))) { $this->errors->set(_t('listings', 'You have already published a similar listing. Use the listing Raise'), 'spam'); return; } } # перемещаем из tmp-директории в постоянную $images->saveTmp('images'); } public function onSubmitEditAfterSaveEvent($p) { if (empty($p['data'])) { return; } if (! $this->limit()) { return; } $itemId = $this->form->recordID(); $images = Listings::itemImages($itemId); # сохраняем порядок изображений $order = []; $img = $this->input->post('images', TYPE_ARRAY_UINT); $imagesData = $images->getData(); foreach ($img as $id) { if (! isset($imagesData[$id])) { continue; } $order[$id] = $imagesData[$id]['filename']; } $images->saveOrder($order, false); # помечаем на модерацию при изменении фотографий if ($images->newImagesUploaded($this->input->post('images_hash', TYPE_STR))) { $this->checkModerated(); } } protected function checkModerated() { $moderated = Listings::premoderationEdit() ? 0 : 2; if (($this->form->item['moderated'] ?? 1) != $moderated) { $itemId = $this->form->recordID(); if ($itemId) { Listings::model()->itemSave($itemId, ['moderated' => $moderated]); } } } public function limit() { return $this->form->category['settings']['photos']['limit'] ?? 0; } public function visible() { return $this->limit() > 0; } public function reloadBlock($event) { if ($event != 'categoryChange') { return false; } $this->form->respond('images', ['catLimit' => $this->limit()]); if ($this->visible()) { return $this->render(); } return ''; } public function imagesOptimization() { $optimization = ['enable' => false]; do { if (! $this->config('listings.items.images.optimization', true, TYPE_BOOL)) { break; } $images = Listings::itemImages($this->form->recordID()); $key = $images->rotateSize(); $w = $images->getSizeWidth($key); $h = $images->getSizeHeight($key); if (empty($h)) { $s = $images->getSizes(); if (! empty($s[$key]['vertical']['height'])) { $h = $s[$key]['vertical']['height']; } } if ($w <= 0 && $h <= 0) { break; } if ($w <= 0) { $w = $h; } if ($h <= 0) { $h = $w; } $optimization['enable'] = true; $optimization['width'] = $w; $optimization['height'] = $h; } while (false); return $optimization; } public function validate($data = []) { $limit = $this->limit(); if ($limit) { Listings::itemImages($this->form->recordID())->setLimit($limit); } return parent::validate($data); } }