PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Entities / SegmentEntity.php
mailpoet / lib / Entities Last commit date
CustomFieldEntity.php 2 months ago DynamicSegmentFilterData.php 2 months ago DynamicSegmentFilterEntity.php 3 years ago FeatureFlagEntity.php 3 years ago FormEntity.php 1 week ago LogEntity.php 3 years ago NewsletterEntity.php 2 months ago NewsletterLinkEntity.php 3 years ago NewsletterOptionEntity.php 3 years ago NewsletterOptionFieldEntity.php 1 month ago NewsletterPostEntity.php 3 years ago NewsletterSegmentEntity.php 3 years ago NewsletterTemplateEntity.php 3 years ago ScheduledTaskEntity.php 1 month ago ScheduledTaskSubscriberEntity.php 1 year ago SegmentEntity.php 2 months ago SendingQueueEntity.php 2 months ago SettingEntity.php 3 years ago StatisticsBounceEntity.php 3 years ago StatisticsClickEntity.php 3 years ago StatisticsFormEntity.php 3 years ago StatisticsNewsletterEntity.php 1 year ago StatisticsOpenEntity.php 3 years ago StatisticsUnsubscribeEntity.php 2 months ago StatisticsWooCommercePurchaseEntity.php 2 years ago StatsNotificationEntity.php 3 years ago SubscriberCustomFieldEntity.php 3 years ago SubscriberEntity.php 4 days ago SubscriberIPEntity.php 3 years ago SubscriberSegmentEntity.php 3 years ago SubscriberTagEntity.php 4 years ago TagEntity.php 3 years ago UserAgentEntity.php 3 years ago UserFlagEntity.php 3 years ago WpPostEntity.php 2 years ago index.php 3 years ago
SegmentEntity.php
300 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\Entities;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Doctrine\EntityTraits\AutoincrementedIdTrait;
9 use MailPoet\Doctrine\EntityTraits\CreatedAtTrait;
10 use MailPoet\Doctrine\EntityTraits\DeletedAtTrait;
11 use MailPoet\Doctrine\EntityTraits\UpdatedAtTrait;
12 use MailPoetVendor\Doctrine\Common\Collections\ArrayCollection;
13 use MailPoetVendor\Doctrine\ORM\Mapping as ORM;
14 use MailPoetVendor\Symfony\Component\Validator\Constraints as Assert;
15
16 /**
17 * @ORM\Entity()
18 * @ORM\Table(name="segments")
19 */
20 class SegmentEntity {
21 use AutoincrementedIdTrait;
22 use CreatedAtTrait;
23 use UpdatedAtTrait;
24 use DeletedAtTrait;
25
26 const TYPE_WP_USERS = 'wp_users';
27 const TYPE_WC_USERS = 'woocommerce_users';
28 const TYPE_WC_MEMBERSHIPS = 'woocommerce_memberships';
29 const TYPE_DEFAULT = 'default';
30 const TYPE_DYNAMIC = 'dynamic';
31 const TYPE_WITHOUT_LIST = 'without-list';
32
33 const NON_WOO_RELATED_TYPES = [
34 self::TYPE_WP_USERS,
35 self::TYPE_DEFAULT,
36 self::TYPE_DYNAMIC,
37 self::TYPE_WITHOUT_LIST,
38 ];
39
40 const SEGMENT_ENABLED = 'active';
41 const SEGMENT_DISABLED = 'disabled';
42
43 /**
44 * @ORM\Column(type="string")
45 * @Assert\NotBlank()
46 * @var string
47 */
48 private $name;
49
50 /**
51 * @ORM\Column(type="string")
52 * @var string
53 */
54 private $type;
55
56 /**
57 * @ORM\Column(type="string")
58 * @var string
59 */
60 private $description;
61
62 /**
63 * @ORM\Column(type="text", nullable=true)
64 * @var string|null
65 */
66 private $publicDescription = '';
67
68 /**
69 * @ORM\OneToMany(targetEntity="MailPoet\Entities\DynamicSegmentFilterEntity", mappedBy="segment")
70 * @var ArrayCollection<int, DynamicSegmentFilterEntity>
71 */
72 private $dynamicFilters;
73
74 /**
75 * @ORM\Column(type="float", nullable=true)
76 * @var float|null
77 */
78 private $averageEngagementScore;
79
80 /**
81 * @ORM\Column(type="datetimetz", nullable=true)
82 * @var \DateTimeInterface|null
83 */
84 private $averageEngagementScoreUpdatedAt;
85
86 /**
87 * @ORM\Column(type="boolean")
88 * @var bool
89 */
90 private $displayInManageSubscriptionPage = false;
91
92 /**
93 * @ORM\Column(type="integer", nullable=true)
94 * @var int|null
95 */
96 private $confirmationEmailId;
97
98 /**
99 * @ORM\Column(type="integer", nullable=true)
100 * @var int|null
101 */
102 private $confirmationPageId;
103
104 public function __construct(
105 string $name,
106 string $type,
107 string $description
108 ) {
109 $this->name = $name;
110 $this->type = $type;
111 $this->description = $description;
112 $this->publicDescription = '';
113 $this->dynamicFilters = new ArrayCollection();
114 }
115
116 public function __clone() {
117 // reset ID
118 $this->id = null;
119 $this->dynamicFilters = new ArrayCollection();
120 }
121
122 /**
123 * @return string
124 */
125 public function getName() {
126 return $this->name;
127 }
128
129 /**
130 * @param string $name
131 */
132 public function setName($name) {
133 $this->name = $name;
134 }
135
136 /**
137 * @return string
138 */
139 public function getType() {
140 return $this->type;
141 }
142
143 /**
144 * @param string $type
145 */
146 public function setType($type) {
147 $this->type = $type;
148 }
149
150 /**
151 * @return string
152 */
153 public function getDescription() {
154 return $this->description;
155 }
156
157 /**
158 * @param string $description
159 */
160 public function setDescription($description) {
161 $this->description = $description;
162 }
163
164 public function getPublicDescription(): string {
165 return $this->publicDescription ?? '';
166 }
167
168 public function setPublicDescription(string $publicDescription): void {
169 $this->publicDescription = $publicDescription;
170 }
171
172 /**
173 * @return ArrayCollection<int, DynamicSegmentFilterEntity>
174 */
175 public function getDynamicFilters() {
176 return $this->dynamicFilters;
177 }
178
179 public function addDynamicFilter(DynamicSegmentFilterEntity $dynamicSegmentFilterEntity) {
180 $this->dynamicFilters->add($dynamicSegmentFilterEntity);
181 }
182
183 public function isStatic(): bool {
184 return in_array($this->getType(), [self::TYPE_DEFAULT, self::TYPE_WP_USERS, self::TYPE_WC_USERS, self::TYPE_WC_MEMBERSHIPS], true);
185 }
186
187 public function getAverageEngagementScore(): ?float {
188 return $this->averageEngagementScore;
189 }
190
191 public function setAverageEngagementScore(?float $averageEngagementScore): void {
192 $this->averageEngagementScore = $averageEngagementScore;
193 }
194
195 public function getAverageEngagementScoreUpdatedAt(): ?\DateTimeInterface {
196 return $this->averageEngagementScoreUpdatedAt;
197 }
198
199 public function setAverageEngagementScoreUpdatedAt(?\DateTimeInterface $averageEngagementScoreUpdatedAt): void {
200 $this->averageEngagementScoreUpdatedAt = $averageEngagementScoreUpdatedAt;
201 }
202
203 public function getDisplayInManageSubscriptionPage(): bool {
204 return $this->displayInManageSubscriptionPage;
205 }
206
207 public function setDisplayInManageSubscriptionPage(bool $state): void {
208 $this->displayInManageSubscriptionPage = $state;
209 }
210
211 public function getConfirmationEmailId(): ?int {
212 return $this->confirmationEmailId;
213 }
214
215 public function setConfirmationEmailId(?int $confirmationEmailId): void {
216 $this->confirmationEmailId = $confirmationEmailId;
217 }
218
219 public function getConfirmationPageId(): ?int {
220 return $this->confirmationPageId;
221 }
222
223 public function setConfirmationPageId(?int $confirmationPageId): void {
224 $this->confirmationPageId = $confirmationPageId;
225 }
226
227 /**
228 * Returns connect operand from the first filter, when doesn't exist, then returns a default value.
229 *
230 * For segments with multiple filter groups this is the outer connector between the groups
231 * (and/or). For legacy single-group segments it carries the within-group operator
232 * (and/or/none).
233 *
234 * @return string
235 */
236 public function getFiltersConnectOperator(): string {
237 $firstFilter = $this->getDynamicFilters()->first();
238 $filterData = $firstFilter ? $firstFilter->getFilterData() : null;
239 if (!$firstFilter || !$filterData) {
240 return DynamicSegmentFilterData::CONNECT_TYPE_AND;
241 }
242 $connect = $filterData->getParam('connect');
243 return is_string($connect) && $connect !== '' ? $connect : DynamicSegmentFilterData::CONNECT_TYPE_AND;
244 }
245
246 /**
247 * Returns dynamic filters grouped by their group_id.
248 *
249 * Legacy filters (no group_id) collapse into a single group whose operator is the
250 * legacy filters_connect value. Saved groups carry their own group_operator.
251 *
252 * @return array<int, array{operator: string, filters: DynamicSegmentFilterEntity[]}>
253 */
254 public function getFilterGroups(): array {
255 $filters = $this->getDynamicFilters()->toArray();
256 if (!$filters) {
257 return [];
258 }
259
260 $hasGroupData = false;
261 foreach ($filters as $filter) {
262 $data = $filter->getFilterData();
263 if ($data && $data->getParam('group_id') !== null) {
264 $hasGroupData = true;
265 break;
266 }
267 }
268
269 if (!$hasGroupData) {
270 return [[
271 'operator' => $this->getFiltersConnectOperator(),
272 'filters' => array_values($filters),
273 ]];
274 }
275
276 $groups = [];
277 $legacyGroupKey = 0;
278 foreach ($filters as $filter) {
279 $data = $filter->getFilterData();
280 if (!$data) {
281 continue;
282 }
283 $groupId = $data->getParam('group_id');
284 $hasNumericGroupId = is_int($groupId) || is_numeric($groupId);
285 $groupKey = $hasNumericGroupId ? (int)$groupId : $legacyGroupKey;
286 if (!isset($groups[$groupKey])) {
287 $operator = $hasNumericGroupId ? $data->getParam('group_operator') : $this->getFiltersConnectOperator();
288 $groups[$groupKey] = [
289 'operator' => is_string($operator) && $operator !== '' ? $operator : DynamicSegmentFilterData::CONNECT_TYPE_AND,
290 'filters' => [],
291 ];
292 }
293 $groups[$groupKey]['filters'][] = $filter;
294 }
295
296 ksort($groups);
297 return array_values($groups);
298 }
299 }
300