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

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

С нами с 19 декабря 2015; Место в рейтинге пользователей: #15
Александр Туниеков
28 февраля 2019, 14:18
+1
покажи эту функцию this.setAction('importapi', 'false', 0);
Александр Туниеков
28 февраля 2019, 06:04
+1
А что не так то пошло? :) Какая ошибка? В коносоле разработчика в Network что говорит?
Александр Туниеков
23 февраля 2019, 21:36
0
Какие 5к р.)) о чем речь
Я другу, на его последнее предложение, так и сказал, что нормальный сайт от 50т.р. делается.
Ты как разработчик вообще гарантировать какую то прибыль не можешь, и об этом надо говорить клиенту.
Ясно, что не могу, но вопрос в том, что клиенты же не за красивые глазки бегут заказывать у тебя сайт. Нужно чтоб разработанный сайт их как-то устраивал. Приносил прибыль или моральное удовлетворение :)
Александр Туниеков
23 февраля 2019, 20:11
0
Как минимум плюс в том, что вам не приходится общаться с неадекватными, агенство их для вас фильтрует.
Агентствам бывает пофиг. Они берут заказы от неадекватных и просто скидывают тебе, которые фиг знает как делать.
Херня. Как сказать «хочу быть богатым».
Аргумент весомый :(. Только меня не совсем устраивает текущее положение, заработки и то что мало пользы от работы. Хотя конечно 90% фирм закрываются в первые 3 года работы. Может и для сайтов такая-же судьба…
Александр Туниеков
23 февраля 2019, 19:10
0
Не вопрос не в предоплате. Пример не слишком удачный :(. Вопрос какие сайты эффективны и восстребованны? Как это определять? Какие суммы для эффективного сайта приемлемы? Как подобрать клиенту нужный ему сайт и объяснить его стоимость?
Вопросы может и дурацкие. Типа «смысла жизни» :), но по крайней мере меня такие вопросы развивают :)
Александр Туниеков
29 января 2019, 10:43
0
Разобрался :) В общем в modExtra менять ничего не нужно.
Александр Туниеков
29 января 2019, 08:04
0
Для проверки установил Tickets. На modAction ругается 3 раза. А должно 1 раз на это
if ($action = $modx->getObject('modAction', array('namespace' => 'tickets'))) {
                $action->remove();
                /** @var modMenu $menu */
                if ($menu = $modx->getObject('modMenu', array('text' => 'tickets'))) {
                    $menu->remove();
                }
Похоже наши гуру и сами не знают, что там такого нужно поменять, чтоб не ругалось :)
Александр Туниеков
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.