Page 1 of 3

One thing to improve Phoenix

Posted: Tue Feb 10, 2026 12:32 pm
by burt
If you have an idea, please let me know that ONE thing you have always thought might improve the Phoenix software or improve the wider Phoenix ecosphere. I don't have much time available for big changes, but I am open to any and all ideas.

Re: One thing to improve Phoenix

Posted: Wed Feb 11, 2026 3:01 am
by frankl
Tabbed customers page in admin? Should be the same as products and orders

Re: One thing to improve Phoenix

Posted: Thu Feb 12, 2026 6:40 am
by frankl
Maybe also a way to select the way emails are sent?

sendmail
smtp
mailchimp
mailerlite
active campaign

etc

Probably a huge job :)

Re: One thing to improve Phoenix

Posted: Thu Feb 12, 2026 10:07 am
by burt
frankl wrote: Wed Feb 11, 2026 3:01 am Tabbed customers page in admin? Should be the same as products and orders
TY

https://github.com/CE-PhoenixCart/Phoen ... ef0cdc2a66

Re: One thing to improve Phoenix

Posted: Thu Feb 12, 2026 10:11 am
by burt
frankl wrote: Thu Feb 12, 2026 6:40 am Maybe also a way to select the way emails are sent?

sendmail
smtp
mailchimp
mailerlite
active campaign

etc

Probably a huge job :)
Yes, that would be a task. Do-able, as all tasks are, but not straightforward at all.
Certainly would not want to attempt this as part of the "usual schedule".

From memory;

sendmail is more or less the default
smtp (admin I think has some stuff related to it, but user needs to add a free addon, unsure of historical reasoning)
mailchimp (newsletter isn't it? maybe mandrill, which I have worked with in the pasat, but quite a few years back

mailerlite and active campaign I am unaware of. Active campaign sounds newslettery?

Re: One thing to improve Phoenix

Posted: Thu Feb 12, 2026 10:04 pm
by frankl
I use Mandrill (now called Mailchimp Transactional) for order updates etc which I find more reliable delivery wise than sendmail. I don't use Mailchimp for newsletters through Phoenix Cart Admin.

It wasn't too difficult, just added a simple mailchimp connector

Code: Select all

<?php
class MailchimpTransactional {
    private $api_key;
    private $api_url = 'https://mandrillapp.com/api/1.0/messages/send.json';

    public function __construct() {
		if (!defined('MODULE_HEADER_TAGS_MAILCHIMP_TRANSACTIONAL_API_KEY')) {
			throw new Exception('MODULE_HEADER_TAGS_MAILCHIMP_TRANSACTIONAL_API_KEY is not defined.');
		}
		$this->api_key = MODULE_HEADER_TAGS_MAILCHIMP_TRANSACTIONAL_API_KEY;
	}

    public function sendEmail($to_name, $to_email_address, $email_subject, $email_text, $from_email_name, $from_email_address, $attachments = []) {
        $postData = [
            'key' => $this->api_key,
            'message' => [
                'from_email' => $from_email_address,
                'from_name' => $from_email_name,
                'subject' => $email_subject,
                'html' => $email_text,
                'to' => [
                    [
                        'email' => $to_email_address,
                        'name' => $to_name,
                        'type' => 'to'
                    ]
                ]
            ]
        ];
		
		if (!empty($attachments)) {
			foreach ($attachments as $attachment) {
				$postData['message']['attachments'][] = $attachment;
			}
		}

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this->api_url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json'
        ]);

        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($httpCode == 200) {
            $responseArray = json_decode($response, true);
            if (isset($responseArray[0]['status']) && $responseArray[0]['status'] === 'sent') {
                return ['success' => true, 'message' => 'Email sent successfully.'];
            } else {
                return ['success' => false, 'message' => 'Error sending email: ' . json_encode($responseArray)];
            }
        } else {
            return ['success' => false, 'message' => 'HTTP Error: ' . $httpCode . ' - ' . $response];
        }
    }
}
and created new notification modules, for example:

Code: Select all

<?php
/*
  Mailchimp Transactional for Phoenix Cart

  Copyright (c) 2025 F. Ludriks

  Released under the GNU General Public License
*/

class n_password_forgotten_mailchimp extends abstract_module {

    const CONFIG_KEY_BASE = 'MODULE_NOTIFICATIONS_PASSWORD_FORGOTTEN_MAILCHIMP_';

    const TRIGGERS = [ 'password_forgotten' ];
    const REQUIRES = [ 'email_address' ];

    public function notify($data) {
		$mailer = new MailchimpTransactional;

        ob_start();
        include Guarantor::ensure_global('Template')->map(__FILE__);
        echo $GLOBALS['hooks']->cat('passwordForgottenNotification');
		$response = $mailer->sendEmail($data['name'], $data['email'], sprintf(MODULE_NOTIFICATIONS_PASSWORD_FORGOTTEN_MAILCHIMP_SUBJECT, STORE_NAME), ob_get_clean(), STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
        return json_encode($response);
    }

    protected function get_parameters() {
        return [
            static::CONFIG_KEY_BASE . 'STATUS' => [
                'title' => 'Enable Password Forgotten Notification module',
                'value' => 'True',
                'desc' => 'Do you want to add the module to your shop?',
                'set_func' => "Config::select_one(['True', 'False'], ",
            ],
        ];
    }

}
Plus a template and language file for each of course

Code: Select all

<?php
$output = '<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Password Forgotten - ' . STORE_NAME . '</title>
</head>
<body style="margin: 0; padding: 0; background-color: #f4f4f4;">
<table width="100%" cellspacing="0" cellpadding="0" border="0" bgcolor="#f4f4f4">
    <tr>
        <td align="center">
            <table width="600" cellspacing="0" cellpadding="20" border="0" bgcolor="#ffffff" style="border-radius: 10px; box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1);">

                <!-- Logo -->
                    <tr>
                        <td align="center" style="padding: 20px;">
                            <img src="' . HTTP_SERVER . '/images/' . STORE_LOGO . '" width="200" style="display: block;" alt="' . STORE_NAME . ' Logo">
                        </td>
                    </tr>
                <!-- Title & Description -->
                <tr>
                    <td align="center" style="font-family: Arial, sans-serif; color: #333333; padding: 20px;">
                        <h1 style="margin: 0; font-size: 24px;">'
                            . sprintf(MODULE_NOTIFICATIONS_PASSWORD_FORGOTTEN_MAILCHIMP_TITLE, $data['name']) .
                            '</h1>

                        <p style="margin: 15px 0 25px 0; font-size: 16px; color: #555555;">'
                            . nl2br(sprintf(MODULE_NOTIFICATIONS_PASSWORD_FORGOTTEN_MAILCHIMP_RESET_BODY, '')) .
                            '</p>

                        <!-- Reset Password Button -->
                        <table cellspacing="0" cellpadding="0" border="0" align="center">
                            <tr>
                                <td align="center" bgcolor="#198754" style="border-radius: 6px;">
                                    <a href="' . htmlspecialchars($data['reset_url'], ENT_QUOTES, 'UTF-8') . '"
                                       target="_blank"
                                       style="display:inline-block;padding:14px 28px;font-size:16px;font-family:Arial,sans-serif;color:#ffffff;text-decoration:none;font-weight:bold;border-radius:6px;">
                                        Reset Your Password
                                    </a>
                                </td>
                            </tr>
                        </table>

                        <p style="margin-top: 15px; font-size: 13px; color: #999999;">
                            Or copy and paste this link into your browser:<br>
                            <a href="' . htmlspecialchars($data['reset_url'], ENT_QUOTES, 'UTF-8') . '"
                               style="color:#007bff; word-break: break-all;">'
                                . htmlspecialchars($data['reset_url'], ENT_QUOTES, 'UTF-8') .
                                '</a>
                        </p>

                        <p style="margin-top: 25px; font-size: 14px; color: #777777;">
                            This link will expire after 24 hours or once your password has been changed.
                        </p>
						<p style="margin-top: 25px; font-size: 14px; color: #777777;">
							' . MODULE_NOTIFICATIONS_PASSWORD_FORGOTTEN_MAILCHIMP_IGNORE . '
                        </p>
                    </td>
                </tr>

                <!-- Contact & Footer -->
                <tr>
                    <td align="center" style="font-family: Arial, sans-serif; color: #555555; font-size: 14px;">
                        <p>If you have any questions, please reply to this email.</p>
                        <p>' . STORE_NAME . ' • ABN: ' . STORE_TAX_ID . ' • ' . STORE_ADDRESS . ' • ' . STORE_PHONE . '</p>
                        <p><a href="' . HTTP_SERVER . '/contact_us.php" style="color: #007bff; text-decoration: none;">Need help? Contact Us</a></p>
                    </td>
                </tr>

                <tr>
                    <td align="center" bgcolor="#333333" style="font-family: Arial, sans-serif; color: #ffffff; font-size: 14px; padding: 10px; border-radius: 0 0 10px 10px;">
                        <p>Thank you for shopping with us!</p>
                    </td>
                </tr>

            </table>
        </td>
    </tr>
</table>
</body>
</html>';

echo $output;

Code: Select all

<?php
const MODULE_NOTIFICATIONS_PASSWORD_FORGOTTEN_MAILCHIMP_TEXT_TITLE = 'Password Forgotten for Mailchimp';
const MODULE_NOTIFICATIONS_PASSWORD_FORGOTTEN_MAILCHIMP_TEXT_DESCRIPTION = 'Send a notification when customer needs a password reset.';

const MODULE_NOTIFICATIONS_PASSWORD_FORGOTTEN_MAILCHIMP_SUBJECT = '%s - New Password';
const MODULE_NOTIFICATIONS_PASSWORD_FORGOTTEN_MAILCHIMP_TITLE = 'Hello %s' . "\n\n";
const MODULE_NOTIFICATIONS_PASSWORD_FORGOTTEN_MAILCHIMP_RESET_BODY = 'A new password has been requested for your profile at ' . STORE_NAME . '.' . "\n\n" . 'Please follow this personal link to securely change your password:' . "\n\n";
const MODULE_NOTIFICATIONS_PASSWORD_FORGOTTEN_MAILCHIMP_IGNORE = 'Please ignore if it wasn\'t you that requested to change your password.' . "\n\n";

Re: One thing to improve Phoenix

Posted: Thu Feb 12, 2026 10:11 pm
by frankl
This is what the customer receives
password_forgotten.png

Re: One thing to improve Phoenix

Posted: Fri Feb 13, 2026 2:15 am
by Pierre_P
One thing to improve in my opinion is the process for a new installation.

Installing default settings becomes a nightmare for any user when they first reach the admin side and they see
all the settings is set so specific American standards.
As each user is unique, how about adding a new page for changing the default settings like country, zones, currencies and a whole list that can be added onto during install wizard?

This upfront configuration would significantly reduce the frustration new users could experience trying to locate and modify scattered settings after installation pondering on what to do next.
Consider this: Phoenix (like any other cart) is essentially as complex as setting up accounting software - you see all the features but none is making sense yet.
Users need clear guidance on how to configure it properly from the start. Without this, frustration and uncertainty can derail adoption before users even get their store running.

A guided setup would help users understand the platform's structure while ensuring their store is properly configured for their market from day one.

Re: One thing to improve Phoenix

Posted: Sat Feb 14, 2026 9:33 pm
by frankl
burt wrote: Thu Feb 12, 2026 10:07 am
frankl wrote: Wed Feb 11, 2026 3:01 am Tabbed customers page in admin? Should be the same as products and orders
TY

https://github.com/CE-PhoenixCart/Phoen ... ef0cdc2a66
Wow, awesome!

Re: One thing to improve Phoenix

Posted: Sun Feb 15, 2026 4:05 pm
by Omar_one
on the old days we used
- Mailchimp v3 add-on created by @burt (Built for Community Responsive) I still have the zip files :) (not working phoenixcart).
- Mailchimp newsletter Everywhere for footer box, we still have it installed on v1.08.16.

There is mailbeez module https://www.mailbeez.com/documentation/ ... CE-Phoenix I haven't tried.