Добрый день.
Очень понравилась библиотека для работы с Базами данных — xPDO. Попробовал запустить ее работу на чистом PHP-коде, на основе тех статей, которые прочитал про xPDO.
Вот так создал подключение (добавив только кодировку с БД):
$xpdo = new xPDO('mysql:host=localhost;dbname=db',"user","pass", array ( XPDO::OPT_CACHE_PATH => 'cache/', XPDO::OPT_TABLE_PREFIX => '', XPDO::OPT_HYDRATE_FIELDS => true, XPDO::OPT_HYDRATE_RELATED_OBJECTS => true, XPDO::OPT_HYDRATE_ADHOC_FIELDS => true, XPDO::OPT_VALIDATE_ON_SAVE => true, ), array ( PDO::ATTR_ERRMODE => PDO_ERRMODE_SILENT, PDO::ATTR_PERSISTENT => false, PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'" ) ); ...
И все заработало…
include("dbConnection.php"); $content = $xpdo->getObject('MyContent', 1); if($page) { echo "Страница - ".$content->name; } else { echo "Ничего не найдено :("; }
Получилось также работать с limit(), where(); Но при попытке создавать Join-запросы — ничего не выводиться. Т.к. проблема, как понимаю в том, что у меня есть названия таблиц — например вот такого формата — «table_name_users», т.е. с нижними подчеркиваниями. И соответственно в запросах надо где-то использовать TableNameUsers, а где то — (в join) — использовать — table_name_users и тогда запрос проходит успешно.
Можно ли как-то настроить xPDO так, что бы можно было везде использовать один и тот же формат названия таблиц в запросах — TableNameUsers?
— Спасибо.
В свое время мы с Ваней ака vanchelo работали над парочкой проектов, и там надо было использовать каптчу. Гугловую рекаптчу не охото было использовать, так как лень было регистрировать сайт в гугле, и Ваня там запилил свою каптчу. Но она не была оформлена в установочный пакет. Сегодня я подправил пару моментов, добавил системные настройки, чанк для вывода картинки, сниппет и процессор для проверки кода и оформил это в пакет modCaptcha.
Все работает. Ване огромное спасибо за исходный код!
Вызов каптчи: просто чанк modcaptcha.
Проверка доступна двумя способами: 1. Процессором. 2. Сниппетом. Данный сниппет все равно в итоге вызывает тот же процессор, но разница в том, что в него не обязательно передавать значение полученного кода параметром. Если код не был передан явно, сниппет попытается получить его из массива $_REQUEST['php_captcha'].
При этом, если код верный, сниппет должен вернуть строку 'true'. Процессор же не должен вернуть $response->isError().
P.S. Проект на Github: github.com/Fi1osof/modCaptcha
UPD: Выпустил modCaptcha-1.0.1-beta, в которой фиксится бага с некорректным завершением сессий (как минимум на modxcloud.com). Об этом писал здесь: modxclub.ru/blog/dokumentatsiya-dlya-spetsialistov/36.html
Кстати, есть еще вариант: если предполагается, что контент-менеджер будет работать только с одним конкретным разделом, можно в настройках пользователя задать tree_root_id = id раздела. Тогда он в дереве будет видеть только этот раздел и его дочерние документы. Указать сразу несколько разделов не получится.
Если делать по тому мануалу, и по общей системе, как это заведено в MODX-е, то только определив документы в различные группы ресурсов. Да, это крайне не удобно по многим причинам, но только так. Другой же, более разумный в этом случае способ — это разруливание на уровне плагина в момент попытки открытия документа для редактирования. Вот пример такого плагина:
<?php switch($modx->event->name){ case 'OnManagerPageBeforeRender': switch($scriptProperties['controller']->config['controller']){ /* Проверяем права на редактирование документов */ case 'resource/update': // Проверяем наличие настройки allow_to_update (задается в настройках пользователя) // В ней мы перечисляем, какие документы пользователю можно редактировать // Если настройка задана, но id документа отсутствует в перечисленных разрешенных, // То возвращаем ошибку доступа if($allow_to_update = $modx->getOption('allow_to_update')){ if(!is_array($allow_to_update)){ $allow_to_update = explode(",", $allow_to_update); $allow_to_update = array_map('trim', $allow_to_update); } // if(!in_array($scriptProperties['controller']->scriptProperties['id'], $allow_to_update)){ $scriptProperties['controller']->failure('Доступ запрещен'); return; } } break; } //print_r($scriptProperties['controller']->config); //print_r($scriptProperties['controller']->scriptProperties); break; }
Но это, что называется, «защита от дурака», то есть этот метод позволяет на уровне интерфейся рулить что можно открывать, а что нельзя (для удобства менеджера), но ничто не мешает ему отправлять Ajax-запрос на редактирование с указанием произвольного id. То есть этот метод не до конца защищает. Защита же на уровне разделения по группам ресурсов более надежная, ибо работает на уровне самого объекта ресурса, где би и как бы его не получили, а не просто на уровне рендеринга страницы редактирования.
Для вас этот плагин просто как пример. Там вам придется свои более сложные условия писать, типа перебрать всех родителей ресурса, и если это новость, то ее редактировать можно.
А так же не забудьте таким манагерам отключить разрешение быстрого редактирования страниц, ибо этот плагин там не сработает.
Всего-то навсего нужно API внимательно изучить, чтобы знать как что вызывать и что вообще можно вызвать, а далее уже прикручиваем все что вздумается
Все так! С учетом того, что в Smarty-шаблонах нам полностью доступен объект $modx, делать там можно все, что угодно.
До разраба мне конечно дaлеко, да и не за этим я здесь, просто захотел себе да и знакомым сайт создать, будучи даже и близко не шаря в программировании.
А вот это уже чуть сложнее. Дело в том, что наши технологии как раз больше рассчитаны на программистов, и требуют хоть каких-то навыков в программировании.
Подскажите пожалуйста, как разрешить контент менеджеру редактирование только определённых ресурсов (и их подресурсов) в дереве.
Например дать право управлять только новостями и не показывать разделы относящиеся к каталогу.
Доступ контент менеджеру настроил по этому мануалу bayguzin.ru/main/uroki/uroki-modx-revolution/nastrojka-admin-paneli-klienta-modx-revo.html
Всего-то навсего нужно API внимательно изучить, чтобы знать как что вызывать и что вообще можно вызвать, а далее уже прикручиваем все что вздумается, MODX очень гибкий и вместе с тем отличная площадка для разработчиков. Тут даже думать интересно становиться) До разраба мне конечно дaлеко, да и не за этим я здесь, просто захотел себе да и знакомым сайт создать, будучи даже и близко не шаря в программировании. Считаю что у ModX хорошее будующее)
Добрый день.
1. Как я уже не однократно упоминал, не смешивайте вместе MODX- и Smarty- теги. Smarty отрабатывается сразу, а MODX-теги по сути только в конце, когда MODX-парсер полностью проходится по результату отработки шаблона.
2. Чего-то здесь не хватает. Вот в цикле отрабатывается, но в него не передается никакого меняющегося параметра. В чем логика?
3. Как-то вы все всё сильно усложняете… Почему не обработать просто значение MIGX-TV-параметра на уровне процессора и не набить все потом аккуратно в шаблоне? Вот пример процессора и шаблона. И никаких сниппетов.
Добрый день поскажите как заставить вывестишь migx в результатах выборки
вот мой код
{processor action="web/getdata" ns="modxsite" params=$params assign=result} {if $result.success} {foreach $result.object as $object} <li> <span class="hideCollapseContent">{$object.pagetitle}</span> <div class="collapseInnerWrap clearfix width25Wrap photoreportsItemWrapper"> {$object.content} [[getImageList?&tvname=`expan`&tpl=`plus_foto`]] </div> </li> {/foreach} {/if}
[[getImageList?&tvname=`expan`&tpl=`plus_foto`]]
вот соотвественно и вывод migx
Странное дело… Ну я из репы вообще редко тяну пакеты. Я разворачиваю готовый сайт и все, там сразу все есть. И все работает.