Сниппет Sendex и формы подписки\\отписки
-
Вывод формы подписки на определенную рассылку - её мы укажем по id
-
Если юзер уже подписан - тогда показываем форму отписки
-
При том и другом действие происходит отправка писем с кодом, для подтверждения
-
При переходе по коду, его ловит плагин и выполняет что нужно
Автоустановка пакетов
$builder->setPackageAttributes(array(
'changelog' => file_get_contents($sources['docs'] . 'changelog.txt')
,'license' => file_get_contents($sources['docs'] . 'license.txt')
,'readme' => file_get_contents($sources['docs'] . 'readme.txt')
// Вот он - опции установки!
,'setup-options' => array(
// Указываем использовать ресолвер setup
'source' => $sources['build'].'setup.options.php',
),
));
if ($object->xpdo) {
/* @var modX $modx */
$modx =& $object->xpdo;
$success= false;
switch ($options[xPDOTransport::PACKAGE_ACTION]) {
case xPDOTransport::ACTION_INSTALL:
case xPDOTransport::ACTION_UPGRADE:
$success = true;
break;
case xPDOTransport::ACTION_UNINSTALL:
$success = true;
break;
}
return $success;
}
case xPDOTransport::ACTION_UPGRADE:
/* Checking and installing required packages */
$packages = array(
'pdoTools' => array(
'version_major' => 1,
'version_minor:>=' => 8,
)
);
foreach ($packages as $package => $options) {
$query = array('package_name' => $package);
if (!empty($options)) {$query = array_merge($query, $options);}
if (!$modx->getObject('transport.modTransportPackage', $query)) {
$modx->log(modX::LOG_LEVEL_INFO, 'Trying to install <b>'.$package.'</b>. Please wait...');
// Собственно закачка пакета специальной функцией
$response = installPackage($package);
if ($response['success']) {$level = modX::LOG_LEVEL_INFO;}
else {$level = modX::LOG_LEVEL_ERROR;}
$modx->log($level, $response['message']);
}
}
$success = true;
break;
// Меняем $object на $tmp
foreach ($objects as $tmp) {
$manager->createObjectContainer($tmp);
//...
Подготовка файлов
-
/_build/data/transport.snippets.php - Здесь у нас указано, что нужно запаковывать сниппет Sendex, откуда его брать и какие добавлять параметры
-
/_build/properties/properties.sendex.php - Массив параметров, его мы будем изменять
-
/core/components/sendex/elements/snippets/snippet.sendex.php - Сам сниппет с выводом и обработкой форм.
-
/_build/data/transport.chunks.php - Перечень чанков для установки
-
/core/components/sendex/elements/chunks - Здесь мы создадим новые чанки
Сниппет Sendex
Sendex/core/components/sendex/elements/snippets/snippet.sendex.php
<?php
/** @var array $scriptProperties */
/** @var Sendex $Sendex */
$Sendex = $modx->getService('sendex','Sendex',$modx->getOption('sendex_core_path',null,$modx->getOption('core_path').'components/sendex/').'model/sendex/',$scriptProperties);
/** @var pdoTools $pdoTools */
$pdoTools = $modx->getService('pdoTools');
if (!($Sendex instanceof Sendex) || !($pdoTools instanceof pdoTools)) return '';
if (!$modx->user->isAuthenticated($modx->context->key)) {
return $modx->lexicon('sendex_err_auth_req');
}
if ($modx->event->name == 'OnManagerPageInit' && !$modx->user->hasSessionContext('web')) {
$modx->user->addSessionContext('web');
}
elseif (empty($id) || !$newsletter = $modx->getObject('sxNewsletter', $id)) {
return $modx->lexicon('sendex_newsletter_err_ns');
}
/** @var sxNewsletter $newsletter */
if (!$newsletter->active && empty($showInactive)) {
return $modx->lexicon('sendex_newsletter_err_disabled');
}
if ($newsletter->isSubscribed($modx->user->id)) {
return !empty($tplUnsubscribeForm)
? $pdoTools->getChunk($tplUnsubscribeForm, $newsletter->toArray())
: 'Parameter "tplUnsubscribeForm" is empty';
}
elseif (!$newsletter->isSubscribed($modx->user->id)) {
return !empty($tplSubscribeForm)
? $pdoTools->getChunk($tplSubscribeForm, $newsletter->toArray())
: 'Parameter "tplSubscribeForm" is empty';
}
public function isSubscribed($user_id = 0, $email = '') {
$q = $this->xpdo->newQuery('sxSubscriber', array('newsletter_id' => $this->get('id')));
if (!empty($id)) {
$q->where(array('user_id' => $user_id));
}
if (!empty($email)) {
$q->where(array('email' => $email));
}
return (bool) $this->xpdo->getCount('sxSubscriber', $q);
}
$tmp = array(
// Цифровое поле для указания id рассылки
'id' => array(
'type' => 'numberfield',
'value' => '',
),
// Переключатель да\нет
'showInactive' => array(
'type' => 'combo-boolean',
'value' => false,
),
// Форма подписки с чанком по умолчанию
'tplSubscribeForm' => array(
'type' => 'textfield',
'value' => 'tpl.Sendex.subscribe.form',
),
// Форма отписки с чанком по умолчанию
'tplUnsubscribeForm' => array(
'type' => 'textfield',
'value' => 'tpl.Sendex.unsubscribe.form',
),
);
Чанки подписки и отписки
-
/core/components/sendex/elements/chunks/chunk.subscribe.form.tpl
-
/core/components/sendex/elements/chunks/chunk.unsubscribe.form.tpl
$tmp = array(
'tpl.Sendex.subscribe.form' => array(
'file' => 'subscribe.form',
'description' => '',
),
'tpl.Sendex.unsubscribe.form' => array(
'file' => 'unsubscribe.form',
'description' => '',
),
);