Максим Кузнецов · 25 марта 2017, 11:17 Если использовать минимальное количество запросов, то можно воспользоваться fenom'ом примерно таким образом: //Собираем ресурсы, из которых необходимо будет сформировать табы {var $resource_list = $_modx->runSnippet('!pdoResources', [ ... 'return' => 'json' ])} //Родитель, от которого формируем табы {set $tab_parent = '11'} {set $tabs = ''} {foreach $resource_list | fromJSON | split as $item} {set $parent = $item['parent']} {set $id = $item['id']} {set $pagetitle = $item['pagetitle']} //Настроить оформление по вкусу {if $parent == $tab_parent} {set $tabs = $tabs ~ '<a data-id="' ~ $id ~ '" class="tab-selector">' ~ $pagetitle ~ '</a>'} {else} {set $tab_childs[$parent][$id] = '<div class="body">' ~ $pagetitle ~ '</div>'} {/if} {/foreach} <div class="wrapper"> <div class="tabs">{$tabs}</div> <div class="items"> {foreach $tab_childs as $parent_id => $tab_content} <div data-parent="{$parent_id}" class="body"> {foreach $tab_content as $tab_item} {$tab_item} {/foreach} </div> {/foreach} </div> </div> Вопросы / Как сделать табы из ресурсов? 8 +3 3
Виталий Серый · 28 февраля 2017, 14:03 Самое простое через ключ массива. {*Первые два*} {foreach $rows as $idx => $row} {if $idx < 2} <div>{$idx} - {$row.title}</div> {/if} {/foreach} {*С пятой строки*} {foreach $rows as $idx => $row} {if $idx > 4} <div>{$idx} - {$row.title}</div> {/if} {/foreach} {*Чересстрочная вакханалия*} {foreach $rows as $idx => $row} <div{$idx is odd ? ' class="odd"' : ''>{$idx} - {$row.title} и два тикета туДаблин</div> {/foreach}И т.п. Документация Fenom. Вопросы / MIGX getImageList и Fenom 67 +4 4
Іван Клімчук · 17 февраля 2017, 10:18 Довольно просто, если в целом. Вот пример моей формы с фильтрами и кнопкой. <form action="" method="post" id="mse2_filters"> {if $filters != 'Нечего фильтровать'} {$filters} <div class="filter"> <main> <div class="txt-center"> <button type="reset" class="button-outline">Сбросить фильтры</button> <button type="submit" class="hidden">[[%mse2_submit]]</button> </div> </main> </div> {else} <div class="centered"> <p> {$filters} </p> </div> {/if} </form> Вопросы / Сделать кнопку сброса фильтров Mfillr2 1 +1 3
Александр Быковский · 09 декабря 2016, 09:27 Это было бы здорово, куда пройти за помощью?) Чтобы ветку не захламлять Готовые решения / smsGate-1.0.0. Авторизация через sms 43 0 1
Андрей · 25 декабря 2015, 17:55 Да, не вопрос. Но отмечу, что выкладываю решение работающее, но без правок, которые предложил Сергей Шлоков. Начнем с разметки. Используем стандартную разметку модального окна на Bootstrap 3. <div id="mymodal" class="modal fade"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 class="modal-title" id="modal-title"></h4> </div> <div class="modal-body" id="content"> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Закрыть</button> </div> </div> </div> </div>Скрипт JS, размещаем на странице, на которой выводятся анонсы статей или в шаблон. $(document).on('click','a.read-more',function(e){ e.preventDefault(); var id = $(this).data('id') || 0; $("#content").load("/assets/ajax.php",{action:"getContent",id:id}, function(response){ if (response) { var data = eval("(" + response + ")"); $('#content').html(data.content); $('#modal-title').html(data.pagetitle); $("#mymodal").modal('show'); } }); });И теперь привожу код файла коннектора запросов ajax.php, который необходимо закинуть в папку assets. <?php if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest' || empty($_REQUEST['action'])) {exit();} $action = $_REQUEST['action']; define('MODX_API_MODE', true); require_once dirname(dirname(__FILE__)).'/index.php'; $modx->getService('error','error.modError'); $modx->getRequest(); $modx->setLogLevel(modX::LOG_LEVEL_ERROR); $modx->setLogTarget('FILE'); $modx->error->message = null; $output = ''; switch ($action) { case 'getContent': $id = isset($_POST['id']) ? (int) $_POST['id'] : 0; if (empty($id)) { exit(); }; $object = $modx->getObject('modResource',$id); $output = array(); $output['content'] = $object->get('content'); $output['pagetitle'] = $object->get('pagetitle'); $output = json_encode($output); $maxIterations= (integer) $modx->getOption('parser_max_iterations', null, 10); $modx->getParser()->processElementTags('', $output, false, false, '[[', ']]', array(), $maxIterations); $modx->getParser()->processElementTags('', $output, true, true, '[[', ']]', array(), $maxIterations); } @session_write_close(); exit($output); Вопросы / Загрузка материала в модальное окно 99 +1 1
Павел Гвоздь · 16 августа 2015, 20:43 Вот какой-то плагин писал давненько. Как раз отсылает мыло. А если мыло не ввели, то создаёт юзера вот с таким мылом «телефон@сайт-на-котором-регается-юзер.ru». На том сайте мне надо было вводить либо мыло, либо телефон. Поэтому такое решение. Обновлено: В конце там у нас есть код — если юзер авторизован, то записать данные введённые в заказе в Profile. <?php $mail_subj_text = 'Регистрация на ' . $modx->getOption('site_name'); $chunk_mail_reg = 'tpl.mail.userRegisterFromOrderSubmit'; $suffix_email = '@сайт-на-котором-регается-юзер.ru'; switch ($modx->event->name) { // Обработка события, чтобы узнать, существовал ли юзер раньше.. // А также подставляет левый email, если он не заполнен, а "телефон" заполнен case "msOnSubmitOrder": $order_data = $order->get(); if( empty($order_user['email']) ) { $order_data = $data; } //$modx->log(modX::LOG_LEVEL_ERROR, print_r( $order->get() , true)); //$modx->log(modX::LOG_LEVEL_ERROR, print_r( $data , true)); // если email пуст или он с нашим суффиксом, то подставляем ему мыло вида - "телефон@suffix_email" if( empty($order_data['email']) || strstr($order_data['email'], $suffix_email) ) { if( trim($order_data['phone']) != '' ) { $phone = preg_replace( "/\D/", "", $order_data['phone'] ); $data['email'] = $order_data['email'] = ( $phone ) . $suffix_email; } else { $data['email'] = $order_data['email'] = ''; } } $modx->event->returnedValues['data'] = $data; // проверяем наличие мыла $email = $order_data['email']; if(empty($email)) { continue; } // проверяем на существование юзера по username=email, и если не существовал, то пишем соответствующее значение в сессию $_SESSION['minishop2']['new_user'] = false; if( !$modx->getCount('modUser', array('username' => $email)) ) { $_SESSION['minishop2']['new_user'] = $email; //$modx->log(modX::LOG_LEVEL_ERROR, print_r( $_SESSION['minishop2']['new_user'] , true)); } //$modx->log(modX::LOG_LEVEL_ERROR, print_r( $data , true)); break; case "msOnCreateOrder": $order_user = $order->get(); // если email с суфиксом нашего сайта - то не продолжаем if( strstr( $order_user['email'], $suffix_email ) ) { continue; } // если не авторизован if( !$modx->user->isAuthenticated($modx->context->key) ) { $email = $order_user['email']; if(empty($email)) {return false;} $user = $modx->getObject("modUser", array('username' => $email) ); // Если юзер не существовал раньше (при событии msOnSubmitOrder), то ставим ему новый пароль и шлём сообщение о регистрации на мыло if( $_SESSION['minishop2']['new_user'] == $email ) { $new_password = substr( md5(rand()), 0, 9 ); $user->set('password', $new_password ); $user->save(); $modx->log(modX::LOG_LEVEL_ERROR, print_r( $new_password , true)); // формируем письмо (тему и текст) $mail_subj = $mail_subj_text; $mail_body = $modx->getChunk( $chunk_mail_reg, array_merge( $user->getOne('Profile')->toArray(), $user->toArray(), array( 'password' => $new_password, ) ) ); // шлём письмо $mail = $modx->getService('mail', 'mail.modPHPMailer'); $mail->set(modMail::MAIL_BODY, $mail_body); $mail->set(modMail::MAIL_FROM, $modx->getOption('emailsender')); $mail->set(modMail::MAIL_FROM_NAME, $modx->getOption('site_name')); $mail->set(modMail::MAIL_SENDER, $modx->getOption('emailsender')); $mail->set(modMail::MAIL_SUBJECT, trim($mail_subj)); $mail->address('to', $email); $mail->address('reply-to', $modx->getOption('emailsender')); $mail->setHTML(true); $mail_response = !$mail->send() ? $mail->mailer->ErrorInfo : true; // пишем в лог, если письмо не ушло if ($mail_response != true) { $modx->log(modX::LOG_LEVEL_ERROR, 'Не получилось отправить email на ящик '.$email.'. Сообщение: '.$mail_response); } $mail->reset(); } //$modx->log(modX::LOG_LEVEL_ERROR, print_r( $_SESSION[ 'user_' . $email ] , true)); } else { $user = $modx->user; // записываем данные из формы в профиль $profile = $user->getOne('Profile'); $profile->set('fullname', $order_user['receiver']); $profile->set('phone', $order_user['phone']); $profile->set('city', $order_user['city']); $profile->set('address', $order_user['street']); $profile->set('comment', $order_user['comment']); $profile->save(); } //$modx->log(modX::LOG_LEVEL_ERROR, print_r( $order_user , true)); break; } Вопросы / При заказе товара пользователь бы регистрировался? 3 +3 6
Андрей · 21 марта 2015, 16:31 Ну вот как-то так набросал на скорую руку. -) Создал плагин, повесил на событие OnDocFormSave. <?php if ($modx->event->name == 'OnDocFormSave') { $parentIds = $modx->getParentIds($id, 4, array('context' => 'web')); // Получаем id всех родителей ресурса $res = $modx->getObject('modResource',$id); $curAlias = $res->get('alias'); // Алиас текущего ресурса $cnt = count($parentIds); // Количество родителей if($cnt > 2) { $aliases = array(); // Массив для всех найденных алиасов foreach($parentIds as $v) { if($v == 22 || $v == 0) continue; // Если родитель - контейнер Shop(22) или главный родитель (0) - пропускаем. $obj = $modx->getObject('modResource', $v); $alias = $obj->get('alias'); $aliases[] = $alias; } $resource->set('uri', implode('/',array_reverse($aliases)) . '/' . $curAlias); } else { $resource->set('uri', $curAlias); } $resource->set('uri_override', true); $resource->save(); }Можно еще добавить условие, чтобы урл, таким образом, формировался только для новых ресурсов. Мне пока не нужно. if ($mode == 'new') { // код выше } Вопросы / Убрать часть Url 19 +1 9
MobileDetect 2.0.0-pl функция "планшеты как стандартные браузеры не работает" в 2.1.0-pl баг исправлен
msImportExport не сохраняет родителя по умолчанию Компонент не понимает кирилические домены при загрузку фото. пример: Error download. Url : https://антаресдвери.рф/upload/iblock/a50/a50b2ef45305a3c18f6e298f1e134880.jpg. Message...
Где можно править тексты и заголовки писем? «Управление словарями» находится в панели администратора по пути: меню Система (иконка в виде шестеренки) -> Управление словарями.
mxBoard: канбан-доска для команд, людей и ИИ-агентов в MODX 3 Токены для ИИ-агентов, чтобы они могли работать с доской. Подробнее написал тут Баг проверю и постараюсь исправить.
Плагин EnvBadge: визуальный индикатор окружения в админке MODX3 Лучше автоматический ci/cd настроить и не править прод напрямую. Это самый безопасный вариант. Другое дело, что далеко не каждый владелец сайта и далеко не каждый сайт готовы в авт...
[videoGallery] Видео галерея YouTube, Vimeo Невозможно установить пакет с подписью: videogallery-1.4.0-beta Ошибка установки Error в /core/packages/videogallery-1.4.0-beta/modCategory/7fc931a7772edc9752c16e9c41eb5e52.reso...
Релиз miniShop2 ver. 4.4.1 & 4.4.2 Подскажите пожалуйста, может я что-то не знаю или упустил. Но есть ли решение по глюку с radio? Указываешь свое radio c одинаковым name и в результате при переключении получаешь вс...
И т.п.
Документация Fenom.
Вот пример моей формы с фильтрами и кнопкой.
Начнем с разметки. Используем стандартную разметку модального окна на Bootstrap 3.
Скрипт JS, размещаем на странице, на которой выводятся анонсы статей или в шаблон.
И теперь привожу код файла коннектора запросов ajax.php, который необходимо закинуть в папку assets.
Обновлено: В конце там у нас есть код — если юзер авторизован, то записать данные введённые в заказе в Profile.
Создал плагин, повесил на событие OnDocFormSave.
Можно еще добавить условие, чтобы урл, таким образом, формировался только для новых ресурсов. Мне пока не нужно.