Initial commit
This commit is contained in:
@@ -0,0 +1,386 @@
|
||||
<?php
|
||||
|
||||
namespace FluentCrm\App\Http\Controllers;
|
||||
|
||||
use FluentCrm\App\Services\Helper;
|
||||
use FluentCrm\Framework\Support\Arr;
|
||||
use FluentCrm\Framework\Http\Request\Request;
|
||||
use FluentCrm\App\Models\Subscriber;
|
||||
|
||||
/**
|
||||
* ImporterController - REST API Handler Class
|
||||
*
|
||||
* REST API Handler
|
||||
*
|
||||
* @package FluentCrm\App\Http
|
||||
*
|
||||
* @version 1.0.0
|
||||
*/
|
||||
class ImporterController extends Controller
|
||||
{
|
||||
public function getDrivers()
|
||||
{
|
||||
/**
|
||||
* Determine the list of contact import providers for FluentCRM.
|
||||
*
|
||||
* This filter allows you to modify the list of available import providers
|
||||
* in the FluentCRM plugin. By default, it includes CSV File and WordPress Users.
|
||||
*
|
||||
* @since 2.7.0
|
||||
*
|
||||
* @param array {
|
||||
* An associative array of import providers.
|
||||
*
|
||||
* @type array csv {
|
||||
* Details for the CSV File import provider.
|
||||
*
|
||||
* @type string $label The label for the provider.
|
||||
* @type string $logo The URL to the provider's logo.
|
||||
* @type bool $disabled Whether the provider is disabled.
|
||||
* }
|
||||
* @type array users {
|
||||
* Details for the WordPress Users import provider.
|
||||
*
|
||||
* @type string $label The label for the provider.
|
||||
* @type string $logo The URL to the provider's logo.
|
||||
* @type bool $disabled Whether the provider is disabled.
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
$drivers = apply_filters('fluent_crm/import_providers', [
|
||||
'csv' => [
|
||||
'label' => __('CSV File', 'fluent-crm'),
|
||||
'logo' => fluentCrmMix('images/csv.svg'),
|
||||
'disabled' => false
|
||||
],
|
||||
'users' => [
|
||||
'label' => __('WordPress Users', 'fluent-crm'),
|
||||
'logo' => fluentCrmMix('images/wordpress.svg'),
|
||||
'disabled' => false
|
||||
]
|
||||
]);
|
||||
|
||||
if (defined('FLUENTCART_VERSION')) {
|
||||
$drivers['fluent_cart'] = [
|
||||
'label' => __('FluentCart', 'fluent-crm'),
|
||||
'logo' => fluentCrmMix('images/fluent-cart-dark.svg'),
|
||||
'disabled' => false
|
||||
];
|
||||
}
|
||||
|
||||
if ($proDrivers = $this->getProDrivers()) {
|
||||
$drivers = array_merge($drivers, $proDrivers);
|
||||
}
|
||||
|
||||
return [
|
||||
'drivers' => $drivers
|
||||
];
|
||||
}
|
||||
|
||||
public function getDriver(Request $request, $driver)
|
||||
{
|
||||
if ($driver == 'users') {
|
||||
return $this->processUserDriver($request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the import driver response (CSV).
|
||||
*
|
||||
* This filter allows modification of the import driver response based on the specified driver.
|
||||
*
|
||||
* @since 2.7.0
|
||||
*
|
||||
* @param bool The response to be filtered or not. Default false.
|
||||
* @param object $request The request object containing import data.
|
||||
*/
|
||||
$response = apply_filters('fluent_crm/get_import_driver_' . $driver, false, $request);
|
||||
|
||||
if (!$response || is_wp_error($response)) {
|
||||
$message = __('Sorry no driver found for this import', 'fluent-crm');
|
||||
if (is_wp_error($response)) {
|
||||
$message = $response->get_error_message();
|
||||
}
|
||||
return $this->sendError([
|
||||
'message' => $message
|
||||
]);
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
public function importData(Request $request, $driver)
|
||||
{
|
||||
$config = $request->get('config', []);
|
||||
$page = $request->getSafe('importing_page', 'intval', 1);
|
||||
|
||||
if ($driver == 'users') {
|
||||
return $this->processUserImport($config, $page);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the response after importing data using a specific driver (CSV).
|
||||
*
|
||||
* This filter allows you to modify the response after the import process
|
||||
* using a specified driver.
|
||||
*
|
||||
* @since 2.7.0
|
||||
*
|
||||
* @param bool The response to be filtered or not. Default false.
|
||||
* @param array $config The configuration array for the import process.
|
||||
* @param int $page The current page number being processed.
|
||||
*/
|
||||
$response = apply_filters('fluent_crm/post_import_driver_' . $driver, false, $config, $page);
|
||||
|
||||
if (!$response || is_wp_error($response)) {
|
||||
$message = __('Sorry no driver found for this import', 'fluent-crm');
|
||||
if (is_wp_error($response)) {
|
||||
$message = $response->get_error_message();
|
||||
}
|
||||
return $this->sendError([
|
||||
'message' => $message
|
||||
]);
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
private function processUserDriver($request)
|
||||
{
|
||||
$summary = $request->get('summary');
|
||||
|
||||
if ($summary) {
|
||||
$config = $request->get('config');
|
||||
|
||||
$userQuery = new \WP_User_Query([
|
||||
'role__in' => Arr::get($config, 'roles'),
|
||||
'number' => 5,
|
||||
'fields' => ['ID', 'display_name', 'user_email'],
|
||||
]);
|
||||
|
||||
$users = $userQuery->get_results();
|
||||
$total = $userQuery->get_total();
|
||||
|
||||
$formattedUsers = [];
|
||||
|
||||
foreach ($users as $user) {
|
||||
$formattedUsers[] = [
|
||||
'name' => $user->display_name,
|
||||
'email' => $user->user_email
|
||||
];
|
||||
}
|
||||
|
||||
return $this->send([
|
||||
'import_info' => [
|
||||
'subscribers' => $formattedUsers,
|
||||
'total' => $total,
|
||||
'has_list_config' => true,
|
||||
'has_tag_config' => true,
|
||||
'has_status_config' => true,
|
||||
'has_update_config' => true,
|
||||
'has_silent_config' => true
|
||||
]]);
|
||||
}
|
||||
|
||||
if (!function_exists('get_editable_roles')) {
|
||||
require_once(ABSPATH . '/wp-admin/includes/user.php');
|
||||
}
|
||||
$roles = \get_editable_roles();
|
||||
|
||||
$formattedRoles = [];
|
||||
|
||||
foreach ($roles as $roleKey => $role) {
|
||||
$formattedRoles[] = [
|
||||
'id' => $roleKey,
|
||||
'label' => $role['name']
|
||||
];
|
||||
}
|
||||
|
||||
$infoSvg = '<span class="fc-inline-help-icon" aria-hidden="true" style="display:inline-flex;vertical-align:middle">'
|
||||
. '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">'
|
||||
. '<path d="M8 14C4.6862 14 2 11.3138 2 8C2 4.6862 4.6862 2 8 2C11.3138 2 14 4.6862 14 8C14 11.3138 11.3138 14 8 14ZM7.4 7.4V11H8.6V7.4H7.4ZM7.4 5V6.2H8.6V5H7.4Z" fill="currentColor"/>'
|
||||
. '</svg></span>';
|
||||
|
||||
return [
|
||||
'config' => [
|
||||
'roles' => []
|
||||
],
|
||||
'fields' => [
|
||||
'roles' => [
|
||||
'label' => __('Select User Roles', 'fluent-crm'),
|
||||
'inline_help' => $infoSvg . ' ' . __('Please check the user roles that you want to import as contact', 'fluent-crm'),
|
||||
'type' => 'checkbox-group',
|
||||
'options' => $formattedRoles,
|
||||
'has_all_selector' => true,
|
||||
'all_selector_label' => __('All', 'fluent-crm')
|
||||
]
|
||||
],
|
||||
'labels' => [
|
||||
'step_2' => __('Next [Review Data]', 'fluent-crm'),
|
||||
'step_3' => __('Import Users Now', 'fluent-crm')
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
private function processUsers($users, $inputs)
|
||||
{
|
||||
$subscribers = [];
|
||||
foreach ($users as $user) {
|
||||
$subscriber = Helper::getWPMapUserInfo($user);
|
||||
$subscriber['source'] = 'wp_users';
|
||||
if (isset($subscriber['email']) && $subscriber['email']) {
|
||||
$subscribers[] = $subscriber;
|
||||
}
|
||||
}
|
||||
|
||||
$sendDoubleOptin = Arr::get($inputs, 'double_optin_email') == 'yes';
|
||||
|
||||
return Subscriber::import(
|
||||
$subscribers,
|
||||
Arr::get($inputs, 'tags', []),
|
||||
Arr::get($inputs, 'lists', []),
|
||||
Arr::get($inputs, 'update', ''),
|
||||
Arr::get($inputs, 'status', ''),
|
||||
$sendDoubleOptin
|
||||
);
|
||||
}
|
||||
|
||||
private function processUserImport($config, $page)
|
||||
{
|
||||
$inputs = Arr::only($config, [
|
||||
'map', 'tags', 'lists', 'roles', 'update', 'status', 'double_optin_email', 'import_silently'
|
||||
]);
|
||||
|
||||
|
||||
/**
|
||||
* Determine the number of subscribers to process per request while importing.
|
||||
*
|
||||
* This filter allows you to modify the number of subscribers that are processed in each request.
|
||||
*
|
||||
* @since 2.7.0
|
||||
*
|
||||
* @param int $limit The number of subscribers to process per request. Default is 100.
|
||||
*/
|
||||
$limit = apply_filters('fluent_crm/import_users_limit_per_request', 100);
|
||||
|
||||
$userQuery = new \WP_User_Query([
|
||||
'role__in' => $inputs['roles'],
|
||||
'number' => $limit,
|
||||
'offset' => ($page - 1) * $limit
|
||||
]);
|
||||
|
||||
if (Arr::get($inputs, 'import_silently') == 'yes') {
|
||||
if (!defined('FLUENTCRM_DISABLE_TAG_LIST_EVENTS')) {
|
||||
define('FLUENTCRM_DISABLE_TAG_LIST_EVENTS', true);
|
||||
}
|
||||
}
|
||||
|
||||
$total = $userQuery->get_total();
|
||||
$users = $userQuery->get_results();
|
||||
if ($users) {
|
||||
$this->processUsers($users, $inputs);
|
||||
}
|
||||
|
||||
$hasRecords = !!count($users);
|
||||
|
||||
return $this->sendSuccess([
|
||||
'page_total' => ceil($total / $limit),
|
||||
'record_total' => $total,
|
||||
'has_more' => $hasRecords,
|
||||
'current_page' => $page,
|
||||
'next_page' => $page + 1
|
||||
]);
|
||||
}
|
||||
|
||||
private function getProDrivers()
|
||||
{
|
||||
$drivers = [];
|
||||
|
||||
if (defined('FLUENTCAMPAIGN')) {
|
||||
return $drivers;
|
||||
}
|
||||
|
||||
if (defined('LLMS_PLUGIN_FILE')) {
|
||||
$drivers['lifterlms'] = [
|
||||
'label' => __('LifterLMS', 'fluent-crm'),
|
||||
'logo' => fluentCrmMix('images/lifterlms.png'),
|
||||
'disabled' => true,
|
||||
'disabled_message' => __('Import LifterLMS students by course and groups then segment by associate tags. This is a pro feature. Please upgrade to activate this feature', 'fluent-crm')
|
||||
];
|
||||
}
|
||||
|
||||
if (defined('LEARNDASH_VERSION')) {
|
||||
$drivers['learndash'] = [
|
||||
'label' => __('LearnDash', 'fluent-crm'),
|
||||
'logo' => fluentCrmMix('images/learndash.png'),
|
||||
'disabled' => true,
|
||||
'disabled_message' => __('Import LearnDash students by course and groups then segment by associate tags. This is a pro feature. Please upgrade to activate this feature', 'fluent-crm')
|
||||
];
|
||||
}
|
||||
|
||||
if (defined('TUTOR_VERSION')) {
|
||||
$drivers['tutorlms'] = [
|
||||
'label' => __('TutorLMS', 'fluent-crm'),
|
||||
'logo' => fluentCrmMix('images/tutorlms.jpg'),
|
||||
'disabled' => true,
|
||||
'disabled_message' => __('Import TutorLMS students by course then segment by associate tags. This is a pro feature. Please upgrade to activate this feature', 'fluent-crm')
|
||||
];
|
||||
}
|
||||
|
||||
if (defined('PMPRO_VERSION')) {
|
||||
$drivers['pmpro'] = [
|
||||
'label' => __('Paid Membership Pro', 'fluent-crm'),
|
||||
'logo' => fluentCrmMix('images/pmpro.png'),
|
||||
'disabled' => true,
|
||||
'disabled_message' => __('Import Paid Membership Pro members by membership levels then segment by associate tags. This is a pro feature. Please upgrade to activate this feature', 'fluent-crm')
|
||||
];
|
||||
}
|
||||
|
||||
if (defined('WLM3_PLUGIN_VERSION')) {
|
||||
$drivers['wishlist_member'] = [
|
||||
'label' => __('Wishlist member', 'fluent-crm'),
|
||||
'logo' => fluentCrmMix('images/wishlist_member.png'),
|
||||
'disabled' => true,
|
||||
'disabled_message' => __('Import Wishlist members by membership levels then segment by associate tags. This is a pro feature. Please upgrade to activate this feature', 'fluent-crm')
|
||||
];
|
||||
}
|
||||
|
||||
if (class_exists('\Restrict_Content_Pro')) {
|
||||
$drivers['rcp'] = [
|
||||
'label' => __('Restrict Content Pro', 'fluent-crm'),
|
||||
'logo' => fluentCrmMix('images/rcp.png'),
|
||||
'disabled' => true,
|
||||
'disabled_message' => __('Import Restrict Content Pro members by membership levels then segment by associate tags. This is a pro feature. Please upgrade to activate this feature', 'fluent-crm')
|
||||
];
|
||||
}
|
||||
|
||||
if (defined('BP_REQUIRED_PHP_VERSION') && function_exists('\buddypress')) {
|
||||
|
||||
$pluginName = 'BuddyPress';
|
||||
$logo = fluentCrmMix('images/buddypress.png');
|
||||
|
||||
if (defined('BP_PLATFORM_VERSION')) {
|
||||
$pluginName = 'BuddyBoss';
|
||||
$logo = fluentCrmMix('images/buddyboss.svg');
|
||||
}
|
||||
|
||||
$drivers['buddypress'] = [
|
||||
'label' => $pluginName,
|
||||
'logo' => $logo,
|
||||
'disabled' => true,
|
||||
/* translators: %s: plugin name */
|
||||
'disabled_message' => sprintf(__('Import %s members by member groups and member types then segment by associate tags. This is a pro feature. Please upgrade to activate this feature', 'fluent-crm'), $pluginName)
|
||||
];
|
||||
}
|
||||
|
||||
if (defined('LP_PLUGIN_FILE')) {
|
||||
$drivers['learnpress'] = [
|
||||
'label' => __('LearnPress', 'fluent-crm'),
|
||||
'logo' => fluentCrmMix('images/learnpress.png'),
|
||||
'disabled' => true,
|
||||
'disabled_message' => __('Import LearnPress students by course then segment by associate tags. This is a pro feature. Please upgrade to activate this feature', 'fluent-crm')
|
||||
];
|
||||
}
|
||||
|
||||
return $drivers;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user