Spaces:
No application file
No application file
namespace MauticPlugin\MauticSocialBundle\Model; | |
use Mautic\CoreBundle\Model\FormModel; | |
use MauticPlugin\MauticSocialBundle\Entity\Monitoring; | |
use MauticPlugin\MauticSocialBundle\Event as Events; | |
use MauticPlugin\MauticSocialBundle\Form\Type\MonitoringType; | |
use MauticPlugin\MauticSocialBundle\Form\Type\TwitterHashtagType; | |
use MauticPlugin\MauticSocialBundle\Form\Type\TwitterMentionType; | |
use MauticPlugin\MauticSocialBundle\SocialEvents; | |
use Symfony\Component\Form\FormFactoryInterface; | |
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; | |
use Symfony\Contracts\EventDispatcher\Event; | |
/** | |
* @extends FormModel<Monitoring> | |
*/ | |
class MonitoringModel extends FormModel | |
{ | |
/** | |
* @var array<string, mixed> | |
*/ | |
private array $networkTypes = [ | |
'twitter_handle' => [ | |
'label' => 'mautic.social.monitoring.type.list.twitter.handle', | |
'form' => TwitterMentionType::class, | |
], | |
'twitter_hashtag' => [ | |
'label' => 'mautic.social.monitoring.type.list.twitter.hashtag', | |
'form' => TwitterHashtagType::class, | |
], | |
]; | |
/** | |
* @param object $entity | |
* @param string|null $action | |
* @param mixed[] $options | |
* | |
* @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException | |
*/ | |
public function createForm($entity, FormFactoryInterface $formFactory, $action = null, $options = []): \Symfony\Component\Form\FormInterface | |
{ | |
if (!$entity instanceof Monitoring) { | |
throw new MethodNotAllowedHttpException(['Monitoring']); | |
} | |
if (!empty($action)) { | |
$options['action'] = $action; | |
} | |
return $formFactory->create(MonitoringType::class, $entity, $options); | |
} | |
/** | |
* Get a specific entity or generate a new one if id is empty. | |
*/ | |
public function getEntity($id = null): ?Monitoring | |
{ | |
return $id ? parent::getEntity($id) : new Monitoring(); | |
} | |
/** | |
* @throws MethodNotAllowedHttpException | |
*/ | |
protected function dispatchEvent($action, &$entity, $isNew = false, Event $event = null): ?Event | |
{ | |
if (!$entity instanceof Monitoring) { | |
throw new MethodNotAllowedHttpException(['Monitoring']); | |
} | |
switch ($action) { | |
case 'pre_save': | |
$name = SocialEvents::MONITOR_PRE_SAVE; | |
break; | |
case 'post_save': | |
$name = SocialEvents::MONITOR_POST_SAVE; | |
break; | |
case 'pre_delete': | |
$name = SocialEvents::MONITOR_PRE_DELETE; | |
break; | |
case 'post_delete': | |
$name = SocialEvents::MONITOR_POST_DELETE; | |
break; | |
default: | |
return null; | |
} | |
if ($this->dispatcher->hasListeners($name)) { | |
if (empty($event)) { | |
$event = new Events\SocialEvent($entity, $isNew); | |
} | |
$this->dispatcher->dispatch($event, $name); | |
return $event; | |
} else { | |
return null; | |
} | |
} | |
/** | |
* @param Monitoring $monitoringEntity | |
* @param bool $unlock | |
*/ | |
public function saveEntity($monitoringEntity, $unlock = true): void | |
{ | |
// we're editing an existing record | |
if (!$monitoringEntity->isNew()) { | |
// increase the revision | |
$revision = $monitoringEntity->getRevision(); | |
++$revision; | |
$monitoringEntity->setRevision($revision); | |
} // is new | |
else { | |
$now = new \DateTime(); | |
$monitoringEntity->setDateAdded($now); | |
} | |
parent::saveEntity($monitoringEntity, $unlock); | |
} | |
/** | |
* @return \MauticPlugin\MauticSocialBundle\Entity\MonitoringRepository | |
*/ | |
public function getRepository() | |
{ | |
return $this->em->getRepository(Monitoring::class); | |
} | |
public function getPermissionBase(): string | |
{ | |
return 'mauticSocial:monitoring'; | |
} | |
/** | |
* @return string[] | |
*/ | |
public function getNetworkTypes(): array | |
{ | |
$types = []; | |
foreach ($this->networkTypes as $type => $data) { | |
$types[$type] = $data['label']; | |
} | |
return $types; | |
} | |
/** | |
* @param string $type | |
* | |
* @return string|null | |
*/ | |
public function getFormByType($type) | |
{ | |
return array_key_exists($type, $this->networkTypes) ? $this->networkTypes[$type]['form'] : null; | |
} | |
} | |