settingClass(); $tenantId = $request->tenantId(); if (!class_exists($settingClass)) { return $this->response([ 'success' => false, 'error' => __eva('Invalid setting name') ]); } return $this->response([ 'config' => $settingClass::configuration($request), 'tenantId' => $request->tenantId(), ]); } public function items(AppSettingsRequest $request, $settingName = null) { //ray('GET ITEMS CONTROLLER'); $settingClass = $request->settingClass(); $tenantId = $request->tenantId(); $parents_class = class_parents($settingClass); // SINGLE SETTING required -> for a simple settings I only have one item so return directly the fields // GROUP OF SINGLE SETTINGS required --> adds a level of grouping the fields if (in_array(SettingSimple::class, $parents_class) || in_array(SettingSimpleGrouped::class, $parents_class) || in_array(SettingsSimpleGroupedBoxes::class, $parents_class) ) { $tenantField = evavel_tenant_field(); $setting = $settingClass::where($tenantField, $tenantId)->first(); // Create on the fly if it does not exist yet if (!$setting) { $setting = new $settingClass; $field_tenant_id = evavel_tenant_field(); $setting->{$field_tenant_id} = $request->tenantId(); $setting->setupDefaultValues()->save(); } $response = [ 'id' => $setting->id, 'name' => $setting->settingName(), ]; if (in_array(SettingSimple::class, $parents_class)) { $response['fields'] = $setting->fields(); } if (in_array(SettingSimpleGrouped::class, $parents_class)) { $response['items'] = $setting->listItems(); $response['componentListItem'] = $settingClass::$component_list_item; } if (in_array(SettingsSimpleGroupedBoxes::class, $parents_class)) { $response['items'] = $setting->listItems(); $response['componentListItem'] = $settingClass::$component_list_item; } $response['success'] = true; return $this->response($response); } // LISTING OF SETTINGS THAT CAN BE CREATED AND DELETED else if (in_array(SettingListing::class, $parents_class)) { $tenantField = evavel_tenant_field(); $items = $settingClass::where($tenantField, $tenantId) ->orderBy('date_created', 'ASC') ->get() ->toArray(); return $this->response([ 'success' => true, 'componentListItem' => $settingClass::$component_list_item, 'items' => $settingClass::where($tenantField, $tenantId)->orderBy('date_created', 'ASC')->get()->toArray(), 'description' => $settingClass::description() //'errors' => $settingClass::validateAll() ]); } // CUSTOM SETTING with custom component else if (in_array(SettingCustomized::class, $parents_class)) { return $this->response([ 'success' => true, 'settingId' => $settingClass::getId($tenantId), 'items' => $settingClass::getItems($request, $tenantId), 'label' => $settingClass::label() ]); } } public function listing(AppSettingsRequest $request, $settingName) { $settingClass = $request->settingClass(); $tenantId = $request->tenantId(); if (method_exists($settingClass, 'getListing')){ return $this->response(['items' => $settingClass::getListing($tenantId)]); } return $this->response(['items' => []]); } public function create(AppSettingsRequest $request, $settingName) { $settingClass = $request->settingClass(); // Auhorization $permission_name = false; $permission_message = false; // Extended function to check permissions $data = ['permission_name' => $permission_name, 'permission_message' => $permission_message]; foreach(self::$authorize_create as $func) { $data = $func[0]->{$func[1]}($settingClass, $data); } $permission_name = $data['permission_name']; $permission_message = $data['permission_message']; // Check the appropiate permission if ($permission_name){ $user = Eva::make('user'); if (!$user->canCreate($permission_name, $request->tenantId())) { return $this->response([ 'success' => false, 'error' => $permission_message]); } } // Create setting $setting = new $settingClass; $field_tenant_id = evavel_tenant_field(); $setting->{$field_tenant_id} = $request->tenantId(); $setting->setupDefaultValues()->save(); return $this->response(['success' => true, 'item' => $setting]); } /** * Get the fields with values for an item * * @param AppSettingsRequest $request * @param $settingName * @param $settingId * * @return \WP_REST_Response */ public function get(AppSettingsRequest $request, $settingName, $settingId) { $settingClass = $request->settingClass(); $setting = $settingClass::find($settingId); $response = [ 'fields' => $setting->fields(), 'error' => $setting->validate(), ]; return $this->response($response); } public function update(AppSettingsRequest $request, $settingName, $settingId) { $settingClass = $request->settingClass(); // Auhorization $permission_name = false; $permission_message = false; // Extended function to check permissions $data = ['permission_name' => $permission_name, 'permission_message' => $permission_message]; foreach(self::$authorize_update as $func) { $data = $func[0]->{$func[1]}($settingClass, $data); } $permission_name = $data['permission_name']; $permission_message = $data['permission_message']; // Check the appropiate permission if ($permission_name){ $user = Eva::make('user'); if (!$user->canEdit($permission_name, $request->tenantId())) { return $this->response([ 'success' => false, 'error' => $permission_message]); } } $setting = $settingClass::find($settingId); $params = $request->body_params; foreach($params as $key => $value) { //$value = str_replace("\\", "\", $value); //ray($key. ' => ' . $value); // Is textarea ? if (preg_match("#\n#", $value)) { $value = preg_replace('/\r/u', '', $value); $value = preg_replace('/\n/u', '
', $value); $setting->{$key} = $value; } // String with \n inside is a json string coming from the email templates // where 1 field is actually many fields inside for the different languages else if (strpos($value, '\n') !== false) { $value = str_replace('\n', '
', $value); $new_value = evavel_json_decode($value); $setting->{$key} = $new_value; } else { $new_value = evavel_json_decode($value); $setting->{$key} = $new_value; } } // Check rules before saving $errors = $setting->validate(); // I save even if errors because for shifts // I need to overlap same dates but different areas $setting->save(); $response = ['success' => true, 'item' => $setting->toArray()]; if (!empty($errors)){ //return $this->response(['success' => false, 'error' => $errors]); $response['warning'] = $errors; } // Add something else? if (method_exists($setting, 'addToUpdateResponse')){ $response = $setting->addToUpdateResponse($response); } return $this->response($response); } public function delete(AppSettingsRequest $request, $settingName, $settingId) { $settingClass = $request->settingClass(); // Auhorization $permission_name = false; $permission_message = false; // Extended function to check permissions $data = ['permission_name' => $permission_name, 'permission_message' => $permission_message]; foreach(self::$authorize_delete as $func) { $data = $func[0]->{$func[1]}($settingClass, $data); } $permission_name = $data['permission_name']; $permission_message = $data['permission_message']; // Check the appropiate permission if ($permission_name){ $user = Eva::make('user'); if (!$user->canDelete($permission_name, $request->tenantId())) { return $this->response([ 'success' => false, 'error' => $permission_message]); } } $table = $settingClass::$table_name; Query::table($table) ->where('id', $settingId) ->delete(); return $this->response(['success' => true, 'settingName' => $settingName, 'settingId' => $settingId]); } public function duplicate(AppSettingsRequest $request, $settingName, $settingId) { $settingClass = $request->settingClass(); $service = null; // @TODO Esto es especifico de la Aplicacion if (str_contains($settingClass, 'Shift')) { $service = evavel_shift_class()::find($settingId); } else if (str_contains($settingClass, 'Event')) { $service = evavel_event_class()::find($settingId); } else if (str_contains($settingClass, 'Offer')) { $service = $settingClass::find($settingId); } if ($service) { $table_name = $settingClass::$table_name; $field = evavel_tenant_field(); Query::table($table_name)->insert([ $field => $service->{$field}, 'meta_key' => $service->meta_key, 'meta_value' => $service->original['meta_value'] ]); } return $this->response(['success' => true, 'settingName' => $settingName, 'settingId' => $settingId]); } public function ordering(AppSettingsRequest $request, $settingName) { $ordering = json_decode($request->ordering); $table = evavel_tenant_setting_table(); foreach($ordering as $key => $value){ Query::table($table) ->where('id', $key) ->update(['ordering' => $value]); } return $this->response(['success' => true]); } // Preview email HTML for the setting Email Templates public function preview(AppSettingsRequest $request, $settingName, $settingId) { if ($settingName == 'email_templates') { return $this->previewEmail($request, $settingName, $settingId, evavel_app_email_template_class()::find($settingId)); } else if ($settingName == 'email_reminders') { return $this->previewEmail($request, $settingName, $settingId, evavel_app_email_reminder_class()::find($settingId)); } else if ($settingName == 'email_custom') { return $this->previewEmail($request, $settingName, $settingId, evavel_app_email_custom_class()::find($settingId)); } else { return $this->response([ 'success' => false, 'error' => __eva('Invalid setting name') ]); } } public function previewEmail(AppSettingsRequest $request, $settingName, $settingId, $emailTemplate) { if (!$emailTemplate) { return $this->response([ 'success' => false, 'error' => __eva('Invalid template') ]); } $lang = $request->lang; $attribute = $request->attribute; $content_base64 = $emailTemplate->{$attribute}['content_'.$lang]; $content = base64_decode($content_base64); $tenantField = evavel_tenant_field(); $class_mailManager = evavel_app_email_manager_class(); $restaurant_id = intval($emailTemplate->{$tenantField}); $mm = new $class_mailManager($restaurant_id); $message = $mm->messageFormatted($content); // Fill with some booking data $booking = Booking::where('restaurant_id', $restaurant_id)->first(); if ($booking) { $message = $booking->parseEmailTags($message, $lang); } $message .= ''; return $this->response([ 'success' => true, 'html' => $message ]); } }