middleware('auth'); $this->_service = 'vgreet'; $this->_module = 'video'; $this->_viewname = 'videocustomization'; $this->_title = 'Video Customization'; $this->_base_url = '/videocustomization'; } protected function get_list_fields(){ return [ 'actions' => ['title' => 'Actions', 'buttons' => [ 'edit', 'delete' ] ], 'title' => ['title' => 'Title', 'type' => 'text'], 'customization_type' => ['title' => 'Customization Type', 'type' => 'text'], 'status' => ['title' => 'Status', 'type' => 'select'], ]; } protected function get_customization_types() { return [ 'video_frame' => [ 'fields' => [ 'orientation' => ['title' => 'Orientation', 'type' => 'select', 'required' => true, 'values' => ['portrait' => 'Portrait', 'landscape' => 'Landscape', 'both' => 'Both'], 'onchange' => 'showOrientationFields', 'fullwidth'=>'yes'], 'portrait_video_width' => ['title' => 'Portrait Video Width', 'type' => 'number', 'required' => false], 'portrait_video_height' => ['title' => 'Portrait Video Height', 'type' => 'number', 'required' => false], 'landscape_video_width' => ['title' => 'Landscape Video Width', 'type' => 'number', 'required' => false], 'landscape_video_height' => ['title' => 'Landscape Video Height', 'type' => 'number', 'required' => false], 'portrait_frame_image' => ['title' => 'Portrait Frame Image', 'type' => 'image'], 'landscape_frame_image' => ['title' => 'Landscape Frame Image', 'type' => 'image'], 'personalization' => ['title' => 'Personalization (JSON)', 'type' => 'textarea', 'required' => false], ], 'title' => 'Video Frame' ], // Add more customization types here in the future // 'Watermark' => [ // 'fields' => [ // 'watermark_image' => ['title' => 'Watermark Image', 'type' => 'image'], // 'position' => ['title' => 'Position', 'type' => 'select', 'values' => [...]], // ] // ], ]; } protected function get_form_fields($type, $values){ // Extract customization params if editing $customizationParams = []; $currentCustomizationType = $values->customization_type ?? ''; if(isset($values->customization_params)) { if(is_string($values->customization_params)) { $customizationParams = json_decode($values->customization_params, true); } elseif(is_object($values->customization_params)) { // Recursively convert object to array $customizationParams = json_decode(json_encode($values->customization_params), true); } elseif(is_array($values->customization_params)) { $customizationParams = $values->customization_params; } // If customization_type is empty but we have a type in params, use it if(empty($currentCustomizationType) && isset($customizationParams['type'])) { $currentCustomizationType = $customizationParams['type']; } } // Get available customization types $customizationTypes = $this->get_customization_types(); $customizationTypeOptions = []; foreach($customizationTypes as $typeKey => $typeConfig) { $customizationTypeOptions[$typeKey] = $typeConfig['title']; } // Get orientation value for video_frame type $orientationValue = 'both'; if($currentCustomizationType == 'video_frame' && isset($customizationParams['orientation'])) { $orientationValue = is_object($customizationParams['orientation']) ? (string)$customizationParams['orientation'] : $customizationParams['orientation']; } $fields = [ 'title' => ['title' => 'Title', 'type' => 'text', 'required' => true, 'fullwidth'=>true], 'customization_type' => ['title' => 'Customization Type', 'type' => 'select', 'required' => true, 'values' => $customizationTypeOptions, 'value' => $currentCustomizationType, 'onchange' => 'showCustomizationFields'], 'status' => ['title' => 'Status', 'type' => 'select', 'required' => true, 'values' => ['active' => 'Active', 'disabled' => 'Disabled']], 'orientation' => [ 'title' => 'Orientation', 'type' => 'select', 'required' => false, 'values' => ['portrait' => 'Portrait', 'landscape' => 'Landscape', 'both' => 'Both'], 'value' => $orientationValue, 'onchange' => 'showOrientationFields', 'class' => 'customization-field video-frame-field', 'style' => ($currentCustomizationType == 'video_frame') ? '' : 'display:none;' ], ]; // Add fields for each customization type foreach($customizationTypes as $typeKey => $typeConfig) { $typeClass = strtolower(str_replace('_', '-', $typeKey)) . '-field'; $isVisible = ($currentCustomizationType == $typeKey); foreach($typeConfig['fields'] as $fieldKey => $fieldConfig) { // Skip orientation as it's already added above if($fieldKey == 'orientation') { continue; } // Get value from customization params $fieldValue = ''; if($typeKey == 'video_frame') { switch($fieldKey) { case 'portrait_video_width': $fieldValue = ''; if(isset($customizationParams['portrait_video_dimensions'])) { $dims = $customizationParams['portrait_video_dimensions']; if(is_array($dims) && isset($dims['width'])) { $fieldValue = $dims['width']; } elseif(is_object($dims) && isset($dims->width)) { $fieldValue = $dims->width; } } break; case 'portrait_video_height': $fieldValue = ''; if(isset($customizationParams['portrait_video_dimensions'])) { $dims = $customizationParams['portrait_video_dimensions']; if(is_array($dims) && isset($dims['height'])) { $fieldValue = $dims['height']; } elseif(is_object($dims) && isset($dims->height)) { $fieldValue = $dims->height; } } break; case 'landscape_video_width': $fieldValue = ''; if(isset($customizationParams['landscape_video_dimensions'])) { $dims = $customizationParams['landscape_video_dimensions']; if(is_array($dims) && isset($dims['width'])) { $fieldValue = $dims['width']; } elseif(is_object($dims) && isset($dims->width)) { $fieldValue = $dims->width; } } break; case 'landscape_video_height': $fieldValue = ''; if(isset($customizationParams['landscape_video_dimensions'])) { $dims = $customizationParams['landscape_video_dimensions']; if(is_array($dims) && isset($dims['height'])) { $fieldValue = $dims['height']; } elseif(is_object($dims) && isset($dims->height)) { $fieldValue = $dims->height; } } break; case 'portrait_frame_image': case 'landscape_frame_image': $fieldValue = ''; if(isset($customizationParams[$fieldKey])) { $fieldValue = is_object($customizationParams[$fieldKey]) ? (string)$customizationParams[$fieldKey] : $customizationParams[$fieldKey]; } break; case 'personalization': $fieldValue = ''; if(isset($customizationParams['personalization']) && !empty($customizationParams['personalization'])) { $fieldValue = json_encode($customizationParams['personalization'], JSON_PRETTY_PRINT); } break; default: $fieldValue = ''; if(isset($customizationParams[$fieldKey])) { $fieldValue = is_object($customizationParams[$fieldKey]) ? (string)$customizationParams[$fieldKey] : $customizationParams[$fieldKey]; } } } $fields[$fieldKey] = array_merge($fieldConfig, [ 'value' => $fieldValue, 'class' => 'customization-field ' . $typeClass, 'style' => $isVisible ? '' : 'display:none;' ]); } } return $fields; } protected function _beforesave($type, $request) { try { $data = $request->except('_token'); //echo "
"; print_r($data); exit;
// Only process customization params if customization_type is selected
if(!empty($data['customization_type'])) {
$customizationTypes = $this->get_customization_types();
$selectedType = $data['customization_type'];
if(isset($customizationTypes[$selectedType])) {
$typeConfig = $customizationTypes[$selectedType];
$customizationParams = ['type' => $selectedType];
$fieldsToRemove = [];
// Process fields based on customization type
if($selectedType == 'video_frame') {
// Handle image uploads
try {
if ($request->hasFile('portrait_frame_image') && $request->file('portrait_frame_image')->isValid()) {
$uploadedPath = $this->_uploadMedia($request, 'portrait_frame_image', 'vgreet/frames');
if (!empty($uploadedPath)) {
$data['portrait_frame_image'] = $uploadedPath;
} else {
\Log::warning('Portrait frame image upload returned empty path');
// Keep existing value if upload failed
$data['portrait_frame_image'] = $data['portrait_frame_image'] ?? '';
}
} else {
// Keep existing value if not uploading new file
$data['portrait_frame_image'] = $data['portrait_frame_image'] ?? '';
}
} catch (\Exception $e) {
\Log::error('Portrait frame image upload exception: ' . $e->getMessage());
$data['portrait_frame_image'] = $data['portrait_frame_image'] ?? '';
}
try {
if ($request->hasFile('landscape_frame_image') && $request->file('landscape_frame_image')->isValid()) {
$uploadedPath = $this->_uploadMedia($request, 'landscape_frame_image', 'vgreet/frames');
if (!empty($uploadedPath)) {
$data['landscape_frame_image'] = $uploadedPath;
} else {
\Log::warning('Landscape frame image upload returned empty path');
// Keep existing value if upload failed
$data['landscape_frame_image'] = $data['landscape_frame_image'] ?? '';
}
} else {
// Keep existing value if not uploading new file
$data['landscape_frame_image'] = $data['landscape_frame_image'] ?? '';
}
} catch (\Exception $e) {
\Log::error('Landscape frame image upload exception: ' . $e->getMessage());
$data['landscape_frame_image'] = $data['landscape_frame_image'] ?? '';
}
// Store portrait and landscape video dimensions separately
$customizationParams['portrait_video_dimensions'] = [
'width' => (int)($data['portrait_video_width'] ?? 0),
'height' => (int)($data['portrait_video_height'] ?? 0),
];
$customizationParams['landscape_video_dimensions'] = [
'width' => (int)($data['landscape_video_width'] ?? 0),
'height' => (int)($data['landscape_video_height'] ?? 0),
];
$customizationParams['portrait_frame_image'] = $data['portrait_frame_image'] ?? '';
$customizationParams['landscape_frame_image'] = $data['landscape_frame_image'] ?? '';
$customizationParams['orientation'] = $data['orientation'] ?? 'both';
// Handle personalization JSON decoding with error handling
$personalization = [];
if (isset($data['personalization']) && !empty($data['personalization'])) {
$decoded = json_decode($data['personalization'], true);
if (json_last_error() === JSON_ERROR_NONE) {
$personalization = $decoded;
}
}
$customizationParams['personalization'] = $personalization;
// Mark fields for removal
$fieldsToRemove = ['portrait_video_width', 'portrait_video_height', 'landscape_video_width', 'landscape_video_height', 'portrait_frame_image', 'landscape_frame_image', 'orientation', 'personalization'];
}
// Add more customization type processing here in the future
// elseif($selectedType == 'Watermark') {
// // Process watermark fields
// }
$data['customization_params'] = $customizationParams;
// Remove fields that shouldn't be sent to Lambda
foreach($fieldsToRemove as $field) {
unset($data[$field]);
}
}
}
$data['is_active'] = ($data['status'] ?? 'pending') == 'active';
// Debug: uncomment to see final data
return $data;
} catch (\Exception $e) {
// Log the error and return basic data structure
\Log::error('VideoCustomizationController _beforesave error: ' . $e->getMessage());
\Log::error('Stack trace: ' . $e->getTraceAsString());
// Return minimal data to prevent blank page
$data = $request->except('_token');
$data['is_active'] = ($data['status'] ?? 'pending') == 'active';
return $data;
}
}
protected function _beforeform($type, $values) {
//echo ""; print_r($values); exit;
return $values;
}
}