Skip to content

Commit 5bc1037

Browse files
authored
Add email automation system for customer segments (#326)
1 parent 013f2e4 commit 5bc1037

File tree

110 files changed

+5100
-399
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

110 files changed

+5100
-399
lines changed

.phpstorm.meta.php/blocks.meta.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,9 +994,15 @@
994994
'customersegmentation/adminhtml_segment_edit_form' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Form::class,
995995
'customersegmentation/adminhtml_segment_edit_tab_conditions' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tab_Conditions::class,
996996
'customersegmentation/adminhtml_segment_edit_tab_customers' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tab_Customers::class,
997+
'customersegmentation/adminhtml_segment_edit_tab_emailautomation' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tab_EmailAutomation::class,
998+
'customersegmentation/adminhtml_segment_edit_tab_emailsequences_renderer_delay' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tab_EmailSequences_Renderer_Delay::class,
999+
'customersegmentation/adminhtml_segment_edit_tab_emailsequencesenter' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tab_EmailSequencesEnter::class,
1000+
'customersegmentation/adminhtml_segment_edit_tab_emailsequencesexit' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tab_EmailSequencesExit::class,
9971001
'customersegmentation/adminhtml_segment_edit_tab_general' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tab_General::class,
9981002
'customersegmentation/adminhtml_segment_edit_tabs' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tabs::class,
9991003
'customersegmentation/adminhtml_segment_grid' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Grid::class,
1004+
'customersegmentation/adminhtml_segment_sequence_edit' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Sequence_Edit::class,
1005+
'customersegmentation/adminhtml_segment_sequence_edit_form' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Sequence_Edit_Form::class,
10001006
'directory/adminhtml_country' => \Mage_Directory_Block_Adminhtml_Country::class,
10011007
'directory/adminhtml_country_edit' => \Mage_Directory_Block_Adminhtml_Country_Edit::class,
10021008
'directory/adminhtml_country_edit_form' => \Mage_Directory_Block_Adminhtml_Country_Edit_Form::class,
@@ -2301,9 +2307,15 @@
23012307
'customersegmentation/adminhtml_segment_edit_form' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Form::class,
23022308
'customersegmentation/adminhtml_segment_edit_tab_conditions' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tab_Conditions::class,
23032309
'customersegmentation/adminhtml_segment_edit_tab_customers' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tab_Customers::class,
2310+
'customersegmentation/adminhtml_segment_edit_tab_emailautomation' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tab_EmailAutomation::class,
2311+
'customersegmentation/adminhtml_segment_edit_tab_emailsequences_renderer_delay' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tab_EmailSequences_Renderer_Delay::class,
2312+
'customersegmentation/adminhtml_segment_edit_tab_emailsequencesenter' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tab_EmailSequencesEnter::class,
2313+
'customersegmentation/adminhtml_segment_edit_tab_emailsequencesexit' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tab_EmailSequencesExit::class,
23042314
'customersegmentation/adminhtml_segment_edit_tab_general' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tab_General::class,
23052315
'customersegmentation/adminhtml_segment_edit_tabs' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Edit_Tabs::class,
23062316
'customersegmentation/adminhtml_segment_grid' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Grid::class,
2317+
'customersegmentation/adminhtml_segment_sequence_edit' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Sequence_Edit::class,
2318+
'customersegmentation/adminhtml_segment_sequence_edit_form' => \Maho_CustomerSegmentation_Block_Adminhtml_Segment_Sequence_Edit_Form::class,
23072319
'directory/adminhtml_country' => \Mage_Directory_Block_Adminhtml_Country::class,
23082320
'directory/adminhtml_country_edit' => \Mage_Directory_Block_Adminhtml_Country_Edit::class,
23092321
'directory/adminhtml_country_edit_form' => \Mage_Directory_Block_Adminhtml_Country_Edit_Form::class,

.phpstorm.meta.php/helpers.meta.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
'configurableswatches/productlist' => \Mage_ConfigurableSwatches_Helper_Productlist::class,
4040
'configurableswatches/swatchdimensions' => \Mage_ConfigurableSwatches_Helper_Swatchdimensions::class,
4141
'currencysymbol/data' => \Mage_CurrencySymbol_Helper_Data::class,
42+
'customersegmentation/coupon' => \Maho_CustomerSegmentation_Helper_Coupon::class,
4243
'customersegmentation/data' => \Maho_CustomerSegmentation_Helper_Data::class,
4344
'giftmessage/data' => \Mage_GiftMessage_Helper_Data::class,
4445
'giftmessage/message' => \Mage_GiftMessage_Helper_Message::class,

.phpstorm.meta.php/models.meta.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,9 +1138,15 @@
11381138
'customer_resource/group_collection' => \Mage_Customer_Model_Resource_Group_Collection::class,
11391139
'customer_resource/setup' => \Mage_Customer_Model_Resource_Setup::class,
11401140
'customersegmentation/cron' => \Maho_CustomerSegmentation_Model_Cron::class,
1141+
'customersegmentation/emailsequence' => \Maho_CustomerSegmentation_Model_EmailSequence::class,
1142+
'customersegmentation/observer_emailautomation' => \Maho_CustomerSegmentation_Model_Observer_EmailAutomation::class,
11411143
'customersegmentation/observer_pricerule' => \Maho_CustomerSegmentation_Model_Observer_PriceRule::class,
1144+
'customersegmentation/resource_emailsequence' => \Maho_CustomerSegmentation_Model_Resource_EmailSequence::class,
1145+
'customersegmentation/resource_emailsequence_collection' => \Maho_CustomerSegmentation_Model_Resource_EmailSequence_Collection::class,
11421146
'customersegmentation/resource_segment' => \Maho_CustomerSegmentation_Model_Resource_Segment::class,
11431147
'customersegmentation/resource_segment_collection' => \Maho_CustomerSegmentation_Model_Resource_Segment_Collection::class,
1148+
'customersegmentation/resource_sequenceprogress' => \Maho_CustomerSegmentation_Model_Resource_SequenceProgress::class,
1149+
'customersegmentation/resource_sequenceprogress_collection' => \Maho_CustomerSegmentation_Model_Resource_SequenceProgress_Collection::class,
11441150
'customersegmentation/rule_condition_segment' => \Maho_CustomerSegmentation_Model_Rule_Condition_Segment::class,
11451151
'customersegmentation/segment' => \Maho_CustomerSegmentation_Model_Segment::class,
11461152
'customersegmentation/segment_condition_abstract' => \Maho_CustomerSegmentation_Model_Segment_Condition_Abstract::class,
@@ -1156,8 +1162,13 @@
11561162
'customersegmentation/segment_condition_order_items' => \Maho_CustomerSegmentation_Model_Segment_Condition_Order_Items::class,
11571163
'customersegmentation/segment_condition_product_viewed' => \Maho_CustomerSegmentation_Model_Segment_Condition_Product_Viewed::class,
11581164
'customersegmentation/segment_condition_product_wishlist' => \Maho_CustomerSegmentation_Model_Segment_Condition_Product_Wishlist::class,
1165+
'customersegmentation/sequenceprogress' => \Maho_CustomerSegmentation_Model_SequenceProgress::class,
1166+
'customersegmentation_resource/emailsequence' => \Maho_CustomerSegmentation_Model_Resource_EmailSequence::class,
1167+
'customersegmentation_resource/emailsequence_collection' => \Maho_CustomerSegmentation_Model_Resource_EmailSequence_Collection::class,
11591168
'customersegmentation_resource/segment' => \Maho_CustomerSegmentation_Model_Resource_Segment::class,
11601169
'customersegmentation_resource/segment_collection' => \Maho_CustomerSegmentation_Model_Resource_Segment_Collection::class,
1170+
'customersegmentation_resource/sequenceprogress' => \Maho_CustomerSegmentation_Model_Resource_SequenceProgress::class,
1171+
'customersegmentation_resource/sequenceprogress_collection' => \Maho_CustomerSegmentation_Model_Resource_SequenceProgress_Collection::class,
11611172
'dataflow/batch' => \Mage_Dataflow_Model_Batch::class,
11621173
'dataflow/batch_abstract' => \Mage_Dataflow_Model_Batch_Abstract::class,
11631174
'dataflow/batch_export' => \Mage_Dataflow_Model_Batch_Export::class,
@@ -3715,9 +3726,15 @@
37153726
'customer_resource/group_collection' => \Mage_Customer_Model_Resource_Group_Collection::class,
37163727
'customer_resource/setup' => \Mage_Customer_Model_Resource_Setup::class,
37173728
'customersegmentation/cron' => \Maho_CustomerSegmentation_Model_Cron::class,
3729+
'customersegmentation/emailsequence' => \Maho_CustomerSegmentation_Model_EmailSequence::class,
3730+
'customersegmentation/observer_emailautomation' => \Maho_CustomerSegmentation_Model_Observer_EmailAutomation::class,
37183731
'customersegmentation/observer_pricerule' => \Maho_CustomerSegmentation_Model_Observer_PriceRule::class,
3732+
'customersegmentation/resource_emailsequence' => \Maho_CustomerSegmentation_Model_Resource_EmailSequence::class,
3733+
'customersegmentation/resource_emailsequence_collection' => \Maho_CustomerSegmentation_Model_Resource_EmailSequence_Collection::class,
37193734
'customersegmentation/resource_segment' => \Maho_CustomerSegmentation_Model_Resource_Segment::class,
37203735
'customersegmentation/resource_segment_collection' => \Maho_CustomerSegmentation_Model_Resource_Segment_Collection::class,
3736+
'customersegmentation/resource_sequenceprogress' => \Maho_CustomerSegmentation_Model_Resource_SequenceProgress::class,
3737+
'customersegmentation/resource_sequenceprogress_collection' => \Maho_CustomerSegmentation_Model_Resource_SequenceProgress_Collection::class,
37213738
'customersegmentation/rule_condition_segment' => \Maho_CustomerSegmentation_Model_Rule_Condition_Segment::class,
37223739
'customersegmentation/segment' => \Maho_CustomerSegmentation_Model_Segment::class,
37233740
'customersegmentation/segment_condition_abstract' => \Maho_CustomerSegmentation_Model_Segment_Condition_Abstract::class,
@@ -3733,8 +3750,13 @@
37333750
'customersegmentation/segment_condition_order_items' => \Maho_CustomerSegmentation_Model_Segment_Condition_Order_Items::class,
37343751
'customersegmentation/segment_condition_product_viewed' => \Maho_CustomerSegmentation_Model_Segment_Condition_Product_Viewed::class,
37353752
'customersegmentation/segment_condition_product_wishlist' => \Maho_CustomerSegmentation_Model_Segment_Condition_Product_Wishlist::class,
3753+
'customersegmentation/sequenceprogress' => \Maho_CustomerSegmentation_Model_SequenceProgress::class,
3754+
'customersegmentation_resource/emailsequence' => \Maho_CustomerSegmentation_Model_Resource_EmailSequence::class,
3755+
'customersegmentation_resource/emailsequence_collection' => \Maho_CustomerSegmentation_Model_Resource_EmailSequence_Collection::class,
37363756
'customersegmentation_resource/segment' => \Maho_CustomerSegmentation_Model_Resource_Segment::class,
37373757
'customersegmentation_resource/segment_collection' => \Maho_CustomerSegmentation_Model_Resource_Segment_Collection::class,
3758+
'customersegmentation_resource/sequenceprogress' => \Maho_CustomerSegmentation_Model_Resource_SequenceProgress::class,
3759+
'customersegmentation_resource/sequenceprogress_collection' => \Maho_CustomerSegmentation_Model_Resource_SequenceProgress_Collection::class,
37383760
'dataflow/batch' => \Mage_Dataflow_Model_Batch::class,
37393761
'dataflow/batch_abstract' => \Mage_Dataflow_Model_Batch_Abstract::class,
37403762
'dataflow/batch_export' => \Mage_Dataflow_Model_Batch_Export::class,

.phpstorm.meta.php/registry.meta.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
current_customer,
2828
current_customer_segment,
2929
current_dataflow_session_id,
30+
current_email_sequence,
3031
current_email_template,
3132
current_entity_key,
3233
current_group,

.phpstorm.meta.php/resource_models.meta.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,12 @@
236236
'customer_resource/group' => \Mage_Customer_Model_Resource_Group::class,
237237
'customer_resource/group_collection' => \Mage_Customer_Model_Resource_Group_Collection::class,
238238
'customer_resource/setup' => \Mage_Customer_Model_Resource_Setup::class,
239+
'customersegmentation_resource/emailsequence' => \Maho_CustomerSegmentation_Model_Resource_EmailSequence::class,
240+
'customersegmentation_resource/emailsequence_collection' => \Maho_CustomerSegmentation_Model_Resource_EmailSequence_Collection::class,
239241
'customersegmentation_resource/segment' => \Maho_CustomerSegmentation_Model_Resource_Segment::class,
240242
'customersegmentation_resource/segment_collection' => \Maho_CustomerSegmentation_Model_Resource_Segment_Collection::class,
243+
'customersegmentation_resource/sequenceprogress' => \Maho_CustomerSegmentation_Model_Resource_SequenceProgress::class,
244+
'customersegmentation_resource/sequenceprogress_collection' => \Maho_CustomerSegmentation_Model_Resource_SequenceProgress_Collection::class,
241245
'dataflow_resource/batch' => \Mage_Dataflow_Model_Resource_Batch::class,
242246
'dataflow_resource/batch_abstract' => \Mage_Dataflow_Model_Resource_Batch_Abstract::class,
243247
'dataflow_resource/batch_collection' => \Mage_Dataflow_Model_Resource_Batch_Collection::class,

.rector.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
CodeQuality\Ternary\SimplifyTautologyTernaryRector::class,
3030
DeadCode\ClassMethod\RemoveUselessParamTagRector::class,
3131
DeadCode\ClassMethod\RemoveUselessReturnTagRector::class,
32+
DeadCode\MethodCall\RemoveNullArgOnNullDefaultParamRector::class,
3233
DeadCode\Property\RemoveUselessVarTagRector::class,
3334
Rector\CodingStyle\Rector\FuncCall\ConsistentImplodeRector::class,
3435
Rector\Php71\Rector\List_\ListToArrayDestructRector::class,
@@ -43,4 +44,4 @@
4344
'sensitive_parameters' => [
4445
'apiKey', 'email', 'useremail', 'username', 'password'
4546
],
46-
]);
47+
]);

CLAUDE.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ try {
142142
- **NEVER use Varien_Date or Zend_Date** - Use native PHP DateTime and `Mage_Core_Model_Locale` methods.
143143
- **NEVER use Zend_Db or Zend_Db_Select directly** - Use `Maho\Db\Select` and `Maho\Db\Adapter\AdapterInterface`.
144144
- **NEVER use Varien_ prefixed classes in new code** - All Varien classes have been moved to the Maho namespace. Use the new `Maho\*` classes instead (see Varien Migration section below).
145+
- **NEVER use TinyMCE** - It has been completely removed from Maho. Use TipTap 3.x (see WYSIWYG Editor section below).
145146

146147
### General Guidelines
147148
- When you write CSS, use the most modern features, do not care for Internet Explorer or old unsupported browsers.
@@ -338,6 +339,21 @@ new Maho\Io\File();
338339
new Maho\Event\Observer();
339340
```
340341

342+
### WYSIWYG Editor (TipTap 3.x)
343+
344+
**Configuration Location:**
345+
- Extensions: `public/js/mage/adminhtml/wysiwyg/tiptap/extensions.js`
346+
- Setup: `public/js/mage/adminhtml/wysiwyg/tiptap/setup.js`
347+
- Styles: `public/js/mage/adminhtml/wysiwyg/tiptap/tiptap.css`
348+
349+
**Features:**
350+
- All nodes support `class` and `style` attributes
351+
- Custom Maho extensions for widgets, images, and slideshows
352+
- Directive support for `{{widget}}` and `{{config}}` syntax
353+
- HTML5 content conversion to/from plain text
354+
- Table editing with bubble menu
355+
- Fullscreen mode
356+
341357
### Other Components
342358

343359
- **Exceptions**: Use `Mage_Core_Exception` (Zend_Exception removed)

app/code/core/Mage/Admin/Model/Config.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public function loadAclResources(Mage_Admin_Model_Acl $acl, $resource = null, $p
7777
}
7878

7979
if (isset($resource->all)) {
80-
$acl->addResource(Mage::getModel('admin/acl_resource', 'all'), null);
80+
$acl->addResource(Mage::getModel('admin/acl_resource', 'all'));
8181
}
8282

8383
if (isset($resource->admin)) {

app/code/core/Mage/Admin/Model/Observer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public function actionPreDispatchAdmin($observer)
5454
$password = $postLogin['password'] ?? '';
5555
$twofaVerificationCode = $postLogin['twofa_verification_code'] ?? '';
5656
$session->login($username, $password, $request, $twofaVerificationCode);
57-
$request->setPost('login', null);
57+
$request->setPost('login');
5858
} else {
5959
if (!$request->getParam('messageSent')) {
6060
Mage::getSingleton('adminhtml/session')->addError(

app/code/core/Mage/Admin/Model/User.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -885,10 +885,10 @@ public function isResetPasswordLinkTokenExpired()
885885
*/
886886
public function cleanPasswordsValidationData()
887887
{
888-
$this->setData('password', null);
889-
$this->setData('current_password', null);
890-
$this->setData('new_password', null);
891-
$this->setData('password_confirmation', null);
888+
$this->setData('password');
889+
$this->setData('current_password');
890+
$this->setData('new_password');
891+
$this->setData('password_confirmation');
892892
return $this;
893893
}
894894

@@ -970,7 +970,7 @@ public function getTwofaSecret(): ?string
970970
public function setTwofaSecret(#[\SensitiveParameter] ?string $secret): self
971971
{
972972
if ($secret === null) {
973-
$this->setData('twofa_secret', null);
973+
$this->setData('twofa_secret');
974974
} else {
975975
$encrypted = Mage::helper('core')->getEncryptor()->encrypt($secret);
976976
$this->setData('twofa_secret', $encrypted);

0 commit comments

Comments
 (0)