У кого проблемы с обновлением до последних бета-версий модуля mail и матерится на то, что ключ `UX_B_MAIL_USER_RELATION` уже существует, перейдите в настройки->инсрументы->SQL запрос и выполните там запрос на удаление этого ключа, с обновлением заново создастся
ALT ER TABLE `b_mail_user_relations` DR OP INDEX `UX_B_MAIL_USER_RELATION`;
На днях покупал корм для питомца, магазин был на 1С-Битрикс
Выглядело примерно так: – выбрал товары; – оформил заказ, пароль сгенерировал автоматически; – после выходных менеджер одобрил заказ и мне пришло письмо, что я могу оплатить заказ;
Казалось бы, я был рад, что нужный корм оказался в наличии... Но перейдя из ссылки в письме мне пришлось тратить время на восстановление пароля, тогда-то я и подумал, что хорошо бы этому магазину приобрести мой модуль и не парить мозг последующим покупателям А заодно и пришла идея обновления – вставлять ссылки на оплату заказа у платежного агрегатора сразу в письмо о подтверждении заказа!
Придумал – выпустил обновление:
1) ссылки на оплату заказа можно вставлять сразу в письмо!
Пример!
Для текстовых писем: Для оплаты заказа перейдите по ссылке #ITD_REDIRECT_TO_PAYMENT# .
Для HTML писем: Для оплаты заказа перейдите <a href="#ITD_REDIRECT_TO_PAYMENT#">по ссылке</a> .
2) у модуля появилась страница настроек ("Настройки – Настройки продукта – Настройки модулей") ; 3) теперь в настройках модуля можно выбрать, заказы в каких статусах нельзя оплачивать через этот модуль;
И самое интересное – теперь каждый из вас может попробовать модуль бесплатно! Добавлен демо-ремим на 5 дней!
Александр Гусев , я писал к тому, что XX% клиентов не готовы тратить дополнительные деньги на доработку своего магазина. при этом YY% клиентов покупая Битрикс не знают о всех его скрытых недостатках или о его собственном мировоззрении на то, как все должны работать Да и не могут знать - они не профи.= и не обязаны это делать.
Вот и ездят кто как может. Кто то на желтой калине с пятью запасными, кто-то учится сам ремонтировать, а кто-то в сервис )
Я все жду когда появится в битриксе авторизация по ссылке. Ровно год назад я писал об этом небольшой пост https://dev.1c-bitrix.ru/community/web...log/11284/ про модуль Антона Долганина "Автологин". Отличный модуль, но не всё умеет чего хотелось бы. PS. Тем кто подумал "Да это же не секурно!": Ясен пень, что при авторизации по ссылке нужна возможность устанавливать срок жизни таких ссылок.
Необходимо было реализовать функционал отправки электронных ключей в подарок. Т.е. пользоватлеь покупает электронный ключ, оплачивает покупку и во время оплаты указывает дату/время отправки подарка и на какой email отправлять.
Вроде все нормально, повешал событие OnBeforeEventSend , в котором хотел отпинывать неактуальные письма до тех пор, пока бы не пришел их час.
Код события довольно простой (SEND_DATE -- свойство в письме, содержащее дату в которую необходимо отправить письмо):
function OnBeforeEventSend($arFields) {
if (empty($arFields['SEND_DATE'])) {
return true;
}
if (strtotime($arFields['SEND_DATE']) <= time()) {
return true;
}
return false;
}
Т.е. если дата отправки не задана, то письмо улетает без проблем. Если дата задана и еще не наступила, то откладываем письмо в недолгий ящик.
И тут пришла она, проблема! В файле /bitrix/modules/main/classes/general/event.php , в функции CEvent::HandleEvent() вызывается обработчик OnBeforeEventSend, но не важно что вернет этот обработчик, письмо отошлется.
Лирическое отступление... Разработчики ядра Битрикс, обращение к вам! Хотелось бы, что бы вы допилили логику отправки event'ов, что бы была реакция на обработчик OnBeforeEventSend .
Теперь расскажу, как я это допилил, в ядре, стыд, да. Но я это делал с надеждой, что в скором времени разработчики ядра исполнят мое пожелание, так как оно вполне логично обоснуемо!
По человечески говоря, если событие вернет false, то письмо не отправляется и статус ему присваевается N , якобы оно еще не отсылалось. Насчет устанавливаемого статуса можно поспорить, конечно, но мне было нужно именно такое поведение .
Изменил немного mysql запросы в функции CheckEvents(), добавив условие
AND (NOW() > ADDTIME(DATE_EXEC, '0:1:0') OR ISNULL(DATE_EXEC)) ORDER BY DATE_EXEC ASC
То есть, если отправка письма еще не запускалась, либо с последней отправки уже прошло 10 минут, причем отправляются сначала письма, которые еще ни разу не пытались отправиться, у них DATE_EXEC NULL и они будут в выборке первыми. Если их не выбирать первыми, то очередь отправки забьется подарочными письмами, если у вас конечно хотя бы не по 10 хитов в минуту и 10 подарочных писем всего, грубо говоря.
Получилось два запроса в итоге.
$strSql=
"SEL ECT 'x' ".
"FR OM b_event ".
"WHERE SUCCESS_EXEC='N' ".
"AND (NOW() > ADDTIME(DATE_EXEC, '0:10:0') OR ISNULL(DATE_EXEC)) ".
"ORDER BY DATE_EXEC ASC " .
"LIMIT 1";
и
$strSql = "
SELECT ID, C_FIELDS, EVENT_NAME, MESSAGE_ID, LID, DATE_FORMAT(DATE_INSERT, '%d.%m.%Y %H:%i:%s') as DATE_INSERT, DUPLICATE
FR OM b_event
WH ERE SUCCESS_EXEC='N'
AND (NOW() > ADDTIME(DATE_EXEC, '0:10:0') OR ISNULL(DATE_EXEC))
ORDER BY DATE_EXEC, ID
LIMIT ".$bulk;
Теперь все прекрасно работает, создается событие через CEvent::Send(), потом неважно где пытается отправиться письмо, вызывается обработчик события OnBeforeEventSend и если он не разрешает отправку письма, то у письма остается статус N, если же обработчик разрешает отправку, то письмо пытается отправиться с обработкой статусов стандартной F,P,0 и так далее. Вот так вот были потрачены часы жизни, что бы подумать как решить без костылей, но нет, в итоге пришлось к ним прибегнуть.
P.S. Повторюсь .
Разработчики ядра Битрикс, обращение к вам! Хотелось бы, что бы вы допилили логику отправки event'ов, что бы была реакция на обработчик OnBeforeEventSend .
Александр, проблема действительно есть, попросим разработчиков решить её.
Вам же не нужно было править ядро, достаточно было очистить получателя письма и оно бы не отправилось.
Этот совет не подходит, т.к. если очищу получателя письма, то новых попыток отправки письма не будет происходить, как раз это в ядре и реализовал.
Конечно можно очищать получателя и городить новые обработчики, но это не тот случай, когда необходимо городить огороды, достаточно сделать вменяемую реакцию на обработчик.
Тем, кто обновил или собирается обновить свой mac до OS X Mavericks 10.9 dev и использует MAMP PRO - после обновления до 10.9 MAMP PRO перестает стартовать apache и это можно исправить.
Заметка больше для себя. Столкнулся с задачей - в множественном свойстве типа Файл было много пустых полей под файлы, плюс штук по 10 актуальных файлов.
Надо импортировать новые картинки, если их нет еще. Старые удалить. Плюс удалить пустые поля под файлы.
//массив с путями до картинок
$images = explode(",", $arRes[$i]);
//смотрим какие сейчас картинки есть
$arCurFiles = array();
$rsCurPhotosList = CIBlockElement::GetProperty($IBLOCK_ID, $PRODUCT_ID, array(), array('CODE' => 'PHOTO'));
while ($arCurPhoto = $rsCurPhotosList->GetNext()) {
$arCurFile = CFile::GetFileArray($arCurPhoto['VALUE']);
if (empty($arCurFile['ORIGINAL_NAME'])) {
//Это пустые поля, криво удаленные файлы когда-то
$arCurFile['ORIGINAL_NAME'] = md5(time()) . rand(0, 100) . rand(0, 100) . rand(0, 100) . rand(0, 100);
}
$arCurFiles[$arCurFile['ORIGINAL_NAME']] = $arCurPhoto['PROPERTY_VALUE_ID'];
}
//Готовим новое значение множественного поля
$arFile = array();
foreach ($images as $keys => $arRes[$i]) {
if (in_array(basename($arRes[$i]), array_keys($arCurFiles))) {
$arCurFiles[basename($arRes[$i])] = '';
continue;
}
$arCurFiles[basename($arRes[$i])] = '';
$arFile[] = array('VALUE' => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"] . $arRes[$i]), "DESCRIPTION" => "");
}
//Помечаем на удаление файлы, которых нет в текущей загрузке
foreach ($arCurFiles as $name => $PROPERTY_VALUE_ID) {
if (!empty($PROPERTY_VALUE_ID)) {
$arFile[$PROPERTY_VALUE_ID]['VALUE'] = array('del' => 'Y');
}
}
//Обновляемся
if (!empty($arFile)) {
CIBlockElement::SetPropertyValuesEx($PRODUCT_ID, $IBLOCK_ID, array('PHOTO' => $arFile));
}
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».