When we create the templates, we are not in the WordPress environment and do not have a connection to the database. Therefore, we need to instantiate our dependencies later, so they get only invoked once they are needed, which is, when we are in the WordPress environment again. [MAILPOET-3985]
326 lines
8.0 KiB
PHP
326 lines
8.0 KiB
PHP
<?php
|
|
|
|
namespace MailPoet\Twig;
|
|
|
|
use MailPoet\Referrals\UrlDecorator;
|
|
use MailPoet\Settings\SettingsController;
|
|
use MailPoet\Util\FreeDomains;
|
|
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
|
|
use MailPoet\WP\Functions as WPFunctions;
|
|
use MailPoetVendor\Carbon\Carbon;
|
|
use MailPoetVendor\Twig\Extension\AbstractExtension;
|
|
use MailPoetVendor\Twig\TwigFunction;
|
|
|
|
class Functions extends AbstractExtension {
|
|
|
|
/** @var SettingsController */
|
|
private $settings = null;
|
|
|
|
/** @var WooCommerceHelper */
|
|
private $woocommerceHelper = null;
|
|
|
|
/** @var WPFunctions */
|
|
private $wp = null;
|
|
|
|
/** @var UrlDecorator */
|
|
private $referralUrlDecorator = null;
|
|
|
|
private function getWooCommerceHelper(): WooCommerceHelper {
|
|
if ($this->woocommerceHelper === null) {
|
|
$this->woocommerceHelper = new WooCommerceHelper();
|
|
}
|
|
return $this->woocommerceHelper;
|
|
}
|
|
|
|
private function getreferralUrlDecorator(): UrlDecorator {
|
|
if ($this->referralUrlDecorator === null) {
|
|
$this->referralUrlDecorator = new UrlDecorator($this->getWp(), $this->getSettings());
|
|
}
|
|
return $this->referralUrlDecorator;
|
|
}
|
|
|
|
private function getSettings(): SettingsController {
|
|
if ($this->settings === null) {
|
|
$this->settings = SettingsController::getInstance();
|
|
}
|
|
return $this->settings;
|
|
}
|
|
|
|
private function getWp(): WPFunctions {
|
|
if ($this->wp === null) {
|
|
$this->wp = WPFunctions::get();
|
|
}
|
|
return $this->wp;
|
|
}
|
|
|
|
public function getFunctions() {
|
|
return [
|
|
new TwigFunction(
|
|
'json_encode',
|
|
'json_encode',
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'json_decode',
|
|
'json_decode',
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'wp_nonce_field',
|
|
'wp_nonce_field',
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'params',
|
|
[$this, 'params'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'admin_url',
|
|
'admin_url',
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'get_option',
|
|
'get_option',
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'sending_frequency',
|
|
[$this, 'getSendingFrequency'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'wp_date_format',
|
|
[$this, 'getWPDateFormat'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'mailpoet_version',
|
|
[$this, 'getMailPoetVersion'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'mailpoet_premium_version',
|
|
[$this, 'getMailPoetPremiumVersion'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'wp_date_format',
|
|
[$this, 'getWPDateFormat'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'wp_time_format',
|
|
[$this, 'getWPTimeFormat'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'wp_datetime_format',
|
|
[$this, 'getWPDateTimeFormat'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'do_action',
|
|
'do_action',
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'is_rtl',
|
|
[$this, 'isRtl'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'number_format_i18n',
|
|
'number_format_i18n',
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'mailpoet_locale',
|
|
[$this, 'getTwoLettersLocale'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'mailpoet_free_domains',
|
|
[$this, 'getFreeDomains'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'is_woocommerce_active',
|
|
[$this, 'isWoocommerceActive'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'wp_start_of_week',
|
|
[$this, 'getWPStartOfWeek'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'stats_color',
|
|
[$this, 'statsColor'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'clicked_stats_text',
|
|
[$this, 'clickedStatsText'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'stats_number_format_i18n',
|
|
[$this, 'statsNumberFormatI18n'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'add_referral_id',
|
|
[$this, 'addReferralId'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'is_loading_3rd_party_enabled',
|
|
[$this, 'libs3rdPartyEnabled'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
];
|
|
}
|
|
|
|
public function getSendingFrequency() {
|
|
$args = func_get_args();
|
|
$value = (int)array_shift($args);
|
|
|
|
$label = null;
|
|
$labels = [
|
|
'minute' => $this->getWp()->__('every minute', 'mailpoet'),
|
|
'minutes' => $this->getWp()->__('every %1$d minutes', 'mailpoet'),
|
|
'hour' => $this->getWp()->__('every hour', 'mailpoet'),
|
|
'hours' => $this->getWp()->__('every %1$d hours', 'mailpoet'),
|
|
];
|
|
|
|
if ($value >= 60) {
|
|
// we're dealing with hours
|
|
if ($value === 60) {
|
|
$label = $labels['hour'];
|
|
} else {
|
|
$label = $labels['hours'];
|
|
}
|
|
$value /= 60;
|
|
} else {
|
|
// we're dealing with minutes
|
|
if ($value === 1) {
|
|
$label = $labels['minute'];
|
|
} else {
|
|
$label = $labels['minutes'];
|
|
}
|
|
}
|
|
|
|
if ($label !== null) {
|
|
return sprintf($label, $value);
|
|
} else {
|
|
return $value;
|
|
}
|
|
}
|
|
|
|
public function getWPDateFormat() {
|
|
return $this->getWp()->getOption('date_format') ?: 'F j, Y';
|
|
}
|
|
|
|
public function getWPStartOfWeek() {
|
|
return $this->getWp()->getOption('start_of_week') ?: 0;
|
|
}
|
|
|
|
public function getMailPoetVersion() {
|
|
return MAILPOET_VERSION;
|
|
}
|
|
|
|
public function getMailPoetPremiumVersion() {
|
|
return (defined('MAILPOET_PREMIUM_VERSION')) ? MAILPOET_PREMIUM_VERSION : false;
|
|
}
|
|
|
|
public function getWPTimeFormat() {
|
|
return $this->getWp()->getOption('time_format') ?: 'g:i a';
|
|
}
|
|
|
|
public function getWPDateTimeFormat() {
|
|
return sprintf('%s %s', $this->getWPDateFormat(), $this->getWPTimeFormat());
|
|
}
|
|
|
|
public function params($key = null) {
|
|
$args = $this->getWp()->stripslashesDeep($_GET);
|
|
if (array_key_exists($key, $args)) {
|
|
return $args[$key];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public function installedInLastTwoWeeks() {
|
|
$maxNumberOfWeeks = 2;
|
|
$installedAt = Carbon::createFromFormat('Y-m-d H:i:s', $this->getSettings()->get('installed_at'));
|
|
if ($installedAt === false) {
|
|
return false;
|
|
}
|
|
return $installedAt->diffInWeeks(Carbon::now()) < $maxNumberOfWeeks;
|
|
}
|
|
|
|
public function isRtl() {
|
|
return $this->getWp()->isRtl();
|
|
}
|
|
|
|
public function getTwoLettersLocale() {
|
|
return explode('_', $this->getWp()->getLocale())[0];
|
|
}
|
|
|
|
public function getFreeDomains() {
|
|
return FreeDomains::FREE_DOMAINS;
|
|
}
|
|
|
|
public function isWoocommerceActive() {
|
|
return $this->getWooCommerceHelper()->isWooCommerceActive();
|
|
}
|
|
|
|
public function statsColor($percentage) {
|
|
if ($percentage > 3) {
|
|
return '#7ed321';
|
|
} elseif ($percentage > 1) {
|
|
return '#ff9f00';
|
|
} else {
|
|
return '#f559c3';
|
|
}
|
|
}
|
|
|
|
public function clickedStatsText($clicked) {
|
|
if ($clicked > 3) {
|
|
return __('Excellent', 'mailpoet');
|
|
} elseif ($clicked > 1) {
|
|
return __('Good', 'mailpoet');
|
|
} else {
|
|
return __('Average', 'mailpoet');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Wrapper around number_format_i18n() to return two decimals digits if the number
|
|
* is smaller than 0.1 and one decimal digit if the number is equal or greater
|
|
* than 0.1.
|
|
*
|
|
* @param int|float $number
|
|
*
|
|
* @return string
|
|
*/
|
|
public function statsNumberFormatI18n($number) {
|
|
if ($number < 0.1) {
|
|
$decimals = 2;
|
|
} else {
|
|
$decimals = 1;
|
|
}
|
|
|
|
return number_format_i18n($number, $decimals);
|
|
}
|
|
|
|
public function addReferralId($url) {
|
|
return $this->getreferralUrlDecorator()->decorate($url);
|
|
}
|
|
|
|
public function libs3rdPartyEnabled(): bool {
|
|
return $this->getSettings()->get('3rd_party_libs.enabled') === '1';
|
|
}
|
|
}
|