Initial commit
This commit is contained in:
@@ -0,0 +1,309 @@
|
||||
<?php
|
||||
|
||||
namespace FluentCrm\App\Models;
|
||||
|
||||
use FluentCrm\App\Services\BlockParser;
|
||||
use FluentCrm\App\Services\Helper;
|
||||
use FluentCrm\Framework\Support\Arr;
|
||||
|
||||
/**
|
||||
* FunnelCampaign Model - DB Model for Automation Campaigns
|
||||
*
|
||||
* Database Model
|
||||
*
|
||||
* @package FluentCrm\App\Models
|
||||
*
|
||||
* @version 1.0.0
|
||||
*/
|
||||
class FunnelCampaign extends Campaign
|
||||
{
|
||||
protected static $type = 'funnel_email_campaign';
|
||||
|
||||
protected $guarded = ['id'];
|
||||
|
||||
public static function getMock()
|
||||
{
|
||||
$defaultTemplate = Helper::getDefaultEmailTemplate();
|
||||
return [
|
||||
'id' => '',
|
||||
'parent_id' => '',
|
||||
'title' => __('Funnel Campaign Holder', 'fluent-crm'),
|
||||
'status' => 'published',
|
||||
'template_id' => '',
|
||||
'email_subject' => '',
|
||||
'email_pre_header' => '',
|
||||
'email_body' => '',
|
||||
'utm_status' => 0,
|
||||
'utm_source' => '',
|
||||
'utm_medium' => '',
|
||||
'utm_campaign' => '',
|
||||
'utm_term' => '',
|
||||
'utm_content' => '',
|
||||
'design_template' => $defaultTemplate,
|
||||
'settings' => (object)[
|
||||
'template_config' => Helper::getTemplateConfig($defaultTemplate),
|
||||
'mailer_settings' => [
|
||||
'from_name' => '',
|
||||
'from_email' => '',
|
||||
'reply_to_name' => '',
|
||||
'reply_to_email' => '',
|
||||
'is_custom' => 'no'
|
||||
]
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
public function sendToCustomAddresses($addresses = [], $args = [], $refSubscriber = false)
|
||||
{
|
||||
if (!$addresses) {
|
||||
return;
|
||||
}
|
||||
$time = current_time('mysql');
|
||||
foreach ($addresses as $address) {
|
||||
if (!is_email($address)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// check if the email has any subscriber
|
||||
$subscriber = Subscriber::where('email', $address)->first();
|
||||
if ($subscriber && $subscriber->status != 'subscribed') {
|
||||
continue;
|
||||
}
|
||||
|
||||
// We have to handle manually
|
||||
$emailBody = (new BlockParser($refSubscriber))->parse($this->email_body);
|
||||
|
||||
$emailSubject = $this->email_subject;
|
||||
|
||||
if ($refSubscriber) {
|
||||
/**
|
||||
* Filter the campaign email body content.
|
||||
*
|
||||
* This filter allows you to modify the email body content before it is sent to the subscriber.
|
||||
*
|
||||
* @param string $emailBody The email body content.
|
||||
* @param object $refSubscriber The subscriber object reference.
|
||||
* @since 2.7.0
|
||||
*
|
||||
*/
|
||||
$emailBody = apply_filters('fluent_crm/parse_campaign_email_text', $emailBody, $refSubscriber);
|
||||
/**
|
||||
* Filter the email subject text for a campaign.
|
||||
*
|
||||
* This filter allows you to modify the email subject text before it is sent to the subscriber.
|
||||
*
|
||||
* @param string $emailSubject The original email subject text.
|
||||
* @param object $refSubscriber The subscriber object reference.
|
||||
*
|
||||
* @return string The filtered email subject text.
|
||||
* @since 2.7.0
|
||||
*
|
||||
*/
|
||||
$emailSubject = apply_filters('fluent_crm/parse_campaign_email_text', $emailSubject, $refSubscriber);
|
||||
}
|
||||
|
||||
$email = [
|
||||
'campaign_id' => $this->id,
|
||||
'email_address' => $address,
|
||||
'email_subject' => $emailSubject,
|
||||
'email_body' => $emailBody,
|
||||
'created_at' => $time,
|
||||
'updated_at' => $time,
|
||||
'is_parsed' => 1,
|
||||
'note' => __('Email Sent From Funnel', 'fluent-crm')
|
||||
];
|
||||
|
||||
if ($subscriber) {
|
||||
$email['subscriber_id'] = $subscriber->id;
|
||||
}
|
||||
|
||||
if ($args) {
|
||||
$email = wp_parse_args($email, $args);
|
||||
}
|
||||
|
||||
$insertId = CampaignEmail::insert($email);
|
||||
$emailHash = Helper::generateEmailHash($insertId);
|
||||
|
||||
CampaignEmail::where('id', $insertId)
|
||||
->update([
|
||||
'email_hash' => $emailHash
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add one or more subscribers to the campaign
|
||||
* @param array $subscriberIds
|
||||
* @param array $emailArgs extra campaign_email args
|
||||
* @param bool $isModel if the $subscriberIds is collection or not
|
||||
* @return array
|
||||
*/
|
||||
public function subscribe($subscriberIds, $emailArgs = [], $isModel = false)
|
||||
{
|
||||
$updateIds = [];
|
||||
|
||||
$mailHeaders = Helper::getMailHeadersFromSettings(Arr::get($this->settings, 'mailer_settings', []));
|
||||
|
||||
if ($isModel) {
|
||||
$subscribers = $subscriberIds;
|
||||
} else {
|
||||
$subscribers = Subscriber::whereIn('id', $subscriberIds)->get();
|
||||
}
|
||||
|
||||
$sendableStatuses = fluentCrmEmailSendableStatuses();
|
||||
|
||||
foreach ($subscribers as $subscriber) {
|
||||
if (!in_array($subscriber->status, $sendableStatuses, true)) {
|
||||
continue; // We don't want to send emails to non-subscribed members
|
||||
}
|
||||
|
||||
$time = fluentCrmTimestamp();
|
||||
$email = [
|
||||
'campaign_id' => $this->id,
|
||||
'status' => $this->status,
|
||||
'subscriber_id' => $subscriber->id,
|
||||
'email_address' => $subscriber->email,
|
||||
'email_headers' => $mailHeaders,
|
||||
'created_at' => $time,
|
||||
'updated_at' => $time,
|
||||
'email_body' => '',
|
||||
];
|
||||
$subjectItem = $this->guessEmailSubject();
|
||||
$emailSubject = $this->email_subject;
|
||||
|
||||
// Let's create the email body here
|
||||
$rawTemplates = [
|
||||
'raw_html',
|
||||
'visual_builder',
|
||||
'raw_classic'
|
||||
];
|
||||
$emailBody = $this->email_body;
|
||||
if (!in_array($this->design_template, $rawTemplates)) {
|
||||
$emailBody = (new BlockParser($subscriber))->parse($emailBody);
|
||||
}
|
||||
$emailBody = str_replace(['https://fonts.googleapis.com/css2', 'https://fonts.googleapis.com/css'], 'https://fonts.bunny.net/css', $emailBody);
|
||||
/**
|
||||
* Filter the email body content for a campaign.
|
||||
*
|
||||
* This filter allows you to modify the email body content before it is sent to the subscriber.
|
||||
*
|
||||
* @param string $emailBody The original email body content.
|
||||
* @param object $subscriber The subscriber object containing subscriber details.
|
||||
*
|
||||
* @return string The filtered email body content.
|
||||
* @since 2.8.44
|
||||
*
|
||||
*/
|
||||
$emailBody = apply_filters('fluent_crm/parse_campaign_email_text', $emailBody, $subscriber);
|
||||
// email body creation done
|
||||
|
||||
if ($subjectItem && !empty($subjectItem->value)) {
|
||||
$emailSubject = $subjectItem->value;
|
||||
$email['email_subject_id'] = $subjectItem->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the campaign email subject text.
|
||||
*
|
||||
* This filter allows you to modify the email subject text for a campaign.
|
||||
*
|
||||
* @param string $emailSubject The original email subject text.
|
||||
* @param object $subscriber The subscriber object.
|
||||
*
|
||||
* @return string The filtered email subject text.
|
||||
* @since 2.8.40
|
||||
*
|
||||
*/
|
||||
$email['email_subject'] = apply_filters('fluent_crm/parse_campaign_email_text', $emailSubject, $subscriber);
|
||||
|
||||
if ($emailArgs) {
|
||||
$email = wp_parse_args($emailArgs, $email);
|
||||
}
|
||||
|
||||
$inserted = CampaignEmail::create($email);
|
||||
|
||||
$subscriber->campaign_id = $this->id;
|
||||
$subscriber->email_id = $inserted->id;
|
||||
|
||||
$emailHash = Helper::generateEmailHash($inserted->id);
|
||||
|
||||
/**
|
||||
* Filter the email body content of a campaign email.
|
||||
*
|
||||
* This filter allows you to modify the email body content before it is sent to the subscriber.
|
||||
*
|
||||
* @param string $emailBody The email body content.
|
||||
* @param object $subscriber The subscriber object containing subscriber details.
|
||||
*
|
||||
* @return string The filtered email body content.
|
||||
* @since 2.8.44
|
||||
*
|
||||
*/
|
||||
$emailBody = apply_filters('fluent_crm/parse_campaign_email_text', $emailBody, $subscriber);
|
||||
|
||||
|
||||
$trackingType = fluentcrmTrackClicking();
|
||||
|
||||
if ($trackingType) {
|
||||
$campaignUrls = Helper::urlReplaces($emailBody);
|
||||
if ($campaignUrls) {
|
||||
if ($trackingType === 'anonymous') {
|
||||
$emailBody = Helper::attachAnonymousUrls($emailBody, $campaignUrls, $inserted->id, $emailHash);
|
||||
} else {
|
||||
$emailBody = Helper::attachUrls($emailBody, $campaignUrls, $inserted->id, $emailHash);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
CampaignEmail::where('id', $inserted->id)
|
||||
->update([
|
||||
'email_hash' => $emailHash,
|
||||
'email_body' => $emailBody,
|
||||
'is_parsed' => 1
|
||||
]);
|
||||
|
||||
$updateIds[] = $inserted->id;
|
||||
}
|
||||
|
||||
$emailCount = $this->getEmailCount();
|
||||
if ($emailCount != $this->recipients_count) {
|
||||
$this->recipients_count = $emailCount;
|
||||
$this->save();
|
||||
}
|
||||
|
||||
return $updateIds;
|
||||
}
|
||||
|
||||
public function processAndSubscribe($subscriber, $refData = [], $args = [])
|
||||
{
|
||||
foreach ($refData as $refKey => $data) {
|
||||
$subscriber->{$refKey} = $data;
|
||||
}
|
||||
|
||||
/*
|
||||
* Note: We are not using the parse_campaign_email_text filter here
|
||||
* Have a plan to remove this below commented code
|
||||
*/
|
||||
// We have to handle manually
|
||||
// $emailBody = (new BlockParser($this->subscriber))->parse($this->email_body);
|
||||
// $args['email_body'] = apply_filters('fluent_crm/parse_campaign_email_text', $emailBody, $subscriber);
|
||||
// $args['email_subject'] = apply_filters('fluent_crm/parse_campaign_email_text', $this->email_subject, $subscriber);
|
||||
// $args['is_parsed'] = 1;
|
||||
|
||||
return $this->subscribe([$subscriber], $args, true);
|
||||
}
|
||||
|
||||
|
||||
public function getOpenTrackingStatus($globalFallback = true)
|
||||
{
|
||||
return fluentcrmTrackEmailOpen();
|
||||
}
|
||||
|
||||
public function getClickTrackingStatus($globalFallback = true)
|
||||
{
|
||||
return fluentcrmTrackClicking();
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user