Модуль Отписаться От Рассылки

Подскажите, пожалуйста, как бы лучше реализовать модуль "Отписать от рассылки" На отдельной странице на сайте. Спасибо!

Ох и задача.

Если ничего не напуталось и если для рассылок используется модуль "Рассылки":

1. Откройте файл app/addons/newsletters/controllers/frontend/newsletters.php и добавьте следующий код в самый конец файла:

 elseif ($mode == 'view') {
    list($page_mailing_lists) = fn_get_mailing_lists();
    Tygh::$app['view']->assign('page_mailing_lists', $page_mailing_lists);
    $email = db_get_field("SELECT email FROM ?:users WHERE user_id = ?i", $_SESSION['auth']['user_id']);
    Tygh::$app['view']->assign('email', $email);
    $mailing_lists = db_get_hash_array("SELECT * FROM ?:subscribers INNER JOIN ?:user_mailing_lists ON ?:subscribers.subscriber_id = ?:user_mailing_lists.subscriber_id WHERE ?:subscribers.email = ?s", 'list_id', $email);
    Tygh::$app['view']->assign('user_mailing_lists', $mailing_lists);
}

2. В этот же файл добавьте следующие строки:

    if ($mode == 'update') {
        $subscriber = db_get_row("SELECT * FROM ?:subscribers WHERE email = ?s", $_REQUEST['email']);
        if (!empty($_REQUEST['mailing_lists']) && !fn_is_empty($_REQUEST['mailing_lists'])) {
            if (empty($subscriber)) {
                $_data = array(
                    'email' => $_REQUEST['email'],
                    'timestamp' => TIME,
                );
            $subscriber_id = db_query("INSERT INTO ?:subscribers ?e", $_data);
        } else {
            $subscriber_id = $subscriber['subscriber_id'];
        }

        fn_update_subscriptions($subscriber_id, $_REQUEST['mailing_lists'], NULL, fn_get_notification_rules(true));
    } else {
        if (!empty($subscriber)) {
            fn_delete_subscribers($subscriber['subscriber_id']);
        }
    }
    return array(CONTROLLER_STATUS_REDIRECT, 'newsletters.view');
}</pre>

перед строкой return array(CONTROLLER_STATUS_REDIRECT); в секции if ($_SERVER['REQUEST_METHOD'] == 'POST') {

3. Создайте файл design/themes/[ВАША ТЕМА]/templates/addons/newsletters/views/newsletters/view.tpl (попутно создавая недостающие папки) следующим содержимым:

{if $page_mailing_lists}
    {capture name="mailing_lists"}
        {assign var="show_newsletters_content" value=false}
        
        
        {foreach from=$page_mailing_lists item=list}
            {if $list.show_on_registration}
                {assign var="show_newsletters_content" value=true}
            {/if}

            <div class="ty-newsletters__item{if !$list.show_on_registration} hidden{/if}">
                <input id="profile_mailing_list_{$list.list_id}" type="checkbox" name="mailing_lists[]" value="{$list.list_id}" {if $user_mailing_lists[$list.list_id]}checked="checked"{/if} class="checkbox" /><label for="profile_mailing_list_{$list.list_id}">{$list.object}</label>
            </div>
        {/foreach}
    </div>
    <input type="hidden" name="email" value="{$email}" />
    {include file="buttons/save.tpl" but_name="dispatch[newsletters.update]" but_meta="ty-btn__secondary" but_id="save_newsletters_but"}
    </form>
{/capture}

{if $show_newsletters_content}
    {include file="common/subheader.tpl" title=__("mailing_lists")}

    {$smarty.capture.mailing_lists nofilter}
    
{/if}

{/if}

Чистим как следует кеш. Как-то так

Список рассылок будет показан в том же виде, как на странице редактирования профиля - галочки с названием. Если выбрано - уже подписан в эту рассылку, если нет - то галка не выбрана. Галки можно поснимать/понаставить, чтобы отписаться/подписаться.


Решение, что называется "на коленке", особо не тестировалось


Ах да, страница будет доступна по ссылке domain.com/index.php?dispatch=newsletters.view

Список рассылок будет показан в том же виде, как на странице редактирования профиля - галочки с названием. Если выбрано - уже подписан в эту рассылку, если нет - то галка не выбрана. Галки можно поснимать/понаставить, чтобы отписаться/подписаться.


Решение, что называется "на коленке", особо не тестировалось


Ах да, страница будет доступна по ссылке domain.com/index.php?dispatch=newsletters.view

Понял, круто! Спасибо большое.

А если нужно только поле для ввода на отдельной странице с подписью: "Для отписки от рассылки введите ваш емейл"
Человек вводит емейл и мне на почту, к примеру, приходит уведомление с этим емейлом.

Понял, круто! Спасибо большое.

А если нужно только поле для ввода на отдельной странице с подписью: "Для отписки от рассылки введите ваш емейл"
Человек вводит емейл и мне на почту, к примеру, приходит уведомление с этим емейлом.

Это сложнее. Ну и запросики ;)

1. В контроллер app/addons/newsletters/controllers/frontend/newsletters.php добавляем строки:

    if ($mode == 'remove_subscriber') {
        if (empty($_REQUEST['subscribe_email']) || fn_validate_email($_REQUEST['subscribe_email']) == false) {
            fn_set_notification('E', __('error'), __('error_invalid_emails', array(
                '[emails]' => $_REQUEST['subscribe_email']
            )));
        } else {
            $subscriber = db_get_row("SELECT * FROM ?:subscribers WHERE email = ?s", $_REQUEST['subscribe_email']);
            if (empty($subscriber)) {
                fn_set_notification('E', __('error'), __('email_not_found'));
            } else {
                fn_send_newsletter('default_company_newsletter_email', $_REQUEST['subscribe_email'], __('unsubscribe_request_notification_subj'), __('unsubscribe_request_notification', array('[email]' => $_REQUEST['subscribe_email'])));
            }
        }
    }

перед return array(CONTROLLER_STATUS_REDIRECT); в секции if ($_SERVER['REQUEST_METHOD'] == 'POST')

и строку:

use Tygh\Mailer;

перед

if (!defined('BOOTSTRAP')) { die('Access denied'); }

2. Создаем файл design/themes/[ВАША ТЕМА]/templates/addons/newsletters/blocks/static_templates/unsubscribe.tpl со следующим содержимым:

{** block-description:tmpl_unsubscription **}
{if $addons.newsletters}

{__("unsubscribe")}

{__("email")} {include file="buttons/go.tpl" but_name="newsletters.remove_subscriber" alt=__("unsubscribe")}
{/if}

3. Создаем языковые переменные:

- tmpl_unsubscription - для названия блока

- email_not_found - предупреждение, что пытается отписаться человек, который не был подписан,

- unsubscribe_request_notification_subj - тема письма

- unsubscribe_request_notification - содержимое письма. В содержимое можно вставить [email], чтобы в письмо вставился этот самый емейл. Например, "Удалите меня, [email] из подписки, пожалуйста", можно с тегами html

4. Создаем блок на основе "шаблон с опреденным содержимым", где требуется.

5. Письма будут приходить на ящик, указанный в "Email в поле «Reply-To» в рассылках" в настройках.

!!!! Письмо не тестировалось !!!! Удалось протестировать только сам код и факт отправки (письмо попыталось отправиться, но у меня не настроен мейлер)

Это сложнее. Ну и запросики ;)

1. В контроллер app/addons/newsletters/controllers/frontend/newsletters.php добавляем строки:

    if ($mode == 'remove_subscriber') {
        if (empty($_REQUEST['subscribe_email']) || fn_validate_email($_REQUEST['subscribe_email']) == false) {
            fn_set_notification('E', __('error'), __('error_invalid_emails', array(
                '[emails]' => $_REQUEST['subscribe_email']
            )));
        } else {
            $subscriber = db_get_row("SELECT * FROM ?:subscribers WHERE email = ?s", $_REQUEST['subscribe_email']);
            if (empty($subscriber)) {
                fn_set_notification('E', __('error'), __('email_not_found'));
            } else {
                fn_send_newsletter('default_company_newsletter_email', $_REQUEST['subscribe_email'], __('unsubscribe_request_notification_subj'), __('unsubscribe_request_notification', array('[email]' => $_REQUEST['subscribe_email'])));
            }
        }
    }

перед return array(CONTROLLER_STATUS_REDIRECT); в секции if ($_SERVER['REQUEST_METHOD'] == 'POST')

и строку:

use Tygh\Mailer;

перед

if (!defined('BOOTSTRAP')) { die('Access denied'); }

2. Создаем файл design/themes/[ВАША ТЕМА]/templates/addons/newsletters/blocks/static_templates/unsubscribe.tpl со следующим содержимым:

{** block-description:tmpl_unsubscription **}
{if $addons.newsletters}

{__("unsubscribe")}

{__("email")} {include file="buttons/go.tpl" but_name="newsletters.remove_subscriber" alt=__("unsubscribe")}
{/if}

3. Создаем языковые переменные:

- tmpl_unsubscription - для названия блока

- email_not_found - предупреждение, что пытается отписаться человек, который не был подписан,

- unsubscribe_request_notification_subj - тема письма

- unsubscribe_request_notification - содержимое письма. В содержимое можно вставить [email], чтобы в письмо вставился этот самый емейл. Например, "Удалите меня, [email] из подписки, пожалуйста", можно с тегами html

4. Создаем блок на основе "шаблон с опреденным содержимым", где требуется.

5. Письма будут приходить на ящик, указанный в "Email в поле «Reply-To» в рассылках" в настройках.

!!!! Письмо не тестировалось !!!! Удалось протестировать только сам код и факт отправки (письмо попыталось отправиться, но у меня не настроен мейлер)

Ничего себе. Спасибо!
Попробую сделать. Я думал, что это элементарный функционал.
Просто поле отправки номера вставить в страницу.


емейла или номера, в смысле

Нет, в стандарте нет кода, который бы обработал отписку, тем более - отправил письмо.

Кстати, в сам текст рассылки в дефолте можно добавить ссылку для отписки. Для этого используется плейсхолдер %UNSUBSCRIBE_LINK

Хотелось отдельную форму, без письма со ссылкой. Ссылка для отписки и так в каждом письме приходит

Хотелось отдельную форму, без письма со ссылкой. Ссылка для отписки и так в каждом письме приходит

.. если вы знаете о плейсхолдере и добавили его

Нет, в стандарте нет кода, который бы обработал отписку, тем более - отправил письмо.

То есть нет даже формы, которая просто позволяла бы написать сообщение админу сайта?


Блок обратной связи стандартный

То есть нет даже формы, которая просто позволяла бы написать сообщение админу сайта?


Блок обратной связи стандартный

С помощью модуля Конструктор форм вы можете создать форму с любым содержимым. Например, создать отдельную страницу Отписаться от рассылки с одним полем - E-mail.

В настройках формы можно указать email, куда будут приходить данные, заполненные пользователем. В этом случае админ может получать сообщения и удалять подписчиков вручную.

То есть нет даже формы, которая просто позволяла бы написать сообщение админу сайта?


Блок обратной связи стандартный

Написать сообщение администратору можно как раз через форму "Обратная связь". Или через любую созданную конструктором форму.

Но в этом случае просто придет письмо администратору, дальше администратор должен все сделать вручную. Зато можно обойтись без правок кода.

Написать сообщение администратору можно как раз через форму "Обратная связь". Или через любую созданную конструктором форму.

Но в этом случае просто придет письмо администратору, дальше администратор должен все сделать вручную. Зато можно обойтись без правок кода.

А как эту форму вывести на отдельную страницу? Чтобы, к примеру в нижних ссылках была "Отписаться от рассылки" Кликаешь на нее и там отдельная страница, в которой текст и блок отправки сообщения админу.

Я создал отдельный макет, в котором есть этот модуль, но как привязать его к отдельной странице не понял.

1. Создаете новую форму Отписаться от рассылки здесь:

http://demo.cs-cart.com/admin.php?dispatch=pages.manage&get_tree=multi_level

2. На странице Дизайн -> Макеты -> По умолчанию добавляете ее в нужный блок в подвале

http://demo.cs-cart.com/admin.php?dispatch=block_manager.manage

3. Добавляете там новую страницу макета с параметров страницы Просмотреть страницу

4. Во вкладке Страницы этой страницы выбираете созданную форму:

http://prntscr.com/9hnxmq

P.S. Не забудьте добавить блок Основной контент на новую страницу макета, а то страница с формой пустой будет

2. На странице Дизайн -> Макеты -> По умолчанию добавляете ее в нужный блок в подвале

http://demo.cs-cart.com/admin.php?dispatch=block_manager.manage

Как конкретно ее добавить и в какой блок, не понимаю, объясните, пожалуйста.

Смотря как у вас подвал реализован, например, на демке для добавления в секцию Магазин покупателя, нужно отредактировать элементы меню: Магазин (нижняя часть сайта)

http://prntscr.com/9i33bj

http://demo.cs-cart.ru/stores/98263/panel.php?dispatch=static_data.manage&section=A&menu_id=3

Смотря как у вас подвал реализован, например, на демке для добавления в секцию Магазин покупателя, нужно отредактировать элементы меню: Магазин (нижняя часть сайта)

http://prntscr.com/9i33bj

http://demo.cs-cart.ru/stores/98263/panel.php?dispatch=static_data.manage&section=A&menu_id=3

Ура, все получилось, спасибо!

Не совсем.

https://yadi.sk/i/v7rmnE66mTdsk

Как сделать так, чтобы форма отправляла данные, даже если только одна заполнена?


И как убрать антибот?

В конструкторе форм для каждого поля есть колонка Обязательное