Spaces:
No application file
No application file
namespace Mautic\LeadBundle\Controller; | |
use Mautic\CoreBundle\Factory\PageHelperFactoryInterface; | |
use Mautic\LeadBundle\Entity\LeadRepository; | |
use Symfony\Component\HttpFoundation\Request; | |
trait EntityContactsTrait | |
{ | |
/** | |
* @param string|int $entityId | |
* @param int $page | |
* @param string[]|string $permission | |
* @param string $sessionVar | |
* @param string $entityJoinTable Table to join to obtain list of related contacts or a DBAL QueryBuilder object defining custom joins | |
* @param string|null $dncChannel Channel for this entity to get do not contact records for | |
* @param string|null $entityIdColumnName If the entity ID in $joinTable is not "id", set the column name here | |
* @param array|null $contactFilter Array of additional filters for the getEntityContactsWithFields() function | |
* @param array|null $additionalJoins [ ['type' => 'join|leftJoin', 'from_alias' => '', 'table' => '', 'condition' => ''], ... ] | |
* @param string|null $contactColumnName Column of the contact in the join table | |
* @param array|null $routeParameters | |
* @param string|null $paginationTarget DOM selector for injecting new content when pagination is used | |
* @param string|null $orderBy optional OrderBy column, to be used to increase performance with joins | |
* @param string|null $orderByDir optional $orderBy direction, to be used to increase performance with joins | |
* @param int|null $count optional $count if already known to avoid an extra query | |
* @param \DateTimeInterface|null $dateFrom optionally limit to leads added between From and To dates | |
* @param \DateTimeInterface|null $dateTo optionally limit to leads added between From and To dates | |
* | |
* @return mixed | |
*/ | |
protected function generateContactsGrid( | |
Request $request, | |
PageHelperFactoryInterface $pageHelperFactory, | |
$entityId, | |
$page, | |
$permission, | |
$sessionVar, | |
$entityJoinTable, | |
$dncChannel = null, | |
$entityIdColumnName = 'id', | |
array $contactFilter = null, | |
array $additionalJoins = null, | |
$contactColumnName = null, | |
array $routeParameters = [], | |
$paginationTarget = null, | |
$orderBy = null, | |
$orderByDir = null, | |
$count = null, | |
\DateTimeInterface $dateFrom = null, | |
\DateTimeInterface $dateTo = null | |
) { | |
if ($permission && !$this->security->isGranted($permission)) { | |
return $this->accessDenied(); | |
} | |
// Set the route if not standardized | |
$route = "mautic_{$sessionVar}_contacts"; | |
if (method_exists($this, 'getRouteBase') && $this->getRouteBase()) { | |
$route = 'mautic_'.$this->getRouteBase().'_contacts'; | |
} | |
// Apply filters | |
if ('POST' == $request->getMethod()) { | |
$this->setListFilters($sessionVar.'.contact'); | |
} | |
$search = $request->get('search', $request->getSession()->get('mautic.'.$sessionVar.'.contact.filter', '')); | |
$request->getSession()->set('mautic.'.$sessionVar.'.contact.filter', $search); | |
$pageHelper = $pageHelperFactory->make("mautic.{$sessionVar}", $page); | |
$filter = ['string' => $search, 'force' => []]; | |
$orderBy = $orderBy ?: $request->getSession()->get('mautic.'.$sessionVar.'.contact.orderby', 'l.id'); | |
$orderByDir = $orderByDir ?: $request->getSession()->get('mautic.'.$sessionVar.'.contact.orderbydir', 'DESC'); | |
$limit = $request->getSession()->get( | |
'mautic.'.$sessionVar.'.contact.limit', | |
$this->coreParametersHelper->get('default_pagelimit') | |
); | |
$start = (1 === $page) ? 0 : (($page - 1) * $limit); | |
if ($start < 0) { | |
$start = 0; | |
} | |
/** @var LeadRepository $repo */ | |
$repo = $this->getModel('lead')->getRepository(); | |
$contacts = $repo->getEntityContacts( | |
[ | |
'withTotalCount' => (null === $count), | |
'start' => $start, | |
'limit' => $limit, | |
'filter' => $filter, | |
'orderBy' => $orderBy, | |
'orderByDir' => $orderByDir, | |
'select' => ListController::SEGMENT_CONTACT_FIELDS, | |
'route' => $route, | |
], | |
$entityJoinTable, | |
$entityId, | |
$contactFilter, | |
$entityIdColumnName, | |
$additionalJoins, | |
$contactColumnName, | |
$dateFrom, | |
$dateTo | |
); | |
// Normalize results regarding withTotalCount. | |
if (isset($contacts['count'])) { | |
$count = (int) $contacts['count']; | |
} else { | |
$contacts = [ | |
'results' => $contacts, | |
'count' => $count, | |
]; | |
} | |
if ($count && $count < ($start + 1)) { | |
// the number of entities are now less then the current page so redirect to the last page | |
$lastPage = $pageHelper->countPage($count); | |
$pageHelper->rememberPage($lastPage); | |
$returnUrl = $this->generateUrl($route, array_merge(['objectId' => $entityId, 'page' => $lastPage], $routeParameters)); | |
return $this->postActionRedirect( | |
[ | |
'returnUrl' => $returnUrl, | |
'viewParameters' => ['page' => $lastPage, 'objectId' => $entityId], | |
'contentTemplate' => '@MauticLead/Lead/grid.html.twig', | |
'forwardController' => false, | |
'passthroughVars' => [ | |
'mauticContent' => $sessionVar.'Contacts', | |
], | |
] | |
); | |
} | |
$pageHelper->rememberPage($page); | |
// Get DNC for the contact | |
$dnc = []; | |
if ($dncChannel && $count > 0) { | |
$dnc = $this->doctrine->getManager()->getRepository(\Mautic\LeadBundle\Entity\DoNotContact::class)->getChannelList( | |
$dncChannel, | |
array_keys($contacts['results']) | |
); | |
} | |
return $this->delegateView( | |
[ | |
'viewParameters' => [ | |
'page' => $page, | |
'items' => $contacts['results'], | |
'totalItems' => $contacts['count'], | |
'tmpl' => $sessionVar.'Contacts', | |
'indexMode' => 'grid', | |
'route' => $route, | |
'routeParameters' => $routeParameters, | |
'sessionVar' => $sessionVar.'.contact', | |
'limit' => $limit, | |
'objectId' => $entityId, | |
'noContactList' => $dnc, | |
'target' => $paginationTarget, | |
], | |
'contentTemplate' => '@MauticLead/Lead/grid.html.twig', | |
'passthroughVars' => [ | |
'mauticContent' => $sessionVar.'Contacts', | |
'route' => false, | |
], | |
] | |
); | |
} | |
} | |