ajax()) {
$user = request()->user();
$subscription_info = [];
if (! $this->isSubscribed($user)) {
$subscription_info = $this->subscriptionExpired();
} elseif (! $this->isQuotaAvailable($user->id)) {
$subscription_info = $this->quotaNotAvailable();
}
$templates = Form::where('is_template', 1)
->where('created_by', $user->id)
->orWhere('is_global_template', 1)
->pluck('name', 'id')
->toArray();
return view('form.create')
->with(compact('templates', 'subscription_info'));
}
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$input = $request->only('name', 'description', 'slug');
$template_id = $request->input('template_id');
$id = $request->input('id');
if (! empty($id) || ! empty($template_id)) {
$form_id = ! empty($id) ? $id : $template_id;
$input['schema'] = Form::find($form_id)->schema;
}
$input['created_by'] = request()->user()->id;
$form = Form::create($input);
return redirect()->action([\App\Http\Controllers\FormController::class, 'edit'],
['form' => $form->id]
);
}
/**
* Display the specified resource.
* This menthod is available publicly.
*
* @param id_or_slug
* @return \Illuminate\Http\Response
*/
public function show(Request $request, $id_or_slug)
{
$form = Form::where('id', $id_or_slug)
->orWhere('slug', $id_or_slug)
->first();
if (empty($form)) {
abort(404);
}
//check if password protection is enabled or not
if (isset($form->schema['settings']['password_protection']) && $form->schema['settings']['password_protection']['is_enabled'] && ! session('validated_protected_form')) {
return redirect()->route('validate.protected.form', ['id' => $id_or_slug]);
}
//if token available get submitted data
$token = request()->get('token');
if (! empty($token)) {
$form->load(['data' => function ($query) use ($token, $form) {
$query->where('token', $token)
->where('form_id', $form->id);
}]);
}
$form_closed_msg = '';
$is_form_closed = false;
if (isset($form->schema['settings']['form_scheduling']['is_enabled']) && $form->schema['settings']['form_scheduling']['is_enabled']) {
//getting form scheduling values
$form_closed_msg = $form->schema['settings']['form_scheduling']['closed_msg'];
$today = Carbon::now();
$start_date_time = null;
$end_date_time = Carbon::parse($form->schema['settings']['form_scheduling']['end_date_time']);
//parse start date time if it is enabled set form to close by default
if (isset($form->schema['settings']['form_scheduling']['start_date_time'])) {
$is_form_closed = true;
$start_date_time = Carbon::parse($form->schema['settings']['form_scheduling']['start_date_time']);
}
//check if form will be open
if (((isset($start_date_time) && ($start_date_time->lessThanOrEqualTo($today))) && $end_date_time->greaterThanOrEqualTo($start_date_time))) {
$is_form_closed = false;
}
//check if form will be close
if ($end_date_time->lessThanOrEqualTo($today)) {
$is_form_closed = true;
}
}
if (! $this->checkIfUserIsFormCreatorOrSharedWith($form)) {
$this->postVisitorsCount($request, $form->id);
}
//flush session
$request->session()->forget('validated_protected_form');
$nav = false;
$iframe_enabled = $request->get('iframe', false);
return view('form.show')
->with(compact('form', 'nav', 'is_form_closed', 'form_closed_msg', 'iframe_enabled'));
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Form $form
* @return \Illuminate\Http\Response
*/
public function edit(Form $form)
{
$user_id = request()->user()->id;
$placeholder_img = asset('img/placeholder.png');
//check subscription if form is not shared to user
if (! $this->doUserHavePermission($form->id, 'can_design_form')) {
if (! $this->isSubscribed(request()->user())) {
return redirect('home')->with('status', $this->subscriptionExpired());
}
}
//check permission if user is not a creator
$has_permission = ($form->created_by != $user_id) ? $this->doUserHavePermission($form->id, 'can_design_form') : true;
if (! $has_permission) {
abort(404);
}
//if user is not creator then don't allow permission to save as template
$save_as_template = ($form->created_by != $user_id) ? false : true;
return view('form.edit')
->with(compact('form', 'placeholder_img', 'save_as_template'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param $id
* @return \Illuminate\Http\Response
*/
public function update($id)
{
try {
$input = request()->only('name', 'description', 'slug');
$form_data = [
'form' => request()->input('form'),
'emailConfig' => request()->input('email_config'),
'settings' => request()->input('settings'),
'additional_js_css' => request()->input('js_css'),
'conditional_fields' => request()->input('conditional_fields'),
'form_attributes' => request()->input('form_attributes'),
'contains_page_break' => request()->input('contains_page_break'),
];
$is_template = request()->input('is_template');
$input['schema'] = $form_data;
$form = Form::find($id);
$form->name = $input['name'];
$form->slug = $input['slug'];
$form->description = $input['description'];
$form->schema = $input['schema'];
$form->is_template = $is_template;
$form->mailchimp_details = request()->input('mailchimp_details');
$form->acelle_mail_info = request()->input('acelle_mail_info');
$form->webhook_info = request()->input('webhook_info');
$form->save();
$data['redirect'] = action([\App\Http\Controllers\HomeController::class, 'index']);
$data['preview'] = action([\App\Http\Controllers\FormController::class, 'show'], ['form' => $form->slug ?: $id]);
$data['form_name'] = $input['name'];
return $this->respondSuccess($message = null, $data);
} catch (Exception $e) {
return $this->respondWentWrong($e);
}
}
/**
* Remove the specified resource from storage.
*
* @param \App\Form $form
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
if (! empty($this->notAllowedInDemo())) {
return $this->notAllowedInDemo();
}
try {
if (request()->ajax()) {
$form = Form::findOrFail($id);
$form->data()->delete();
$form->assignedTo()->delete();
$form->visitors()->delete();
$form->delete();
}
return $this->respondSuccess(__('messages.deleted_successfully'));
} catch (Exception $e) {
return $this->respondWentWrong($e);
}
}
public function downloadCode($form_id)
{
if (! empty($this->notAllowedInDemo())) {
return $this->notAllowedInDemo();
}
try {
//check for form code download in subscription
if (is_saas_enabled()) {
$subscription = PackageSubscription::activeSubscription(request()->user()->id);
if (! $this->isSubscribed(request()->user()) || isset($subscription->package_details['is_form_downloadable']) && ! $subscription->package_details['is_form_downloadable']) {
exit('Form code download not allowed');
}
}
$form = Form::findOrFail($form_id);
$form_slug = Str::slug($form->name);
$validation_rules = [];
$signature_elements = [];
if (! empty($form->schema['form'])) {
foreach ($form->schema['form'] as $key => $element) {
$rules = [];
foreach ($element['validations'] as $index => $validation) {
$rule = 'data-rule-'.$validation['rule'];
$error_msg = 'data-msg-'.$validation['rule'];
$is_rule_required = ! empty($validation['value']) ? $validation['value'] : true;
$rules[$index]['rule'] = $rule;
$rules[$index]['error'] = $error_msg;
$rules[$index]['value'] = $is_rule_required;
$rules[$index]['msg'] = $validation['error_msg'];
}
$validation_rules[$key] = $rules;
//used in mail
if ($element['type'] == 'signature') {
$signature_elements[$element['name']] = $element['name'];
}
}
}
//Generate html, CSS, JS
$html = view('form.download')
->with(compact('form', 'form_slug', 'validation_rules'))
->render();
//Generate PHP backend code.
$this->GeneratorCommonPhp = new FormPhpGenerator();
$form_php = $this->GeneratorCommonPhp->phpStart();
//Check for recaptcha
if ($form->schema['settings']['recaptcha']['is_enable']) {
$form_php .= $this->GeneratorCommonPhp->reCaptcha($form->schema['settings']['recaptcha']['secret_key']);
}
$smtp = $form->schema['emailConfig']['smtp'];
if (isset($form->schema['emailConfig']['email']['enable']) && $smtp['use_system_smtp'] == 1) {
// my smtp settings
$user = request()->user();
$my_smtp_settings = $user->settings['smtp'];
$smtp['host'] = $my_smtp_settings['MAIL_HOST'];
$smtp['port'] = $my_smtp_settings['MAIL_PORT'];
$smtp['from_address'] = $my_smtp_settings['MAIL_FROM_ADDRESS'];
$smtp['from_name'] = $my_smtp_settings['MAIL_FROM_NAME'];
$smtp['encryption'] = $my_smtp_settings['MAIL_ENCRYPTION'];
$smtp['username'] = $my_smtp_settings['MAIL_USERNAME'];
$smtp['password'] = $my_smtp_settings['MAIL_PASSWORD'];
}
//check for attachments
$form_php .= $this->GeneratorCommonPhp->attachmentFields($form->schema['form']);
$success_variable = true;
//Send Email.
if (isset($form->schema['emailConfig']['email']['enable']) && $form->schema['emailConfig']['email']['enable'] == 1) {
$form_php .= $this->GeneratorCommonPhp->email($form->schema['emailConfig']['email'], $smtp, '$is_email_sent', false, $signature_elements);
$success_variable = '$is_email_sent';
}
//Check and Send Auto response Email.
if (isset($form->schema['emailConfig']['auto_response']['is_enable']) && $form->schema['emailConfig']['auto_response']['is_enable'] == 1) {
$form_php .= $this->GeneratorCommonPhp->email(
$form->schema['emailConfig']['auto_response'],
$smtp,
'$is_autoresponse_email_sent',
true,
$signature_elements
);
$success_variable = ($success_variable == true) ? '$is_autoresponse_email_sent' : true;
}
// $form_php .= $this->GeneratorCommonPhp->databaseIntegration($this->form_data);
//TODO: Error message in response.
$form_php .= $this->GeneratorCommonPhp->phpEnd($form->schema['settings']['notification'], $success_variable);
//Create a folder and put the contents in it.
$directory = storage_path(config('constants.doc_path').'/'.$form_slug.'_'.time());
$directory_library_php = $directory.'/library/';
if (! is_writable(storage_path(config('constants.doc_path')))) {
return back()
->with('status', ['success' => 0,
'msg' => 'Unable to create temporary folder, Please create a folder '.storage_path(config('constants.doc_path').' and provide writable permission'),
]);
}
mkdir($directory, 0777, true);
mkdir($directory_library_php);
if ($form->schema['settings']['background']['bg_type'] == 'bg_image' && ! empty($form->schema['settings']['color']['image_path'])) {
$image_name = $form->schema['settings']['color']['image_path'];
$src_file = public_path('uploads/'.config('constants.doc_path').'/'.$image_name);
$destination_file = $directory.'/asset/';
mkdir($destination_file);
copy($src_file, $destination_file.$image_name);
}
$download_html = $directory.'/'.$form_slug.'.html';
$download_php = $directory.'/'.$form_slug.'.php';
//Generate html file.
$f_html = fopen($download_html, 'w');
fwrite($f_html, $html);
fclose($f_html);
//Generate php file.
$f_php = fopen($download_php, 'w');
fwrite($f_php, $form_php);
fclose($f_php);
//Copy all files from form_bundle.
$src = __DIR__.'/form_bundle_libraries';
File::copyDirectory($src, $directory_library_php);
return $this->_zipAndDownload($directory, $form_slug.'.zip');
} catch (Exception $e) {
exit('Something Went Wrong');
}
}
protected function _zipAndDownload($folder, $zipName)
{
if (! class_exists('ZipArchive')) {
exit('ZipArchive class not found, enable it from your php.ini file.');
}
$zipName = storage_path().'/'.$zipName;
//Zip the folder and download it.
$files = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($folder),
\RecursiveIteratorIterator::LEAVES_ONLY
);
$zip = new ZipArchive();
$zip->open($zipName, ZipArchive::CREATE | ZipArchive::OVERWRITE);
foreach ($files as $name => $file) {
// Skip directories (they would be added automatically)
if (! $file->isDir()) {
// Get real and relative path for current file
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($folder));
// Add current file to archive
$zip->addFile($filePath, ltrim($relativePath, '/'));
}
}
// Zip archive will be created only after closing object
$zip->close();
Storage::deleteDirectory($folder);
return response()->download($zipName)
->deleteFileAfterSend();
}
public function generateWidget($id)
{
if (request()->ajax()) {
$form = Form::where('created_by', \Auth::id())
->findOrFail($id);
$url = action([\App\Http\Controllers\FormController::class, 'show'], ['form' => $form->slug ?: $form->id]);
$widget = '';
$widget_script = '';
$form = 'Please fill out form';
return view('form.generate_widget')
->with(compact('widget', 'form', 'widget_script'));
}
}
public function copyForm($id)
{
if (request()->ajax()) {
$user = request()->user();
$subscription_info = [];
if (! $this->isSubscribed($user)) {
$subscription_info = $this->subscriptionExpired();
} elseif (! $this->isQuotaAvailable($user->id)) {
$subscription_info = $this->quotaNotAvailable();
}
$form = Form::find($id);
return view('form.copy_form')
->with(compact('form', 'subscription_info'));
}
}
public function generateFormSlug(Request $request)
{
if ($request->ajax()) {
$form_name = $request->input('name').' '.Str::random(3);
$form_slug = Str::slug($form_name);
return $this->respond($form_slug);
}
}
/**
* get view to assign collab
*
* @param \App\Form $id
* @return \Illuminate\Http\Response
*/
public function getCollab($id)
{
if (request()->ajax()) {
$user = request()->user();
$form = Form::with('assignedTo', 'assignedTo.user')
->where('created_by', $user->id)
->find($id);
return view('form.collaborate')
->with(compact('form'));
}
}
/**
* store the collab data in db
*
* @param \App\Form $id
* @return \Illuminate\Http\Response
*/
public function postCollab(Request $request)
{
try {
if (request()->ajax()) {
$form_id = $request->input('form_id');
$permissions = $request->input('permissions');
$email = $request->input('email');
$user = User::where('email', $email)
->first();
$form = Form::findOrFail($form_id);
if (! empty($email) && empty($user)) {
return $this->respondWithError(__('messages.user_doesnt_exist'));
} elseif (! empty($user) && ($user->id == $form->created_by)) {
return $this->respondWithError(__('messages.form_cant_be_shared_with_creator'));
}
if (! empty($user) && ! empty($permissions)) {
UserForm::create([
'form_id' => $form_id,
'assigned_to' => $user->id,
'assigned_by' => \Auth::id(),
'permissions' => $permissions,
]);
}
//update form permission(user)
$edit_permissions = $request->input('edit_permissions');
$assgined_form_ids = $request->input('edit_assigned_id');
if (! empty($assgined_form_ids)) {
$non_existing_ids = [];
foreach ($assgined_form_ids as $key => $id) {
if (! empty($edit_permissions[$id])) {
$user_form = UserForm::find($id);
$user_form->permissions = $edit_permissions[$id];
$user_form->save();
} else {
$non_existing_ids[] = $id;
}
}
UserForm::whereIn('id', $non_existing_ids)
->delete();
}
}
return $this->respondSuccess(__('messages.success'));
} catch (Exception $e) {
return $this->respondWentWrong($e);
}
}
/**
* get form example views
*
* @return object
*/
public function getFormExamples()
{
if (! $this->isDemo()) {
abort(403, 'Feature disabled');
}
return view('form_examples');
}
public function validatePasswordForProtectedForm($id)
{
$nav = false;
return view('form.validate_password')
->with(compact('nav', 'id'));
}
public function postValidatePasswordForProtectedForm($id)
{
if (request()->ajax()) {
$form = Form::where('id', $id)
->orWhere('slug', $id)
->firstOrFail();
if (request()->input('password') == $form->schema['settings']['password_protection']['password']) {
$output['success'] = true;
$output['redirect'] = action([\App\Http\Controllers\FormController::class, 'show'], ['form' => $id]);
session(['validated_protected_form' => true]);
} else {
$output['success'] = false;
$output['msg'] = __('messages.invalid_password');
session(['validated_protected_form' => false]);
}
return $output;
}
}
public function toggleGlobalTemplate(Request $request)
{
if (! auth()->user()->can('superadmin')) {
abort(403, 'Unauthorized action.');
}
if (request()->ajax()) {
try {
$is_global_template = (bool) $request->input('is_checked');
$form_id = $request->input('form_id');
Form::where('id', $form_id)
->update(['is_global_template' => $is_global_template]);
$output = [
'success' => true,
'msg' => __('messages.success'),
];
} catch (Exception $e) {
$output = [
'success' => false,
'msg' => __('messages.something_went_wrong'),
];
}
return $output;
}
}
public function getAcelleMailListIds(Request $request)
{
try {
$api_token = trim($request->input('token'));
$request_uri = config('constants.ACELLE_MAIL_API').'/lists?api_token='.$api_token;
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $request_uri);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($curl);
curl_close($curl);
$result = json_decode($result, true);
$output = [
'success' => true,
'list' => $result,
'msg' => __('messages.success'),
];
} catch (Exception $e) {
$output = [
'success' => false,
'msg' => __('messages.something_went_wrong'),
];
}
return $output;
}
public function getAcelleMailListInfo(Request $request)
{
try {
$api_token = trim($request->input('token'));
$list_id = trim($request->input('list_id'));
$args = [
'api_token' => trim($api_token),
];
$request_uri = config('constants.ACELLE_MAIL_API').'/lists/'.$list_id.'?'.http_build_query($args);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $request_uri);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($curl);
curl_close($curl);
$result = json_decode($result, true);
$fields = isset($result['list']['fields']) ? $result['list']['fields'] : [];
$output = [
'success' => true,
'fields' => $fields,
'msg' => __('messages.success'),
];
} catch (Exception $e) {
$output = [
'success' => false,
'msg' => __('messages.something_went_wrong'),
];
}
return $output;
}
/**
* validate the input value for
* given element
*/
public function validateInputValue(Request $request)
{
if (
! empty($request->input('field')) &&
! empty($request->input('field_value'))
) {
$field = json_decode($request->input('field'), true);
$allowed_values = explode(PHP_EOL, $field['allowed_input']['values']);
$allowed_values = array_map('strtolower', $allowed_values);
if (in_array(strtolower($request->input('field_value')), $allowed_values)) {
echo 'true';
exit;
} else {
echo 'false';
exit;
}
}
echo 'true';
exit;
}
}