Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\IntegrationsBundle\Controller; | |
use Mautic\CoreBundle\Controller\CommonController; | |
use Mautic\IntegrationsBundle\Exception\IntegrationNotFoundException; | |
use Mautic\IntegrationsBundle\Form\Type\IntegrationSyncSettingsObjectFieldMappingType; | |
use Mautic\IntegrationsBundle\Helper\ConfigIntegrationsHelper; | |
use Mautic\IntegrationsBundle\Helper\FieldFilterHelper; | |
use Mautic\IntegrationsBundle\Helper\FieldMergerHelper; | |
use Mautic\IntegrationsBundle\Integration\Interfaces\ConfigFormSyncInterface; | |
use Symfony\Component\Form\FormFactoryInterface; | |
use Symfony\Component\HttpFoundation\JsonResponse; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\Response; | |
class FieldPaginationController extends CommonController | |
{ | |
/** | |
* @return Response | |
*/ | |
public function paginateAction( | |
Request $request, | |
FormFactoryInterface $formFactory, | |
ConfigIntegrationsHelper $integrationsHelper, | |
string $integration, | |
string $object, | |
int $page | |
) { | |
// Check ACL | |
if (!$this->security->isGranted('plugin:plugins:manage')) { | |
return $this->accessDenied(); | |
} | |
// Find the integration | |
try { | |
/** @var ConfigFormSyncInterface $integrationObject */ | |
$integrationObject = $integrationsHelper->getIntegration($integration); | |
$integrationConfiguration = $integrationObject->getIntegrationConfiguration(); | |
} catch (IntegrationNotFoundException) { | |
return $this->notFound(); | |
} | |
$keyword = $request->get('keyword'); | |
$featureSettings = $integrationConfiguration->getFeatureSettings(); | |
$currentFields = $this->getFields($request, $integrationObject, $featureSettings, $object); | |
$fieldFilterHelper = new FieldFilterHelper($integrationObject); | |
if ($keyword) { | |
$fieldFilterHelper->filterFieldsByKeyword($object, $keyword, $page); | |
} else { | |
$fieldFilterHelper->filterFieldsByPage($object, $page); | |
} | |
// Create the form | |
$form = $formFactory->create( | |
IntegrationSyncSettingsObjectFieldMappingType::class, | |
$currentFields, | |
[ | |
'integrationFields' => $fieldFilterHelper->getFilteredFields(), | |
'page' => $page, | |
'keyword' => $keyword, | |
'totalFieldCount' => $fieldFilterHelper->getTotalFieldCount(), | |
'object' => $object, | |
'integrationObject' => $integrationObject, | |
'csrf_protection' => false, | |
] | |
); | |
$html = $this->render( | |
'@Integrations/Config/field_mapping.html.twig', | |
[ | |
'form' => $form->createView(), | |
'integration' => $integration, | |
'object' => $object, | |
'page' => $page, | |
] | |
)->getContent(); | |
$prefix = "integration_config[featureSettings][sync][fieldMappings][$object]"; | |
$idPrefix = str_replace(['][', '[', ']'], '_', $prefix); | |
if (str_ends_with($idPrefix, '_')) { | |
$idPrefix = substr($idPrefix, 0, -1); | |
} | |
$formType = 'integration_sync_settings_object_field_mapping'; | |
$html = preg_replace('/'.$formType.'\[(.*?)\]/', $prefix.'[$1]', $html); | |
$html = str_replace($formType, $idPrefix, $html); | |
return new JsonResponse( | |
[ | |
'success' => 1, | |
'html' => $html, | |
] | |
); | |
} | |
private function getFields(Request $request, ConfigFormSyncInterface $integrationObject, array $featureSettings, string $object): array | |
{ | |
$fields = $featureSettings['sync']['fieldMappings'] ?? []; | |
if (!isset($fields[$object])) { | |
$fields[$object] = []; | |
} | |
// Pull those changed from session | |
$session = $request->getSession(); | |
$sessionFields = $session->get(sprintf('%s-fields', $integrationObject->getName()), []); | |
if (!isset($sessionFields[$object])) { | |
return $fields[$object]; | |
} | |
$fieldMerger = new FieldMergerHelper($integrationObject, $fields); | |
$fieldMerger->mergeSyncFieldMapping($object, $sessionFields[$object]); | |
return $fieldMerger->getFieldMappings()[$object]; | |
} | |
} | |