Александр Туниеков

Александр Туниеков

С нами с 19 декабря 2015; Место в рейтинге пользователей: #15
Александр Туниеков
28 января 2019, 06:21
0
квест найди отличия этого
<?php
/** @var modX $modx */
/** @var array $sources */

$menus = array();

$tmp = array(
    'emailqueue' => array(
        'description' => 'emailqueue_menu_desc',
        'action' => 'home',
        //'icon' => '<i class="icon icon-large icon-modx"></i>',
    ),
);

foreach ($tmp as $k => $v) {
    /** @var modMenu $menu */
    $menu = $modx->newObject('modMenu');
    $menu->fromArray(array_merge(array(
        'text' => $k,
        'parent' => 'components',
        'namespace' => PKG_NAME_LOWER,
        'icon' => '',
        'menuindex' => 0,
        'params' => '',
        'handler' => '',
    ), $v), '', true, true);
    $menus[] = $menu;
}
unset($menu, $i);

return $menus;
от этого
Александр Туниеков
28 января 2019, 06:03
0
Я это читал перед тем как тему создать :(, но увы нефига не понял :(. Какие-то ссылки на коммиты Tickets, в которые я смотрю и не вижу никаких modAction. Смотрю код build modExtra и тоже не нахожу никаких modAction.
Я в том как генерируется и устанавливается транспортный пакет внутри кода MODX практически ничего не знаю. Просто тупо брал modExtra переименовывал и писал что нужно в нем :). А теперь прямо засада.
Александр Туниеков
28 декабря 2018, 21:21
0
Недавно делал сайт обучения по недвижимости
Вопрос первый — как закрыть доступ к платным курсам?
Делал компонент — регистр курсов. Табличка ид курса, ид юзера, зарегистрирован, куплен, пройден. На странице курса сниппет который проверяет платный ли курс, куплен ли курс этим юзером и выдает плейсхолдеры в шаблон на феноме где на плейсхолдеры ставится {if $placeholder}. То есть в зависимости от плейсхолдеров активируются разные части шаблона. (а можно, проще, в сниппете возвращать просто разные чанки на куплен и не куплен. У нас было просто много мест где менять поведение надо.)
Вопрос второй — на каждом курсе будет по 5-6 видео разделов, планируется делать проверку домашнего задания.
Допустим мы зарегистрировались, зашли на бесплатный или купили платный курс, и попадаем в раздел lesson1, смотрим видео — сдаем домашнее задание посредством чата. Такой чат будет подразумеваться на каждом видео.
У нас задания сдавались тестами, а не чатами.
Нормального чата под MODx нет. Это надо сторонний юзать наверно.
Александр Туниеков
22 декабря 2018, 16:52
0
Я предпочитаю не обновлять кроном цену товаров, а пересчитываю ее в плагине на событие msOnGetProductPrice. В price цена в долларах, а показываются пересчитанные в рублях. Курсы получаю с помощью CurrencyRate. Мне кажется что так надежнее :). Крон не повиснет при пересчете и если много товаров, то нагрузка на сервер меньше (цена персчитывается каждый раз при показе товара, но не надо пересчитывать ее для всех товатов. Только те что посмотрели).
Не знаю как способ лучше. Кому какой способ больше нравиться? Пересчитывать при показе товара или пересчитывать кроном ночью все товары? И почему?
Александр Туниеков
17 декабря 2018, 19:04
0
Нет не планируется. В принципе, скрипт написать что рассылку делает не сложно. Примерно так:
if (!$Orgs = $modx->getService('organizations', 'Organizations',$modx->getOption('organizations_core_path', null, $modx->getOption('core_path') . 'components/organizations/') . 'model/organizations/', $scriptProperties)) {
	return 'Could not load Organizations class!';
}
$orgs = $modx->getCollection('Orgs');
foreach($orgs as $org){
    ...//здесь пишете отправка письма на $org->email, если это поле заполняется.
    //если не заполняется, то можно отправить на письма на пользователей организации
    $c = $modx->newQuery('OrgsUsersLink');
    $c->leftJoin('modUserProfile', 'modUserProfile', "modUserProfile.internalKey = OrgsUsersLink.user_id");
    $c->select(array(
      'modUserProfile.email'
    ));
    $c->where(array(
        'OrgsUsersLink.org_id' => $org->id,
        'OrgsUsersLink.user_group_id' => 1, //администраторам
        'OrgsUsersLink.active' => 1,
    ));
    $users = $modx->getCollection('OrgsUsersLink', $c);
    foreach($users as $user){
        ...//отправка письма на $user->email
    }
}
Отправлять письма как здесь https://ilyaut.ru/reposts/sending-mail-through-modmail/, либо через EmailQueue если на сервере ограничение по числу писем за раз.
Александр Туниеков
15 декабря 2018, 13:48
0
Для совместимости с обновлениями компонента могу добавить событие, чтоб вы варианты в отдельном плагине писали. Но надо примерно представлять какое событие вам нужно и какие параметры в него передавать.
Александр Туниеков
15 декабря 2018, 13:22
0
Свои формулы не предусмотрены. Расчет результатов тестов очень простой. Если сумма баллов попадает в заданный диапазон результата теста, то он и присваивается. http://z9233215.bget.ru/manager/?a=element/snippet/update&id=44 строка 852:
$Variants = $modx->getIterator('UserTestVariants', array('test_id'=>$id, 'category_id'=> 0));
    foreach($Variants as $var){
        if($test_point >= $var->start_point and $test_point <= $var->end_point){
            $var_id = $var->id;
            $var_result = $var->result;
			$var_passed = $var->passed;
            break;
        }
    }
Исходный код открыт. Посмотрите может вы сможите модифицировать его под свои варианты рассчетов.
Александр Туниеков
15 декабря 2018, 12:53
0
Добрый день! Да только из админки. Сделать из фронта можно, но сложновато :(
Александр Туниеков
12 декабря 2018, 12:47
+1
Сам задал вопрос сам и отвечаю :).
Код php можно распарсить в токены.
$tokens = token_get_all($code);
Потом пройтись по получившемуся массиву и если T_STRING содержит название разрешенной функции и токен не запрещен, например T_EVAL, записывать функцию в базу иначе возвращать ошибку. Примерно так :). Благо нужных функций не так много.
Александр Туниеков
12 декабря 2018, 05:31
0
Можно еще часть отправлять через 12 часов а часть сразу :). Это допустим те, что через 12 часов отправляете в очередь с sender_package = «12hours». А в кроне при отправке фильтровать по sender_package.
Александр Туниеков
12 декабря 2018, 04:47
1
0
Ну можно либо крон раз в 12 часов поставить либо в кроне send.php строка 11
$q->where(array('status'=>1, 'date:<'=> date('Y-m-d', strtotime("-12 hours"))));
Примерно так. Не тестировал.
Александр Туниеков
10 декабря 2018, 19:45
+1
Сделал EmailQueueAutoResponder и остальное что хотел :). Смотрите изменения в теме и качайте новую версию с модсторе. Планировал 2 часа а потратил весь вечер :(.
Александр Туниеков
10 декабря 2018, 15:52
0
Конечно нет. К тому же я его не сам писал, а взял из FormIt github.com/Sterc/FormIt/blob/develop/core/components/formit/src/FormIt/Hook/Email.php#L61
Просто убрал все лишнее что сейчас не нужно было мне и адаптировал под компонент.
Ну я так и пишу. Подсмотреть убрать лишнее и добавить нужное :).

С поддержкой всех параметров сложно. Не думаю что я буду это делать :(. У меня в этом потребности нет. И все прописать достаточно сложно. Сегодня я сделаю топбар и статус отправляется и выложу на гитхаб. Если вы захотите, можете сделать форк доработать компонент прислать мне пулл-реквест.

насчет FormItAutoResponder подумаю как прикрутить.
Александр Туниеков
10 декабря 2018, 15:13
0
Не возражаете если я ваш хук включу в состав компонента?
Александр Туниеков
10 декабря 2018, 14:55
+1
Мда… не продумал. Думаю тогда сделать статус Отправляется и в кроне перед циклом отправки добавить цикл, выставляющий этот статус. Это просто можно сегодня сделать. А вот я обещал еще кнопки сделать удобнее. Это сложнее надеюсь за 2 часа справлюсь и тоже сегодня сделаю.
Александр Туниеков
10 декабря 2018, 05:32
0
Добрый день! Когда писал компонент вот на использование в хуке для FormIt не планировал, что это понадобиться. Идея была в том, что за раз нельзя бывает много писем отправить и чтобы это сделать понадобился компонент. А в FormIt одно письмо за раз отправляется. Для чего вам этот хук? Мне просто не очень понятно зачем он. Раз написали думаю нужен :), но вот зачем теряюсь в догадках :).
Александр Туниеков
21 ноября 2018, 14:58
0
Мой скайп touols Давайте обсудим, что возможно сделать.
Александр Туниеков
21 ноября 2018, 14:26
0
Мне кстати такая задача интересна. Вы рассматриваете подключение к ней сторонних специалистов?