Установить статус подписчика в Magento программно

Я пытаюсь написать модуль, который синхронизирует моих подписчиков на рассылку в Magento с внешней базой данных. Мне нужно иметь возможность программно обновлять статус подписки в Magento, но мне трудно заставить работать метод setStatus в Magento. Он не выдает никаких ошибок, но код, похоже, не имеет никакого эффекта. Ниже приведен код, в котором я вызываю метод:

$collection = Mage::getResourceModel('newsletter/subscriber_collection')->showStoreInfo()->showCustomerInfo();

foreach ($collection as $cust) {
    $cust->setStatus(1);
}

Теоретически это должно установить для всех моих подписчиков статус «подписан». При желании я мог бы изменить аргумент, отправленный в «setStatus», на любой из следующих целых чисел для другого статуса.

1: Подписан 2: Статус не активен 3: Отписан

Как лучше изменить статус подписчика или заставить этот код работать?


person Chuck D    schedule 25.02.2011    source источник


Ответы (3)


Вот скрипт импорта:

<?php
require_once("./app/Mage.php");
Mage::app();

$subscribers = array('[email protected]', '[email protected]');

foreach ($subscribers as $email) {
    # create new subscriber without send an confirmation email
    Mage::getModel('newsletter/subscriber')->setImportMode(true)->subscribe($email);

    # get just generated subscriber
    $subscriber = Mage::getModel('newsletter/subscriber')->loadByEmail($email);

    # change status to "subscribed" and save
    $subscriber->setStatus(Mage_Newsletter_Model_Subscriber::STATUS_SUBSCRIBED);
    $subscriber->save();
}
?>
person panticz    schedule 18.09.2012
comment
Это именно то, что я тоже искал. Вы запускаете это через терминал или просто создаете php-страницу, а затем посещаете страницу, и она запускается? - person thismethod; 28.04.2017
comment
Как подписаться с именем, фамилией? - person jafar pinjar; 10.09.2018
comment
@jafarpinjar вы не можете добавить имя и фамилию ... это ТОЛЬКО когда-либо появляется в таблице, ЕСЛИ этот подписчик также является клиентом, а имя взято из записи клиента. - person Willster; 14.05.2019

Кажется, что подписчики на рассылку также хранятся в другом месте. То, что вы настраиваете, — это просто проверка в клиентской базе для какого-то другого использования.

Вы также должны сделать следующее для каждого клиента.

Mage::getModel('newsletter/subscriber')->subscribe($email);

Полную информацию см. по этой ссылке. .

person Ozair Kafray    schedule 25.02.2011
comment
Спасибо за ответ. Ссылка, которой вы поделились, указала мне правильное направление. - person Chuck D; 01.05.2011

Благодаря ссылке, которой поделился @Ozair, я смог понять, что мне нужно сделать.

Я успешно устанавливал статус подписчика в объекте подписчика Magento, но не сохранял объект. Мне нужно было вызвать метод сохранения Magento, чтобы он вызывал ORM и записывал его в базу данных. Все, что мне нужно сделать, это добавить

$cust->save();

в цикле for. Ниже приведен весь фрагмент кода.

$collection = Mage::getResourceModel('newsletter/subscriber_collection')->showStoreInfo()->showCustomerInfo();

foreach ($collection as $cust) {
    $cust->setStatus(1);
    $cust->save();
}

Надеюсь, это поможет кому-то в будущем. Мне это было нужно для расширения Constant Contact — Magento Synchronization, которое я делал: http://www.freelunchlabs.com/store/constant-contact-and-magento-sync.html

person Chuck D    schedule 30.04.2011
comment
Привет @Chuck D, это именно то, что мне нужно. У вас не закончились какие-либо проблемы с этим, влияющие на что-либо еще? Я протестировал его на своем локальном компьютере, и он сделал именно то, что он говорит. - person thismethod; 28.04.2017
comment
Привет @thismethod, Нет, нет проблем. Если вы используете какие-либо сторонние расширения, такие как MailChimp или ConstantContact, у них обычно есть наблюдатели для события сохранения подписчика, и они будут синхронизировать изменения со сторонними... - person Chuck D; 30.04.2017