Подтверждение заказа Magento отправляется всем клиентам

8

Я вижу странное поведение в одном из наших магазинов: при размещении заказа электронное письмо с подтверждением отправляется в ЦК всем зарегистрированным клиентам, у которых заказ находится в состоянии «обработка». Это происходит независимо от способа оплаты (возможен банковский перевод и кредитная карта) и способа доставки (доступен только стандарт magento flat).

Настройка магазина довольно проста: один веб-сайт / магазин / магазин. Установленные расширения не включают ничего, связанного с заказом или оформлением заказа, кроме расширения поставщика платежных средств кредитной карты.

simonthesorcerer
источник
Спасибо за код simonthesorcerer. У меня та же проблема. Все электронные письма в Magento 1.9.1 отправляются всем клиентам с открытыми заказами (обработка или ожидание). Я не нашел решения на основе событий или какого-либо решения по этому вопросу. Я попробовал ваше решение, но оно не сработало. В app / code / local / у меня не было ни одной из следующих папок / файлов: Пространство имен / EmailQueueFix / etc / config.xml Пространство имен / EmailQueueFix / Model / Resource / Email / Queue.php. Поэтому я создал папки и файлы и скопировал код, который вы написали. Это не решило проблему все же. Вы создали вышеупомянутые папки / файлы или м
JK9
Привет, код является расширением, поэтому правильно, что вам пришлось создавать папки / файлы вручную. Этот код выполняет следующее: каждый раз, когда magento-cronjob удаляет все отправленные сообщения из таблицы базы данных core_email_queue, он также удаляет всех получателей этих сообщений. Так что, по сути, это не сработало для вас, потому что эта задача cronjob должна быть запущена хотя бы один раз, прежде чем она вступит в силу.
Симонтессор

Ответы:

7

Внимание!

Этот код выполняет следующее: каждый раз, когда magento-cronjob удаляет все отправленные сообщения из таблицы базы данных core_email_queue, он также удаляет всех получателей этих сообщений. Так что, в принципе, он не работает для вас, пока эта задача cronjob не будет запущена хотя бы один раз.

Решение

Я нашел ответ благодаря еще одному вопросу: таблица core_email_queue_recipients не была очищена cronjob. Метод Mage_Core_Model_Email_Queue::cleanQueue()вызовы Mage_Core_Model_Resource_Email_Queue::removeSentMessages(), которые довольно просты:

public function removeSentMessages() {
    $this->_getWriteAdapter()->delete($this->getMainTable(), 'processed_at IS NOT NULL');
    return $this;
}

В любом случае, этот метод не удаляет старых получателей. Таким образом, как только новое сообщение с message_id n ставится в очередь, все старые получатели с message_id n также получат новое письмо. Вещь, которую я не понимаю: почему основная команда не видела этого и почему это не приводит к большему количеству проблем?

Я написал небольшой модуль, чтобы исправить это. Он использует переопределение класса для Mage_Core_Model_Resource_Email_Queue, так что если кто-нибудь может предложить лучшее (на основе событий?) Решение, я был бы рад.

Приложение / код / ​​местные / пространство имен / EmailQueueFix / и т.д. / config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Namespace_EmailQueueFix>
            <version>1.0</version>
        </Namespace_EmailQueueFix>
    </modules>
    <global>
        <models>
            <core_resource>
                <rewrite>
                    <email_queue>Namespace_EmailQueueFix_Model_Resource_Email_Queue</email_queue>
                </rewrite>
            </core_resource>
        </models>
    </global>
</config>

Приложение / код / ​​местные / пространство имен / EmailQueueFix / Модель / Resource / Email / Queue.php

<?php

class Namespace_EmailQueueFix_Model_Resource_Email_Queue extends Mage_Core_Model_Resource_Email_Queue {
    /**
     * Remove already sent messages
     * ADDED: also remove all recipients of sent messages!
     *
     * @return Mage_Core_Model_Resource_Email_Queue
     */
    public function removeSentMessages() {
        $writeAdapter = $this->_getWriteAdapter();
        $readAdapter = $this->_getReadAdapter();
        $select = $readAdapter->select()->from(array("ceqr" => $this->getTable('core/email_recipients')), array('*'))->joinLeft(array('ceq' => $this->getMainTable()), 'ceqr.message_id = ceq.message_id', array('*'))->where('ceq.processed_at IS NOT NULL OR ceq.message_id IS NULL');
        $recipients = $readAdapter->fetchAll($select);
        if ( $recipients ) {
            foreach ( $recipients as $recipient ) {
                $writeAdapter->delete($this->getTable('core/email_recipients'), "recipient_id = " . $recipient['recipient_id']);
            }
        }
        $writeAdapter->delete($this->getMainTable(), 'processed_at IS NOT NULL');
        return $this;
    }

}

приложение / и т.д. / модули / Namespace_EmailQueueFix.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Namespace_EmailQueueFix>
            <codePool>local</codePool>
            <active>true</active>
        </Namespace_EmailQueueFix>
        <depends>
            <Mage_Core/>
        </depends>
    </modules>
</config>
simonthesorcerer
источник
2

Я опубликовал другое исправление, которое не требует установки нового модуля и, возможно, немного чище.

Он просто использует ограничение внешнего ключа для таблицы core_email_queue_recipients для удаления записей получателей в каскаде.

При использовании этого нового внешнего ключа никакие потерянные записи не останутся в таблице core_email_queue_recipients при очистке таблицы core_email_queue , поэтому дублированные сообщения не будут далее отправляться неправильным получателям.

Подробное решение вы можете найти в этом посте: https://magento.stackexchange.com/a/87299/23057.

Цезарь Реверт-Гомар
источник
ИМО, это более чистое решение, и внешний ключ должен быть включен по умолчанию.
micwallace
1

Это проблема индексов в базе данных. Вы можете восстановить его с помощью инструмента для восстановления базы данных Magento .

http://merch.docs.magento.com/ce/user_guide/magento/database-repair-tool.html

Проблема вызывает у меня много разочарований. В моем случае это произошло из-за обновления версии. Рекомендуется каждый раз, когда вы производите обновление версии, чтобы выполнить чистую установку в другом каталоге и в новой пустой справочной базе данных, затем используйте инструмент, чтобы сравнить, что структура и индексы в вашей базе данных объявлены как в новой пустой справочная база данных. Эта структура - то, что нужно новой версии! Помните, что проблема не в плохих индексах и не может быть решена с помощью повторной индексации. Больше это проблема отсутствия индексов, как я вижу. Всегда сохраняйте резервные копии базы данных перед запуском инструмента!Жаль, что даже если вы переустановите Magento, проверка индекса и структуры базы данных не будет предоставлена ​​в качестве опции, и вы должны будете выполнить описанную выше процедуру. (в моем случае было обновление с версии 1.8 до 1.9).

Vasilis.S.
источник