bootstrap = true; $this->table = 'customdevslider_slide'; $this->className = 'CustomDevSliderSlide'; $this->identifier = 'id_customdevslider_slide'; $this->lang = true; parent::__construct(); $this->_defaultOrderBy = 'position'; $this->_defaultOrderWay = 'ASC'; $this->fields_list = [ 'id_customdevslider_slide' => ['title' => 'ID', 'class' => 'fixed-width-xs'], 'title' => ['title' => $this->l('Title')], 'link' => ['title' => $this->l('Link')], 'position' => ['title' => $this->l('Position'), 'class' => 'fixed-width-sm'], 'active' => ['title' => $this->l('Active'), 'type' => 'bool', 'active' => 'status', 'class' => 'fixed-width-sm'], ]; $this->addRowAction('edit'); $this->addRowAction('delete'); // Кнопка "Додати" $this->bulk_actions = []; } public function renderForm() { /** @var CustomDevSliderSlide $obj */ $obj = $this->object; $imagePreview = ''; if ($obj && !empty($obj->image)) { $imageUrl = __PS_BASE_URI__.'modules/customdevslider/uploads/'.$obj->image; $imagePreview = '
'; } $this->fields_form = [ 'legend' => ['title' => $this->l('Slide')], 'input' => [ [ 'type' => 'file', 'label' => $this->l('Image'), 'name' => 'image_file', 'desc' => $this->l('Allowed: jpg, jpeg, png, webp, gif.').$imagePreview, ], [ 'type' => 'text', 'label' => $this->l('Link'), 'name' => 'link', 'desc' => $this->l('Optional URL (https://...)'), ], [ 'type' => 'text', 'label' => $this->l('Title'), 'name' => 'title', 'lang' => true, ], [ 'type' => 'textarea', 'label' => $this->l('Text'), 'name' => 'text', 'lang' => true, 'autoload_rte' => true, ], [ 'type' => 'text', 'label' => $this->l('Position'), 'name' => 'position', 'class' => 'fixed-width-sm', 'desc' => $this->l('Sorting order (0..n). Lower goes first.'), ], [ 'type' => 'switch', 'label' => $this->l('Active'), 'name' => 'active', 'is_bool' => true, 'values' => [ ['id' => 'active_on', 'value' => 1, 'label' => $this->l('Enabled')], ['id' => 'active_off', 'value' => 0, 'label' => $this->l('Disabled')], ], ], ], 'submit' => ['title' => $this->l('Save')], ]; return parent::renderForm(); } public function processAdd() { $this->handleImageUpload(); return parent::processAdd(); } public function processUpdate() { $this->handleImageUpload(); return parent::processUpdate(); } private function handleImageUpload() { if (!isset($_FILES['image_file']) || empty($_FILES['image_file']['name'])) { return; } $file = $_FILES['image_file']; if (!empty($file['error'])) { $this->errors[] = $this->l('Image upload error.'); return; } $ext = Tools::strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); $allowed = ['jpg', 'jpeg', 'png', 'webp', 'gif']; if (!in_array($ext, $allowed, true)) { $this->errors[] = $this->l('Invalid image format.'); return; } $uploadDir = _PS_MODULE_DIR_.'customdevslider/uploads/'; if (!is_dir($uploadDir)) { if (!@mkdir($uploadDir, 0755, true)) { $this->errors[] = $this->l('Cannot create uploads directory.'); return; } } // Нормальне безпечне ім'я $safeName = sha1(uniqid('customdevslider_', true)).'.'.$ext; $dest = $uploadDir.$safeName; if (!move_uploaded_file($file['tmp_name'], $dest)) { $this->errors[] = $this->l('Image upload failed.'); return; } // Записуємо ім'я файлу в поле image $_POST['image'] = $safeName; } }