Sindbad~EG File Manager
<?php
namespace FluentForm\App\Services\Migrator\Classes;
use \FluentForm\App\Modules\Form\Form;
use \FluentForm\Framework\Helpers\ArrayHelper;
class NinjaFormsMigrator extends BaseMigrator
{
public function __construct()
{
$this->key = 'ninja_forms';
$this->title = 'Ninja Forms';
$this->shortcode = 'ninja_form';
}
/**
* Check if form type exists
* @return bool
*/
public function exist()
{
return !!defined('NF_SERVER_URL');
}
/**
* Get array of all forms
* @return array Forms with fields
*/
public function getForms()
{
$forms = [];
$items = (new \NF_Database_FormsController())->getFormsData();
foreach ($items as $item) {
$fields = Ninja_Forms()->form($item->id)->get_fields();
$field_settings = [];
foreach ($fields as $key => $field) {
$field_settings[$key] = $field->get_settings();
}
$forms[] = [
'ID' => $item->id,
'name' => $item->title,
'fields' => $field_settings,
];
}
return $forms;
}
public function getForm($id)
{
$formModel = \Ninja_Forms()->form($id)->get();
if (!$formModel) {
return [];
}
$forms = $this->getForms();
$formArray = array_filter($forms, function ($form) use ($id) {
if ($form['ID'] == $id) {
return $form;
}
});
return array_shift($formArray);
}
public function getFormsFormatted()
{
$forms = [];
$items = $this->getForms();
foreach ($items as $item) {
$forms[] = [
'name' => $this->getFormName($item),
'id' => $this->getFormId($item),
'imported_ff_id' => $this->isAlreadyImported($item),
];
}
return $forms;
}
/**
*
* Get formatted fields form array
* @param array $form
* @return array fluentform data formatted for database
*/
public function getFields($form)
{
$fluentFields = [];
$fields = ArrayHelper::get($form, 'fields');
foreach ($fields as $field) {
list($type, $args) = $this->formatFieldData($field);
if ($value = $this->getFluentClassicField($type, $args)) {
$fluentFields[$field['key']] = $value;
} else {
if (ArrayHelper::get($field, 'type') != 'submit') {
$this->unSupportFields[] = ArrayHelper::get($field, 'label');
}
}
}
$submitBtn = $this->getSubmitBttn([
'uniqElKey' => $field['key'],
'label' => $field['label'],
'class' => $field['element_class'],
]);
if (empty($fluentFields)) {
return false;
}
$returnData = [
'fields' => $fluentFields,
'submitButton' => $this->submitBtn
];
return $returnData;
}
/**
* Format each field with proper data
* @param $field
* @return array required arguments for single field
*/
protected function formatFieldData($field)
{
$type = ArrayHelper::get($this->fieldTypes(), $field['type'], '');
$args = [
'uniqElKey' => $field['key'] . '-' . time(),
'index' => $field['order'],
'required' => ArrayHelper::isTrue($field, 'required'),
'label' => $field['label'],
'name' => ArrayHelper::get($field, 'key'),
'placeholder' => ArrayHelper::get($field, 'placeholder', ''),
'class' => ArrayHelper::get($field, 'element_class', ''),
'value' => $this->dynamicShortcodeConverter(ArrayHelper::get($field, 'value', '')),
'help_message' => ArrayHelper::get($field, 'desc_text'),
'container_class' => ArrayHelper::get($field, 'container_class'),
];
if (empty($args['name'])) {
$name = ArrayHelper::get($field, 'id');
$args['name'] = str_replace('.', '_', $name);
}
switch ($type) {
case 'select':
case 'input_radio':
case 'input_checkbox':
case 'multi_select':
$optionsData = $this->getOptions(ArrayHelper::get($field, 'options', []));
$args['options'] = ArrayHelper::get($optionsData, 'options');
$args['value'] = ArrayHelper::get($optionsData, 'selectedOption.0', '');
if ($field['type'] == 'listimage') {
$args['enable_image_input'] = true;
$optionsData = $this->getOptions(ArrayHelper::get($field, 'image_options', []), $hasImage = true);
$args['options'] = $optionsData['options'];
$args['value'] = ArrayHelper::get($optionsData, 'selectedOption.0', '');
if (ArrayHelper::isTrue($field, 'allow_multi_select')) {
$type = 'input_checkbox';
}
} else {
if ($field['type'] == 'checkbox' && empty($args['options'])) {
//single item checkbox
$arr = [
'label' => ArrayHelper::get($field, 'checked_value'),
'value' => ArrayHelper::get($field, 'checked_value'),
'calc_value' => '',
'id' => 0
];
$args['options'] = [$arr];
} else {
if ($field['type'] == 'checkbox' && $args['allow_multi_select'] == 1) {
//img with multi item checkbox make it check box
$type = 'input_checkbox';
$args['value'] = ArrayHelper::get($optionsData, 'selectedOption');
}
}
}
if ($type == 'input_checkbox' || $type == 'multi_select') {
//array values
$args['value'] = ArrayHelper::get($optionsData, 'selectedOption', '');
}
break;
case 'input_date':
$args['format'] = Arrayhelper::get($field, 'date_format');
if ($args['format'] == 'default') {
$args['format'] = 'd/m/Y';
}
break;
case 'input_number':
$args['step'] = $field['num_step'];
$args['min'] = $field['num_min'];
$args['max'] = $field['num_max'];
break;
case 'input_hidden':
$args['value'] = ArrayHelper::get($field, 'default', '');
break;
case 'ratings':
$number = ArrayHelper::get($field, 'number_of_stars', 5);
$args['options'] = array_combine(range(1, $number), range(1, $number));
break;
case 'input_file':
break;
case 'custom_html':
$args['html_codes'] = $field['default'];
break;
case 'gdpr_agreement': // ??
$args['tnc_html'] = $field['config']['agreement'];
break;
case 'repeater_field':
$repeaterFields = ArrayHelper::get($field, 'fields', []);
$arr = [];
foreach ($repeaterFields as $serial => $repeaterField) {
$type = ArrayHelper::get($this->fieldTypes(), $repeaterField['type'], '');
$supportedRepeaterFields = ['input_text', 'select', 'input_number', 'email'];
if (in_array($type, $supportedRepeaterFields)) {
list($type, $args) = $this->formatFieldData($repeaterField);
$arr[] = $this->getFluentClassicField($type, $args);
}
}
if (empty($arr)) {
return '';
}
$args['fields'] = $arr;
return array('repeater_field', $args);
case 'submit':
$this->submitBtn = $this->getSubmitBttn(
[
'uniqElKey' => $field['key'],
'label' => $field['label'],
'class' => $field['element_class'],
]
);
break;
}
return array($type, $args);
}
/**
* Get field type in fluentforms type
* @return array
*/
public function fieldTypes()
{
$fieldTypes = [
'email' => 'email',
'textbox' => 'input_text',
'address' => 'input_text',
'city' => 'input_text',
'zip' => 'input_text',
'liststate' => 'select',
'firstname' => 'input_text',
'lastname' => 'input_text',
'listcountry' => 'select_country',
'textarea' => 'input_textarea',
'phone' => 'phone',
'select' => 'select',
'listselect' => 'select',
'listmultiselect' => 'multi_select',
'radio' => 'input_radio',
'listcheckbox' => 'input_checkbox',
'listimage' => 'input_radio',
'listradio' => 'input_radio',
'checkbox' => 'input_checkbox',
'date' => 'input_date',
'html' => 'custom_html',
'hr' => 'section_break',
'repeater' => 'repeater_field',
'starrating' => 'ratings',
'recaptcha' => 'reCaptcha',
'number' => 'input_number',
'hidden' => 'input_hidden',
'submit' => 'submit',
];
return $fieldTypes;
}
/**
* Get formatted options for select,radio etc type fields
* @param $options
* @param bool $hasImage
* @return array (options list and selected option)
*/
public function getOptions($options, $hasImage = false)
{
$formattedOptions = [];
$selectedOption = [];
foreach ($options as $key => $option) {
$arr = [
'label' => ArrayHelper::get($option, 'label', 'Item -' . $key),
'value' => ArrayHelper::get($option, 'value'),
'calc_value' => ArrayHelper::get($option, 'calc'),
'id' => ArrayHelper::get($option, 'order')
];
if ($hasImage) {
$arr['image'] = ArrayHelper::get($option, 'image');
}
if (ArrayHelper::isTrue($option, 'selected')) {
$selectedOption[] = ArrayHelper::get($option, 'value', '');
}
$formattedOptions[] = $arr;
}
return ['options' => $formattedOptions, 'selectedOption' => $selectedOption];
}
/**
* Get Form Metas
* @param $form
* @return array
*/
public function getFormMetas($form)
{
$this->addRecaptcha();
$formObject = new Form(wpFluentForm());
$defaults = $formObject->getFormsDefaultSettings();
$formSettings = $this->getFormSettings($form);
$formMeta = [];
$actions = Ninja_Forms()->form($this->getFormId($form))->get_actions();
if (is_array($actions)) {
foreach ($actions as $action) {
if ($action->get_type() != 'action') {
continue;
}
$actionData = $action->get_settings();
if ($actionData['type'] == 'email') {
$formMeta['notifications'] [] = $this->getNotificationData($actionData);
} elseif ($actionData['type'] == 'successmessage') {
$formMeta['formSettings']['confirmation'] = [
'messageToShow' => $this->dynamicShortcodeConverter($actionData['success_msg']),
'samePageFormBehavior' => ($formSettings['hide_complete']) ? 'hide_form' : 'reset_form',
'redirectTo' => 'samePage'
];
} elseif ($actionData['type'] == 'save') {
$isAutoDelete = intval(ArrayHelper::get($actionData, 'set_subs_to_expire')) == 1;
if ($isAutoDelete) {
$formMeta['formSettings'] = [
'delete_after_x_days' => true,
'auto_delete_days' => $actionData['subs_expire_time'],
];
}
} elseif ($actionData['type'] == 'redirect') {
$formMeta['formSettings']['confirmation'] = [
'messageToShow' => $this->dynamicShortcodeConverter($actionData['success_msg']),
'samePageFormBehavior' => isset($form['hide_form']) ? 'hide_form' : 'reset_form',
'redirectTo' => 'customUrl',
'customUrl' => $actionData['redirect_url'],
];
}
}
}
$advancedValidation = [
'status' => false,
'type' => 'all',
'conditions' => [
[
'field' => '',
'operator' => '=',
'value' => ''
]
],
'error_message' => '',
'validation_type' => 'fail_on_condition_met'
];
$defaults['restrictions']['requireLogin'] = [
'enabled' => ArrayHelper::isTrue($formSettings, 'logged_in', false),
'requireLoginMsg' => $formSettings['not_logged_in_msg']
];
$defaults['restrictions']['limitNumberOfEntries'] = [
'enabled' => (intval($formSettings['sub_limit_number']) > 0),
'numberOfEntries' => $formSettings['sub_limit_number'],
'limitReachedMsg' => $formSettings['sub_limit_msg']
];
$formMeta['formSettings']['restrictions'] = $defaults['restrictions'];
$formMeta['formSettings']['layout'] = $defaults['layout'];
$formMeta['advancedValidationSettings'] = $advancedValidation;
$formMeta['delete_entry_on_submission'] = 'no';
return $formMeta;
}
/**
* Update recaptcha key if already not has
*/
protected function addRecaptcha()
{
$ffRecap = get_option('_fluentform_reCaptcha_details');
if ($ffRecap) {
return;
}
$recaptcha_site_key = Ninja_Forms()->get_settings();
$arr = '';
if ($recaptcha_site_key['recaptcha_site_key'] != '') {
$arr = [
'siteKey' => $recaptcha_site_key['recaptcha_site_key'],
'secretKey' => $recaptcha_site_key['recaptcha_secret_key'],
'api_version' => 'v2_visible'
];
} elseif ($recaptcha_site_key['recaptcha_site_key_3'] != '') {
$arr = [
'siteKey' => $recaptcha_site_key['recaptcha_site_key_3'],
'secretKey' => $recaptcha_site_key['recaptcha_secret_key_3'],
'api_version' => 'v3_invisible',
];
}
update_option('_fluentform_reCaptcha_details', $arr, false);
}
/**
* Get notification data for metas
* @param $actionData
* @return array
*/
private function getNotificationData($actionData)
{
// Convert all shortcodes
$actionData['to'] = $this->dynamicShortcodeConverter($actionData['to']);
$actionData['reply_to'] = $this->dynamicShortcodeConverter($actionData['reply_to']);
$actionData['email_subject'] = $this->dynamicShortcodeConverter($actionData['email_subject']);
$actionData['email_message'] = $this->dynamicShortcodeConverter($actionData['email_message']);
$notification =
[
'sendTo' => [
'type' => 'email',
'email' => ($actionData['to'] == '{system:admin_email}') ? '{wp.admin_email}' : $actionData['to'],
'fromEmail' => $actionData['from_address'],
'field' => 'email',
'routing' => '',
],
'enabled' => ArrayHelper::isTrue($actionData, 'active'),
'name' => $actionData['label'],
'subject' => $actionData['email_subject'],
'to' => ($actionData['to'] == '{system:admin_email}') ? '{wp.admin_email}' : $actionData['to'],
'replyTo' => ($actionData['to'] == '{system:admin_email}') ? '{wp.admin_email}' : $actionData['reply_to'],
'message' => $actionData['email_message'],
'fromName' => ArrayHelper::get($actionData, 'from_name'),
'fromAddress' => ArrayHelper::get($actionData, 'from_address'),
'bcc' => ArrayHelper::get($actionData, 'bcc'),
];
return $notification;
}
/**
* Convert Ninja Forms merge Tags to Fluent forms dynamic shortcodes.
* @param $msg
* @return string
*/
private function dynamicShortcodeConverter($msg)
{
$shortcodes = $this->dynamicShortcodes();
$msg = str_replace(array_keys($shortcodes), array_values($shortcodes), $msg);
return $msg;
}
/**
* Get shortcode in fluentforms format
* @return array
*/
protected function dynamicShortcodes()
{
$dynamicShortcodes = [
// Input Options
'field:' => 'inputs.',
'{all_fields_table}' => '{all_data}',
'{fields_table}' => '{all_data}',
// General Smartcodes
'{wp:site_title}' => '{wp.site_title}',
'{wp:site_url}' => '{wp.site_url}',
'{wp:admin_email}' => '{wp.admin_email}',
'{other:user_ip}' => '{ip}',
'{other:date}' => '{date.d/m/Y}',
'{other:time}' => '',
'{wp:post_id}' => '{embed_post.ID}',
'{wp:post_title}' => '{embed_post.post_title}',
'{wp:post_url}' => '{embed_post.permalink}',
'{wp:post_author}' => '',
'{wp:post_author_email}' => '',
'{post_meta:YOUR_META_KEY}' => '{embed_post.meta.YOUR_META_KEY}',
'{wp:user_id}' => '{user.ID}',
'{wp:user_first_name}' => '{user.first_name}',
'{wp:user_last_name}' => '{user.last_name}',
'{wp:user_username}' => '{user.user_login}',
'{wp:user_display_name}' => '{user.display_name}',
'{wp:user_email}' => '{user.user_email}',
'{wp:user_url}' => '{wp.site_url}',
'{user_meta:YOUR_META_KEY}' => '',
// Entry Attributes
'{form:id}' => '',
'{form:title}' => '',
'{submission:sequence}' => '{submission.serial_number}',
'{submission:count}' => '{submission.serial_number}',
'querystring:' => 'get.'
];
return $dynamicShortcodes;
}
/**
* Get form settings
* @param $form
* @return array $formSettings
*/
protected function getFormSettings($form)
{
$formData = Ninja_Forms()->form($form['ID'])->get();
return $formData->get_settings();
}
/**
* @param $form
* @return mixed
*/
protected function getFormId($form)
{
return intval($form['ID']);
}
/**
* @param $form
* @return mixed
*/
protected function getFormName($form)
{
return $form['name'];
}
public function getEntries($formId)
{
$form = $this->getForm($formId);
if (empty($form)) {
return false;
}
$submissions = \Ninja_Forms()->form($formId)->get_subs();
if (!$submissions || !is_array($submissions)) {
return [];
}
$totalEntries = count($submissions);
$max_limit = apply_filters('fluentform/entry_migration_max_limit', static::DEFAULT_ENTRY_MIGRATION_MAX_LIMIT, $this->key, $totalEntries, $formId);
if ($totalEntries && $max_limit && $totalEntries > $max_limit) {
$submissions = array_slice($submissions, 0 , $max_limit);
}
$entries = [];
$fieldsMap = $this->getFieldKeyMaps($form);
foreach ($submissions as $submission) {
$values = $submission->get_field_values();
$values = ArrayHelper::only($values, $fieldsMap);
$values = $this->formatEntries($values);
if ($created_at = $submission->get_sub_date('Y-m-d H:i:s')) {
$values['created_at'] = $created_at;
}
if ($updated_at = $submission->get_mod_date('Y-m-d H:i:s')) {
$values['updated_at'] = $updated_at;
}
$entries[] = $values;
}
return array_reverse($entries);
}
public function getFieldKeyMaps($form)
{
$fields = ArrayHelper::get($form, 'fields');
$fieldsMap = [];
foreach ($fields as $field) {
$fieldsMap[] = $field['key'];
}
return $fieldsMap;
}
/**
* @param array $values
* @return array
*/
public function formatEntries(array $values)
{
$formattedData = [];
foreach ($values as $key => $value) {
$key = str_replace('.', '_', $key);
$value = maybe_unserialize($value);
$formattedData[$key] = $value;
if (is_array($value)) {
$value = $this->formatEntries($value);
}
}
return $formattedData;
}
}
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists