Максим Кузнецов · 10 января 2015, 09:34 С вашего позволения, приведу сюда пример реализации большинства пунктов (не отрицаю востребованнось решения данных задач сразу из коробки, т.к. работы для реализации этих пунктов нужно сделать прилично): Страницы пользователей с нормальными урл 1. Создаем страницу «профиль пользователя» (не путаем с личным кабинетом), выставляем ему псевдоним, допустим users, к которой будут обращаться в виде site.ru/users?profile=имя 2. Ставим дополнение pdoTools 3. Создаем сниппет user.Profile и добавляем его в шаблон вывода <?php $count = $modx->getCount('modUser', array('username' => $_GET[profile])); if($count <= 0){ echo' <h2> <a>Ошибка</a> </h2> <div> Пользователя не существует. </div>'; } else { $params = array(); $params['users'] = $_GET[profile]; $params['showBlocked'] = '1'; $params['tpl'] = 'user.Profile'; $params['prepareSnippet'] = 'user.Profile.Prepare'; $result = $modx->runSnippet('pdoUsers', $params); if (!empty($result)) { return $result; } else { return '<h2> <a>Ошибка</a> </h2> <div> Что-то сломалось.. Сейчас починим. </div>'; } } — насколько я помню, сразу вызвать pdoUsers с параметром конкретного пользователя нежелательно, т.к. если пользователя не существует, он выдает по-умолчанию весь список пользователей. Возможно, сейчас что-то поменялось или это можно обойти — не проверял. Для данного сниппета также можно дописывать условия, если пользователь не активирован и тд и тп. При помощи параметров tpl и prepareSnippet кастомизируем до нужного уровня. 4. Дописываем в .htaccess RewriteRule ^users/([^/]+)$ /users?profile=$1 [L] — чтобы ссылка приняла вид site.ru/users/Имя_пользователя Возможность добавлять поля в профиль пользователя При регистрации: дополнение login Для редактирования пользователем (личный кабинет) — дополнение office Возможность указывать шаблон для оформления страницы пользователя 1. Добавляем дополнительное поле в личный кабинет пользователя (шаблон отображения) 2. В шаблоне отображения профиля пользователя дописываем классы, завязанные на полученном значении (class=«userInfo-[[+tpl.style]]») 2.А. Если необходимо менять структуру шаблона в зависимости от выбранного пользователя значением, то в сниппете в первой части дописываем до $params = array();получение extended-поля по id пользователя с вытекающими условиями if, внутри которых будет разный параметр $params['tpl'] Добавить «из коробки» дату регистрации и дату последней активности Дату регистрации — сниппет логин и 1 доп. поле. С датой последней активности сложнее, т.к. в таблицах Modx'a, насколько я помню, есть только поле последней авторизации. Возможно, нужно завязывать на сессии +временной промежуток. Возможность сделать станицу пользователя общедоступной для просмотра Аналогично пункту 2.А. в разделе «шаблона отображения» Краудфандинг / Отображение страницы пользователя 68 +2 4
Максим Кузнецов · 04 октября 2014, 12:35 Если своим сниппетом через pdoUsers, то примерно так: Сниппет user.Profile <?php $count = $modx->getCount('modUser', array('username' => $_GET[profile])); if($count <= 0){ echo' <h2 class="contentTitle"> <a>Ошибка</a> </h2> <div class="content"> Пользователя не существует. </div>'; } else { $params = array(); $params['users'] = $_GET[profile]; $params['showBlocked'] = '1'; $params['tpl'] = 'user.Profile'; $params['prepareSnippet'] = 'user.Profile.prepare'; $result = $modx->runSnippet('pdoUsers', $params); if (!empty($result)) { echo $result; } else { echo' <h2 class="contentTitle"> <a>Ошибка</a> </h2> <div class="content"> Что-то сломалось.. </div>'; } } + user.Profile.prepare, где преобразовываешь нужные поля до культурного вида, в духе: <?php if ($row['gender'] == '1') { $row['gender'] = 'Парень'; } elseif ($row['gender'] == '2') { $row['gender'] = 'Девушка'; } elseif ($row['gender'] == '0') $gender =''; if (!empty($row['fullname'])) $row['fullname'] = 'Имя: <b>' . $row['fullname'] . '</b> '; if (!empty($row['gender'])) $row['gender'] = 'Пол: <b class="' . $gender . '">' . $row['gender'] . '</b> '; if (!empty($row['city'])) $row['city'] = 'Город: <b>' . $row['city'] . '</b> '; if ($row['blocked'] != '0' && $row['blockeduntil'] == '0') $row['blocked'] = ' Заблокирован '; else $row['blocked'] = ''; if ($row['blockeduntil'] != '0') $row['blockeduntil'] = ' Заблокирован до:' . $row['blockeduntil'] . ' '; else $row['blockeduntil'] = ''; return serialize($row); + чанк user.Profile, где формируешь шаблон профиля Ну и в .htaccess добавить правило в духе: RewriteRule ^users/([^/]+)$ /users?profile=$1 [L] — чтобы ссылка была вида не ?profile=.., а /users/Username Вопросы / Поиск по пользователям сайта 21 +1 1
Василий Наумкин · 01 октября 2014, 08:46 [[!pdoResources? &class=`msProductFile` &where=`{"product_id":10, "parent":0}` &sortby=`id` &sortdir=`asc` ]]parent = 0 — это выборка именно большой картинки, потому что у превьюшек parent всегда не 0, а id существующей картинки. Ну а product_id понятно что — id нужного товара. Друзья, осваивайте уже pdoTools. Вопросы / Получение полного списка полноразмерных картинок 9 +1 3
Афанасий Петренко · 25 февраля 2014, 21:19 github.com/tanaevr/miniMs2Order вот решение от разработчика: нужно прикрепить на страницу script.js, создать сниппет и постаить рядом с выводом miniShop. У сниппета есть параметр &limit, это кол-во видимых товаров. Вопросы / Мини-корзина в ms2 21 0 1
Виталий Валерьевич · 10 февраля 2014, 14:49 Делается очень просто, опишу алгоритм и набросаю от руки, поднимать наработки долго. Алгоритм: Получить реферараОпределить поисковую системуПолучить поисковый запрос или ссылку переход с которой был осуществленЗаписать в cookie или в сессию результатВ нужном месте собрать Пишем сниппет: $referer = $_SERVER['HTTP_REFERER']; setcookie('referer', $referer, mktime(0, 0, 0, 1, 1, 2015)); if (stristr($referer, 'yandex.ru')) { $search = 'text='; $crawler = 'Yandex'; } else if (stristr($referer, 'rambler.ru')) { $search = 'words='; $crawler = 'Rambler'; } else if (stristr($referer, 'google.ru')) { $search = 'q='; $crawler = 'Google'; } else if (stristr($referer, 'google.com')) { $search = 'q='; $crawler = 'Google'; } else if (stristr($referer, 'mail.ru')) { $search = 'q='; $crawler = 'Mail.Ru'; } else if (stristr($referer, 'bing.com')) { $search = 'q='; $crawler = 'Bing'; } else if (stristr($referer, 'qip.ru')) { $search = 'query='; $crawler = 'QIP'; } if (isset($crawler)) { $phrase = urldecode($referer); preg_match('/'.$search.'([^&]*)/', $phrase.'&', $phrase2); $phrase = $phrase2[1]; } setcookie('phrase', $phrase, mktime(0, 0, 0, 1, 1, 2015)); Запускаем в шаблоне, перед <!DOCTYPE>, далее если используется Formit, создаем сниппет-hook и записываем в него следующую конструкцию (как пример): $output = ''; foreach ($_COOKIE as $k => $v) { if (0 === strpos($k, 'utm')) $output .= "$k: $v \n"; } $hook->setValue('referer', $output); return true; Итог: получаем плейсхолдер [[+referer]], который содержит всю необходимую информацию по рефереру. Код от руки, естественно требует доработок, но вроде нигде не ошибся. Вопросы / Откуда пришел лид 7 0 4
Василий Наумкин · 13 июля 2013, 18:02 if (empty($parent)) {$parent = $modx->resource->id;} $pids = array_merge(array($parent), $modx->getChildIds($parent)); $ids = array(); $q = $modx->newQuery('msProduct'); $q->where(array('class_key' => 'msProduct','parent:IN' => $pids,'published' => 1,'deleted' => 0)); $q->select('`msProduct`.`id`'); if ($q->prepare() && $q->stmt->execute()) { $ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN); } $q = $modx->newQuery('msProduct'); $q->leftJoin('msCategoryMember', 'msCategoryMember', '`msCategoryMember`.`product_id` = `msProduct`.`id`'); $q->where(array('class_key' => 'msProduct','msCategoryMember.category_id:IN' => $pids,'published' => 1,'deleted' => 0)); $q->select('`msProduct`.`id`'); if ($q->prepare() && $q->stmt->execute()) { $ids2 = $q->stmt->fetchAll(PDO::FETCH_COLUMN); if (!empty($ids2)) { $ids = array_unique(array_merge($ids, $ids2)); } } return count($ids); Вопросы / Вывод количества документов 5 0 2
Владимир · 02 июня 2013, 11:30 попробовал babel прикрутить к minishop вроде получилось. чтоб каждому товару не загружать одинаковые картинки написал сниппет небольшой. Берет id документа, получает alias, затем по alias ищет id в главном контексте и выводит фото товара. Подскажите правильно это? $res = $modx->getObject('modResource',array('id' => $id)); $alias = $res->get('alias'); $resources = $modx->getCollection('modResource', array( 'alias' => $alias, 'context_key' => 'web' )); foreach ($resources as $resource) { return($resource->get('id')); break; }посмотреть можно тут testvgrish.tmweb.ru/ Вопросы / Мультиязычность 21 0 1
Василий Наумкин · 09 января 2013, 08:29 Если сломалось сразу и везде — проблема системная. Php не обновлял, настройки не менял? Алгоритм починки: 1. Смотрим ошибки загрузки в /var/log/nginx/имясайта-error.log 2. Проверяем наличие директорий /var/www/имясайта/tmp/ — именно туда грузятся файлы, сначала. 3. Проверяем конфиги сайтов в /etc/nginx/sites-enabled/имясайта.pool, особенно смотрим на строчки про upload и tmp. Не помешает также запустить скрипт, восстанавливающий верные права на файлы и директории сайта, 0777 — это не хорошо. #!/bin/bash USER="имяюзерасайта" GROUP="имягруппысайта" chown -R $USER:$GROUP "/var/www/test/www"; find "/var/www/test/www" -type d -exec chmod 0755 '{}' \; find "/var/www/test/www" -type f -exec chmod 0644 '{}' \; Если всё сделано по моей инструкции, то имя юзера и группы совпадают друг с другом, а также, с именем директории сайта. Вопросы / Файловый менеджер не загружает файлы 16 0 1
Василий Наумкин · 08 сентября 2012, 06:59 Файлы и деректории должны принадлежать юзеру, от имени которого запускается php для этого сайта. Тогда — 755 и 644. Если же у вас, например, все принадлежит юзеру ftp, а php работает от www-data, то надо или сменить владельца для файлов, или выставлять 777. Почиатйет про права тут — это интересно system-administrators.info/?p=1087 Вопросы / Как правильно выставить права на файлы? 12 0 1
mxApi — быстрый внешний API для MODX Revolution • зафиксировать публичный контракт EndpointInterface / метаданных по semver, чтобы наш провайдер не ломался на обновлениях;Фактически это уже так, beta стоит просто на всякий случа...
Как я использую mxBoard для работы с ИИ-агентами зачем здесь MODXДа собственно ни зачем. Просто Modx рабоатет на любом шаред-хостинге и для меня это самый знакомый стэк. Я рассматривал вариант взять что-то готовое, но счёл развёр...
YaSmartCaptcha - защитите ваши формы от спама умной капчей от Яндекс Вообще не понял о чем речь) В системной настройке service_js сейчас указана ссылка smartcaptcha.cloud.yandex.ru/captcha.js Я предложил очистить эту настройку, тогда компонент н...
mxBackup — обезличенные копии MODX в пару кликов Ещё нет, я там разом почти полтора десятка пакетов выложил модератор, вероятно, а шоке.
Gallery3x 3.4.0 - вставка галерей прямо из визуального редактора (CKEditor и TinyMCE RTE) Здравствуйте. Есть консольный скрипт Вот почитайте: docs.ivan345.com/books/gallery3x/page/import-ms2galleryphp
[mSync] Новая версия синхронизации с 1С Всем привет. В какой то момент начали сыпаться ошибки: Error 23000 executing statement: INSERT INTO `modx_msync_products` (`product_id`, `uuid_1c`) VALUES ...
Checkbox для модального окна Они не отключены, они платные, чтобы писали только те, кому действительно очень надо. Когда бесплатно люди начинают думать, что я им должен.
Страницы пользователей с нормальными урл
1. Создаем страницу «профиль пользователя» (не путаем с личным кабинетом), выставляем ему псевдоним, допустим users, к которой будут обращаться в виде site.ru/users?profile=имя
2. Ставим дополнение pdoTools
3. Создаем сниппет user.Profile и добавляем его в шаблон вывода
— насколько я помню, сразу вызвать pdoUsers с параметром конкретного пользователя нежелательно, т.к. если пользователя не существует, он выдает по-умолчанию весь список пользователей. Возможно, сейчас что-то поменялось или это можно обойти — не проверял.
Для данного сниппета также можно дописывать условия, если пользователь не активирован и тд и тп. При помощи параметров tpl и prepareSnippet кастомизируем до нужного уровня.
4. Дописываем в .htaccess
— чтобы ссылка приняла вид site.ru/users/Имя_пользователя
Возможность добавлять поля в профиль пользователя
При регистрации: дополнение login
Для редактирования пользователем (личный кабинет) — дополнение office
Возможность указывать шаблон для оформления страницы пользователя
1. Добавляем дополнительное поле в личный кабинет пользователя (шаблон отображения)
2. В шаблоне отображения профиля пользователя дописываем классы, завязанные на полученном значении (class=«userInfo-[[+tpl.style]]»)
2.А. Если необходимо менять структуру шаблона в зависимости от выбранного пользователя значением, то в сниппете в первой части дописываем до
получение extended-поля по id пользователя с вытекающими условиями if, внутри которых будет разный параметр $params['tpl']
Добавить «из коробки» дату регистрации и дату последней активности
Дату регистрации — сниппет логин и 1 доп. поле.
С датой последней активности сложнее, т.к. в таблицах Modx'a, насколько я помню, есть только поле последней авторизации. Возможно, нужно завязывать на сессии +временной промежуток.
Возможность сделать станицу пользователя общедоступной для просмотра
Аналогично пункту 2.А. в разделе «шаблона отображения»
Сниппет user.Profile
+ user.Profile.prepare, где преобразовываешь нужные поля до культурного вида, в духе:
+ чанк user.Profile, где формируешь шаблон профиля
Ну и в .htaccess добавить правило в духе:
— чтобы ссылка была вида не ?profile=.., а /users/Username
Друзья, осваивайте уже pdoTools.
Алгоритм:
Пишем сниппет:
Запускаем в шаблоне, перед <!DOCTYPE>, далее если используется Formit, создаем сниппет-hook и записываем в него следующую конструкцию (как пример):
Итог: получаем плейсхолдер [[+referer]], который содержит всю необходимую информацию по рефереру. Код от руки, естественно требует доработок, но вроде нигде не ошибся.
посмотреть можно тут testvgrish.tmweb.ru/
Алгоритм починки:
1. Смотрим ошибки загрузки в /var/log/nginx/имясайта-error.log
2. Проверяем наличие директорий /var/www/имясайта/tmp/ — именно туда грузятся файлы, сначала.
3. Проверяем конфиги сайтов в /etc/nginx/sites-enabled/имясайта.pool, особенно смотрим на строчки про upload и tmp.
Не помешает также запустить скрипт, восстанавливающий верные права на файлы и директории сайта, 0777 — это не хорошо.
Если всё сделано по моей инструкции, то имя юзера и группы совпадают друг с другом, а также, с именем директории сайта.
Тогда — 755 и 644.
Если же у вас, например, все принадлежит юзеру ftp, а php работает от www-data, то надо или сменить владельца для файлов, или выставлять 777.
Почиатйет про права тут — это интересно system-administrators.info/?p=1087