Кстати вопрос image_id и id_image это одно и то же или нет?
Это разные переменные.
Не понятно почему id продукта выводится '.(int)($product['product_id']).'
а id изображения нет '.(int)($product['image_id']).'
Потому что в классе Product определена переменная id_product, а переменной id_image нет.
Вы можете сами увидеть, какие переменные входят в Product, для этого откройте структуру таблицы ps_product в phpmyadmin.
Для определения id_image каждого товара в классе Product есть функция getImages или getCover.
Между отсылкой email с помощью класса PaymentModule и модуля mailalerts очень большая разница.
Переменные товара, которые будут использоваться в письме, беруться из разных классов (таблиц).
PaymentModule - список товаров из класса Product (таблица ps_product). В этом классе в массив данных добавляют id_image из таблицы ps_image
mailalerts - список товаров из класса Order (для лучшего понимания см. таблицу ps_order). В этом классе в ид изображений не добавляют в массив товаров.