base_object = $base_object; $this->config = $base_object->config; $this->layout_object = $layout_object; $this->db = $base_object->db; $this->item_object = new Item($this->base_object,false,0); $this->list_object = new ListAndEdit($base_object, $layout_object); $this->vendor_object = new Vendors_Edit($base_object); } function run() { if (isset($_GET['id']) && $_GET['id']) { $has_id = true; $id = intval($_GET['id']); } else if (isset($_POST['id']) && $_POST['id']) { $has_id = true; $id = intval($_POST['id']); } else { $has_id = false; $id = false; } $this->id = $id; if (isset($_POST['submit'])) { $is_submitted = true; } else { $is_submitted = false; } if (isset($_POST['show_price_and_marketing']) && $_POST['show_price_and_marketing']) { $this->layout_object->assign('show_price_and_marketing', 1); } if (isset($_POST['show_attributes']) && $_POST['show_attributes']) { $this->layout_object->assign('show_attributes', 1); } if (isset($_POST['show_versand']) && $_POST['show_versand']) { $this->layout_object->assign('show_versand', 1); } if (isset($_POST['show_seo']) && $_POST['show_seo']) { $this->layout_object->assign('show_seo', 1); } if (isset($_POST['show_lager']) && $_POST['show_lager']) { $this->layout_object->assign('show_lager', 1); } if (isset($_POST['show_price_variants']) && $_POST['show_price_variants']) { $this->layout_object->assign('show_price_variants', 1); } // Lade alle Lieferanten // $vendors = $this->vendor_object->get_all(); $vendors = $this->vendor_object->get_dropdown_data(); $this->layout_object->assign('vendors', $vendors); // decide what CRUD method to call and call it in ListAndEdit if (isset($_POST['mod']) && $_POST['mod'] == 'rename_item_document') { self::rename_item_document(); } else if (isset($_POST['mod']) && $_POST['mod'] == 'delete_item_document') { self::delete_item_document(); } else if (isset($_POST['mod']) && $_POST['mod'] == 'add_item_type') { self::add_item_type(); } else if ($is_submitted && !$has_id) { // create self::save_item_types(); // abort if Item Number already exists and reroute to existing item form $newId = $this->item_object->get_by_number($_POST['form_field']['number']); if ($newId != false) { header('location: http://'.$_SERVER["SERVER_NAME"].'/index.php?admin_modul=admin_item_editor&action=edit&id='.$newId); return; } else { $form_data = $this->item_object->data_filter($_POST['form_field']); $saved = $this->item_object->create($form_data, $_POST['form_field_prices']); } if ($saved) { self::save_item_types(); // reroute to form with id in saved header('location: http://'.$_SERVER["SERVER_NAME"].'/index.php?admin_modul=admin_item_editor&action=edit&id='.$saved); } else { // reroute to empty form header('location: http://'.$_SERVER["SERVER_NAME"].'/index.php?admin_modul=admin_item_editor&action=add_item'); } } // copy else if ($has_id && isset($_GET['mod']) && $_GET['mod'] == 'copy') { $this->item_object->id = $_GET['id']; $this->item_object->copy(); if ($this->item_object->id) { self::save_item_types(); // reroute to form with id in saved header('location: http://'.$_SERVER["SERVER_NAME"].'/index.php?admin_modul=admin_item_editor&action=edit&id='.$this->item_object->id); } else { // reroute to empty form header('location: http://'.$_SERVER["SERVER_NAME"].'/index.php?admin_modul=admin_item_editor&action=add_item'); } } // delete file else if ($has_id && isset($_POST['mod']) && $_POST['mod'] == 'delete_file') { $this->item_object->id = $_POST['id']; $this->item_object->delete_file($_POST['pic_id']); } // upload file else if ($has_id && isset($_POST['mod']) && $_POST['mod'] == 'add_file') { self::upload_file(); return; // FIX: Stop execution after upload to prevent unnecessary processing } // upload file else if ($has_id && isset($_POST['mod']) && $_POST['mod'] == 'get_file_list') { $this->item_object->id = $_POST['id']; $file_list = $this->item_object->get_file_list(0); $this->layout_object->assign('file_list', $file_list); self::get_item_variants($_POST['id']); return $this->layout_object->fetch('admin_item_editor_filelist.tpl'); } // sort images else if ($has_id && isset($_POST['mod']) && $_POST['mod'] == 'sort_image_list') { $this->item_object->id = $_POST['id']; $this->item_object->sort_image_list($_POST['pics']); return; } // read else if ($has_id && isset($_POST['mod']) && $_POST['mod'] == 'remove_default_image') { $this->item_object->id = $_POST['id']; $this->item_object->remove_default_image(); return; } // remove default image else if ($has_id && !$is_submitted && (!isset($_GET['mod']) || $_GET['mod'] != 'delete')) { // template variable name $this->item_object->id = $_GET['id']; $data = $this->item_object->get_data(1, false); if ($data->variant_price_type == 1) { $this->layout_object->assign('default_variant_price_type', '1'); } else { $this->layout_object->assign('default_variant_price_type', '0'); } if (!empty($data->available_from) && $data->available_from != '0000-00-00') { $tmp = explode('-', $data->available_from); $data->available_from = (count($tmp) === 3) ? $tmp[2].'.'.$tmp[1].'.'.$tmp[0] : ''; } else { $data->available_from = ''; } if (!empty($data->available_till) && $data->available_till != '0000-00-00') { $tmp = explode('-', $data->available_till); $data->available_till = (count($tmp) === 3) ? $tmp[2].'.'.$tmp[1].'.'.$tmp[0] : ''; } else { $data->available_till = ''; } // Ensure last_change_user is always an object if (!isset($data->last_change_user) || $data->last_change_user === null) { $data->last_change_user = new stdClass(); $data->last_change_user->firstname = ''; $data->last_change_user->surname = ''; } // Clean up files array - remove any false/null entries if (isset($data->files) && is_array($data->files)) { $data->files = array_filter($data->files, function($file) { return $file !== false && $file !== null && is_object($file); }); // Re-index array to ensure proper iteration $data->files = array_values($data->files); } else { $data->files = array(); } $this->layout_object->assign('item_data', $data); $this->layout_object->assign('item_structure_assignment', $this->item_object->getStructureAssignment()); // Load file list for item $file_list = $this->item_object->get_file_list(0); if (!$file_list || !is_array($file_list)) { $file_list = array(); // Fallback to empty array if false or not array } else { // Filter out any false/null entries from the array $file_list = array_filter($file_list, function($file) { return $file !== false && $file !== null && is_object($file); }); } $this->layout_object->assign('file_list', $file_list); } else if ($has_id && $is_submitted && (!isset($_GET['mod']) || $_GET['mod'] != 'delete')) { // update self::save_item_types(); self::upload_file(); $this->item_object->id = $_POST['id']; $form_data = $this->item_object ->data_filter($_POST['form_field']); // Only set structure_id to 0 for NEW items, not for existing ones if (!isset($form_data['structure_id']) && !$_POST['id']) { $form_data['structure_id'] = 0; } // DEBUG: Log before price update (silent logging only) // DISABLED: error_log("DEBUG PRICE UPDATE: Starting update for item ID: " . $this->item_object->id); // DISABLED: error_log("DEBUG PRICE UPDATE: Form data: " . print_r($form_data, true)); // DISABLED: error_log("DEBUG PRICE UPDATE: Price data: " . print_r($_POST['form_field_prices'], true)); try { $this->item_object->update($form_data, $_POST['form_field_prices']); // DISABLED: error_log("DEBUG PRICE UPDATE: Update completed successfully"); // Preserve the active tab if we came from documents tab $redirect_url = $_SERVER['HTTP_REFERER']; if (strpos($redirect_url, '#documents') === false && isset($_POST['active_tab']) && $_POST['active_tab'] == 'documents') { $redirect_url .= '#documents'; } header('location: '.$redirect_url); } catch (Exception $e) { // DISABLED: error_log("DEBUG PRICE UPDATE: FATAL ERROR - " . $e->getMessage()); // DISABLED: error_log("DEBUG PRICE UPDATE: Stack trace: " . $e->getTraceAsString()); // Silent redirect to prevent user seeing error header('location: '.$_SERVER['HTTP_REFERER']); } } else if ($has_id && isset($_GET['mod']) && $_GET['mod'] == 'delete') { // delete $this->item_object ->id = $_GET['id']; $this->item_object ->delete(); } else { // new item $config_object = new Config($this->base_object); if ($config_object->is_set('variant_price_type')) { if ($config_object->get_value('variant_price_type') == 'additional_charge') { $this->layout_object->assign('default_variant_price_type', '1'); } } else { $this->layout_object->assign('default_variant_price_type', '0'); } $this->layout_object->assign('default_shippable', '1'); $this->layout_object->assign('default_price_type', '1'); $this->layout_object->assign('default_state', '1'); // Standardmäßig "Preis zeigen" Sektion bei Neuanlage aktiviert $this->layout_object->assign('show_price_and_marketing', 1); } // set document path $document_path = str_replace('//', '/', './web/'.SHOP_SYSTEM.'/documents/article/'); $this->layout_object->assign('document_path', $document_path); // get manufacturer $manufacturer_object = new Manufacturer($this->base_object); $manufacturers = $manufacturer_object->get_all(); $this->layout_object->assign('manufacturers', $manufacturers); // get tax $tax_object = new Tax($this->base_object); $taxes = $tax_object->get_all(); $this->layout_object->assign('taxes', $taxes); // get structure $structure_object = new Structure($this->base_object); $structure_tree = $structure_object->get_all_tree_full_path(null, '/'); //echo '
';print_r($structure_tree);
$this->layout_object->assign('structure_tree', $structure_tree);
// get schema
$schemas = $this->item_object ->get_all_item_schemas();
$this->layout_object->assign('schemas', $schemas);
// get customer groups
$customerGroups_object = new Customer_group($this->base_object);
$customerGroups = $customerGroups_object->get_all_price_groups();
$groups = array();
foreach ($customerGroups as $group) {
if ($id) {
$group->prices = $this->item_object->getPricesForCustomerGroup($group->id);
} else {
// For new items, create empty prices object
$group->prices = new stdClass();
$group->prices->graduated_prices = false;
// Manually add all price properties with numeric defaults (for calculations)
$group->prices->price_1 = 0; $group->prices->quantity_1 = 1; $group->prices->bargain_price_1 = 0;
$group->prices->price_2 = 0; $group->prices->quantity_2 = 0; $group->prices->bargain_price_2 = 0;
$group->prices->price_3 = 0; $group->prices->quantity_3 = 0; $group->prices->bargain_price_3 = 0;
$group->prices->price_4 = 0; $group->prices->quantity_4 = 0; $group->prices->bargain_price_4 = 0;
$group->prices->price_5 = 0; $group->prices->quantity_5 = 0; $group->prices->bargain_price_5 = 0;
}
$groups[] = $group;
}
$this->layout_object->assign('customerGroups', $groups);
// get accessories
if ($id) {
$item_items = $this->item_object ->get_all_item_items(1, $id, 1);
$this->layout_object->assign('item_items', $item_items);
$item_items2 = $this->item_object ->get_all_item_items(2, $id, 1);
$this->layout_object->assign('item_items2', $item_items2);
$item_items3 = $this->item_object ->get_all_item_items(3, $id, 1);
$this->layout_object->assign('item_items3', $item_items3);
}
// get accessories childs
if ($id) {
$item_items = $this->item_object ->get_all_item_items(1, $id, 0);
$this->layout_object->assign('item_item_child', $item_items);
$item_items2 = $this->item_object ->get_all_item_items(2, $id, 0);
$this->layout_object->assign('item_item_child2', $item_items2);
$item_items3 = $this->item_object ->get_all_item_items(3, $id, 0);
$this->layout_object->assign('item_item_child3', $item_items3);
}
// get shipping areas
$shipping_area_object = new Shipping_area($this->base_object);
$shipping_areas = $shipping_area_object->get_all();
$this->layout_object->assign('shipping_areas', $shipping_areas);
// get google item categories
$google_item_categories1 = $this->item_object ->get_all_google_item_categories();
$this->layout_object->assign('google_item_categories1', $google_item_categories1);
// get item type definitions
$item_type_definitions = self::get_item_type_definitions();
$this->layout_object->assign('item_type_definitions', $item_type_definitions);
// get item types
if ($this->item_object) {
$item_types = $this->item_object->get_item_types();
} else {
$item_types = array(); // For new items
}
$this->layout_object->assign('item_types', $item_types);
// item opinion
if ($id) {
$opinion = $this->item_object->get_opinion_list($id);
$this->layout_object->assign('item_opinion', $opinion);
}
// item inventory
if ($id) {
$inventory_object = new ItemInventory($this->base_object);
$inventory = $inventory_object->get_all_item_inventory($id);
$price_sum_output = 0;
$price_sum_input = 0;
foreach ($inventory as $item_inventory) {
if ($item_inventory->inventory_object_type_id == 2) {
$price_sum_input += $item_inventory->price_sum;
} else {
$price_sum_output += $item_inventory->price_sum;
}
}
$this->layout_object->assign('item_inventory_stats', array('price_sum_input' => $price_sum_input, 'price_sum_output' => $price_sum_output));
$this->layout_object->assign('item_inventory', $inventory);
}
// get variant configuration
include './web/'.SHOP_SYSTEM.'/config/item_variant_schema.inc.php';
$this->layout_object->assign('item_variant_config', $item_fields);
// Ensure item_data is always set (default values for new items)
if (!$this->layout_object->getTemplateVars('item_data')) {
// Create comprehensive default item object with all needed properties
$default_item_data = new stdClass();
$default_item_data->id = '';
$default_item_data->parent_id = 0;
$default_item_data->structure_id = 0;
$default_item_data->schema_id = 0;
$default_item_data->manufacturer_id = 0;
$default_item_data->name = '';
$default_item_data->name_en = '';
$default_item_data->number = '';
$default_item_data->tax_id = 0;
$default_item_data->short_description = '';
$default_item_data->short_description_en = '';
$default_item_data->detail_description = '';
$default_item_data->detail_description_en = '';
$default_item_data->manufacturer_item_number = '';
$default_item_data->default_image_file_name = '';
$default_item_data->seo_title = '';
$default_item_data->seo_description = '';
$default_item_data->seo_keywords = '';
$default_item_data->short_uri = '';
$default_item_data->ean_code = '';
$default_item_data->price_type = '';
$default_item_data->shipping_cost_type = '';
$default_item_data->shipping_item_type = '';
$default_item_data->shipping_weight = '';
$default_item_data->available_from = '';
$default_item_data->available_till = '';
$default_item_data->base_price = '';
$default_item_data->buy_quantity = '';
$default_item_data->google_product_category = '';
$default_item_data->inventory_min = '';
$default_item_data->inventory_number = '';
$default_item_data->inventory_order_quantity = '';
$default_item_data->inventory_rack_number = '';
$default_item_data->min_quantity = '';
$default_item_data->price_je_vpe = '';
$default_prices = new stdClass();
$default_prices->value = 0;
$default_item_data->prices = $default_prices;
$default_item_data->uvp = '';
$default_item_data->uvp_netto = '';
$default_item_data->vpe_amount = '';
$default_item_data->vpe_unit = '';
$default_item_data->youtube_video = '';
$default_item_data->vendor_id = 0;
$default_item_data->vendor_item_number = '';
$default_item_data->price_1 = '';
$default_item_data->has_user_data = 0;
$default_item_data->shippable = 1;
$default_item_data->shippable_inventory = 1;
$default_item_data->bargain_price_type = 0;
// Create empty last_change_user object for new items
$default_last_change_user = new stdClass();
$default_last_change_user->firstname = '';
$default_last_change_user->surname = '';
$default_item_data->last_change_user = $default_last_change_user;
$default_item_data->last_change_date = '';
$default_item_data->schema_data_attributes = array();
$default_item_data->variant_structure = array();
$this->layout_object->assign('item_data', $default_item_data);
}
// Ensure message variables are always set as arrays
if (!$this->layout_object->getTemplateVars('warning_message')) {
$this->layout_object->assign('warning_message', array());
}
if (!$this->layout_object->getTemplateVars('error_message')) {
$this->layout_object->assign('error_message', array());
}
if (!$this->layout_object->getTemplateVars('info_message')) {
$this->layout_object->assign('info_message', array());
}
// Ensure item_structure_assignment is always set
if (!$this->layout_object->getTemplateVars('item_structure_assignment')) {
$this->layout_object->assign('item_structure_assignment', array());
}
// Ensure itemsTax is always set as numeric value for calculations
if (!$this->layout_object->getTemplateVars('itemsTax')) {
$this->layout_object->assign('itemsTax', 0);
}
// Ensure item_types is always set as array
if (!$this->layout_object->getTemplateVars('item_types')) {
$this->layout_object->assign('item_types', array());
}
// Ensure all show_* variables are set as integers for template conditions
$show_vars = ['show_price_and_marketing', 'show_attributes', 'show_versand', 'show_seo', 'show_lager', 'show_price_variants'];
foreach ($show_vars as $var_name) {
if (!$this->layout_object->getTemplateVars($var_name)) {
$this->layout_object->assign($var_name, 0);
}
}
// Ensure base_dir and info object are set for all icon paths
if (!$this->layout_object->getTemplateVars('base_dir')) {
$this->layout_object->assign('base_dir', '.');
}
if (!$this->layout_object->getTemplateVars('info')) {
$info = new stdClass();
$info->base_url = '.';
$this->layout_object->assign('info', $info);
}
return $this->layout_object->fetch('admin_item_editor.tpl');
}
private function save_item_types() {
$this->db->autocommit(false);
self::update_item_types();
self::insert_item_types();
self::delete_item_types();
$result = $this->db->commit();
$this->db->autocommit(true);
} // end save_item_types
private function update_item_types() {
if (!isset($_POST['item_type'])) {
return; // No item_type data to update
}
$data = $_POST['item_type'];
$len = (isset($data['item_type_id']) && is_array($data['item_type_id'])) ? count($data['item_type_id']) : 0;
for ($i = 0; $i < $len; $i++) {
if ($data['item_type_id'][$i] != '') {
if (!$data['item_type_available_from'][$i]) {
$data['item_type_available_from'][$i] = '0000-00-00';
}
if (!$data['item_type_available_until'][$i]) {
$data['item_type_available_until'][$i] = '0000-00-00';
}
$sql = 'UPDATE
item_types
SET
item_type_definition_id='.$this->db->real_escape_string($data['item_type_definition_id'][$i]);
$sql .= " , item_type_text='".$this->db->real_escape_string($data['item_type_text'][$i])."'";
$sql .= " , item_type_available_from='".$this->db->real_escape_string($data['item_type_available_from'][$i])."'";
$sql .= " , item_type_available_until='".$this->db->real_escape_string($data['item_type_available_until'][$i])."'";
$sql .= ' WHERE item_type_id='.$this->db->real_escape_string($data['item_type_id'][$i]);
$sql .= ' AND item_id='.$this->id;
$this->db->query($sql);
}
}
} // end update_item_types
private function insert_item_types() {
if (!isset($_POST['item_type'])) {
return; // No item_type data to insert
}
$data = $_POST['item_type'];
$len = (isset($data['item_type_id']) && is_array($data['item_type_id'])) ? count($data['item_type_id']) : 0;
$sql = 'INSERT INTO item_types (item_id, item_type_definition_id, item_type_text, item_type_available_from, item_type_available_until) VALUES ';
$first = true;
for ($i = 0; $i < $len; $i++) {
if ($data['item_type_id'][$i] == '') {
if ($first) {
$first = false;
} else {
$sql .= ', ';
}
// Fix: Check if array keys exist before accessing them
if (!isset($data['item_type_available_from'][$i]) || !$data['item_type_available_from'][$i]) {
$data['item_type_available_from'][$i] = '0000-00-00';
}
if (!isset($data['item_type_available_until'][$i]) || !$data['item_type_available_until'][$i]) {
$data['item_type_available_until'][$i] = '0000-00-00';
}
$sql .= " ('".
$this->db->real_escape_string($this->id)."', '".
$this->db->real_escape_string($data['item_type_definition_id'][$i])."', '".
$this->db->real_escape_string($data['item_type_text'][$i] ?? '')."', '".
$this->db->real_escape_string($data['item_type_available_from'][$i])."', '".
$this->db->real_escape_string($data['item_type_available_until'][$i])."') ";
}
}
if (!$first) {
$this->db->query($sql);
}
return '';
} // end insert_item_types
private function delete_item_types() {
if (isset($_POST['deletable_item_types'])) {
$data = implode(', ', $_POST['deletable_item_types']);
$sql = 'DELETE FROM
item_types
WHERE
item_type_id IN ('.$data.')
AND
item_id='.$this->id.';';
$this->db->query($sql);
}
} // end delete_item_types
private function get_item_type_definitions() {
$sql = 'SELECT
*
FROM
item_type_definitions';
$result = $this->db->query($sql);
if ($result->num_rows > 0) {
$data = array();
while ($obj = $result->fetch_object()) {
$data[] = $obj;
}
return $data;
}
return false;
} // end get_item_type_definitions
private function add_item_type() {
$item_type_definitions = self::get_item_type_definitions();
$this->layout_object->assign('item_type_definitions', $item_type_definitions);
// Create empty item_type object for new item type
$item_type = new stdClass();
$item_type->item_type_ordering = '';
$item_type->item_type_id = '';
$item_type->item_type_definition_id = '';
$item_type->item_type_text = '';
$item_type->item_type_definition_type = 0;
$item_type->item_type_available_from = '';
$item_type->item_type_available_until = '';
$this->layout_object->assign('item_type', $item_type);
// Ensure all show_* variables are set for snippet template
$show_vars = ['show_price_and_marketing', 'show_attributes', 'show_versand', 'show_seo', 'show_lager', 'show_price_variants'];
foreach ($show_vars as $var_name) {
if (!$this->layout_object->getTemplateVars($var_name)) {
$this->layout_object->assign($var_name, 0);
}
}
// Ensure base_dir and info object are set for icon paths in snippet template
if (!$this->layout_object->getTemplateVars('base_dir')) {
$this->layout_object->assign('base_dir', '.');
}
if (!$this->layout_object->getTemplateVars('info')) {
$info = new stdClass();
$info->base_url = '.';
$this->layout_object->assign('info', $info);
}
echo $this->layout_object->fetch('snipet_item_type.tpl');
exit();
} // end add_item_type
protected function rename_item_document() {
if (isset($_POST['document_id']) && isset($_POST['new_name'])) {
$document_id = $_POST['document_id'];
$new_name = $_POST['new_name'];
if ($new_name != '') {
if (!stristr('.pdf', $new_name)) {
$new_name.'.pdf';
}
$sql = "UPDATE
item_files
SET
alt='".$this->db->real_escape_string($new_name)."'
WHERE
id=".$this->db->real_escape_string($document_id);
$this->db->query($sql);
}
}
echo " ";
exit();
}
protected function delete_item_document() {
if (isset($_POST['document_id']) && isset($_POST['item_id'])) {
$item_id = $_POST['item_id'];
$document_id = $_POST['document_id'];
$result = $this->item_object->delete_file($document_id, $item_id);
if ($result) {
$return_array = array('status' => 'success');
} else {
$return_array = array('status' => 'error');
}
} else {
$return_array = array('status' => 'error');
}
echo json_encode($return_array);
exit();
}
protected function upload_file() {
// DEBUG: Log upload attempt mit Timestamps
$debug_log = '/var/www/vhosts/intelectra.de/httpdocs/logs/upload_debug.log';
$start = microtime(true);
file_put_contents($debug_log, date('Y-m-d H:i:s') . " === UPLOAD_FILE START ===\n", FILE_APPEND);
file_put_contents($debug_log, date('Y-m-d H:i:s') . " POST submit: " . (isset($_POST['submit']) ? $_POST['submit'] : 'NOT SET') . "\n", FILE_APPEND);
file_put_contents($debug_log, date('Y-m-d H:i:s') . " FILES name: " . (isset($_FILES['Filedata']['name']) ? $_FILES['Filedata']['name'] : 'NOT SET') . "\n", FILE_APPEND);
file_put_contents($debug_log, date('Y-m-d H:i:s') . " FILES size: " . (isset($_FILES['Filedata']['size']) ? $_FILES['Filedata']['size'] : 'NOT SET') . "\n", FILE_APPEND);
file_put_contents($debug_log, date('Y-m-d H:i:s') . " FILES tmp_name: " . (isset($_FILES['Filedata']['tmp_name']) ? $_FILES['Filedata']['tmp_name'] : 'NOT SET') . "\n", FILE_APPEND);
file_put_contents($debug_log, date('Y-m-d H:i:s') . " Item ID: " . (isset($_POST['id']) ? $_POST['id'] : 'NOT SET') . "\n", FILE_APPEND);
$this->item_object->id = $_POST['id'];
if ($_FILES['Filedata']['tmp_name'] != "") { // check if a file has been set
file_put_contents($debug_log, date('Y-m-d H:i:s') . " [1] File found, starting processing...\n", FILE_APPEND);
if (substr($_FILES['Filedata']['name'], -3) == 'pdf') { // check if file is pdf
file_put_contents($debug_log, date('Y-m-d H:i:s') . " [2] PDF detected, calling add_uploaded_pdf\n", FILE_APPEND);
$return_object = $this->item_object ->add_uploaded_pdf($_FILES);
} else {
file_put_contents($debug_log, date('Y-m-d H:i:s') . " [2] Image detected, calling add_uploaded_file\n", FILE_APPEND);
$return_object = $this->item_object ->add_uploaded_file($_FILES, $_POST['watermark_activ']);
}
file_put_contents($debug_log, date('Y-m-d H:i:s') . " [3] Upload function returned: " . ($return_object ? 'SUCCESS' : 'FAILED') . "\n", FILE_APPEND);
if ($return_object) {
$return_data = array('status' => 'success', 'data' => $return_object);
} else {
$return_data = array('status' => 'error');
}
// 🔥 FIX: Bei Datei-Upload sofort Response senden und beenden!
file_put_contents($debug_log, date('Y-m-d H:i:s') . " [4] Checking exit - submit=" . $_POST['submit'] . "\n", FILE_APPEND);
if (isset($_POST['submit']) && $_POST['submit'] == 'Datei hochladen') {
$elapsed = round((microtime(true) - $start) * 1000, 2);
file_put_contents($debug_log, date('Y-m-d H:i:s') . " [5] EXIT - redirecting! (took {$elapsed}ms)\n", FILE_APPEND);
header('Location: ./index.php?admin_modul=admin_item_editor&id=' . $this->item_object->id);
exit();
}
file_put_contents($debug_log, date('Y-m-d H:i:s') . " [5] NO EXIT - continuing to update()!\n", FILE_APPEND);
}
return;
}
private function get_item_variants($item_id) {
$sql = "SELECT
items.*,
item_schema.selectable_attribute_1,
item_schema.selectable_attribute_2
FROM
items
LEFT JOIN
item_schema
ON
items.schema_id = item_schema.id
WHERE
items.id=".$this->db->real_escape_string($item_id);
$request = $this->db->query($sql);
$attributes_array_1 = false;
$attributes_array_2 = false;
$return_array = false;
if ($request->num_rows > 0) {
$data = $request->fetch_object();
if (isset($data->selectable_attribute_1) && $data->selectable_attribute_1 != '0') {
$attributes_array_1 = explode(';', $data->{'attribute_'.$data->selectable_attribute_1});
$this->layout_object->assign('item_variants_1', $attributes_array_1);
}
if (isset($data->selectable_attribute_2) && $data->selectable_attribute_2 != '0') {
$attributes_array_2 = explode(';', $data->{'attribute_'.$data->selectable_attribute_2});
$this->layout_object->assign('item_variants_2', $attributes_array_2);
}
}
} // end get_item_variants
}
?>