Как стать автором
Обновить

Комментарии 12

Вопрос. А получается, что можно самому себе отправить сообщение? Проверка на ID пользователя (есть ли такой пользователь) в данных сниппетах нету. Спасибо за топик.
Ну я всего лишь объяснил принцип, как это делается. А добавить условие if ($user_id != $to) ... — дело техники. Согласен, по-хорошему надо попытаться сделать getObject('modUser', $to).
Если вернулся null, облом. Кстати, оттуда же можно подтягивать юзернейм.
Прежде всего я это писал для своей системы, а там юзер заведомо существует, иначе ты даже не увидишь формы отправки сообщения. И id адресата подставляется автоматом.
И ещё, переместите топик в блог MODx :)
Могу я попросить более опытного товарища помочь с переносом?
Я, как и вы, тут только второй день :) Сначала вступите в блог habrahabr.ru/blogs/modx/, затем отредактируйте топик (В какой блог публикуем? — MODx). Вот такие вот дела.
спасибо, разобрался! Топик уже там.
Зачем параметр для сниппета [[+modx.user.id]]?
Во-первых, не надо лишний раз нагружать парсер MODx, во-вторых, такие параметры вообще НЕЛЬЗЯ создавать, ибо ничего не мешает хитроумному пользователю передать в него сторонний параметр. Надо на уровне PHP использовать $modx->user->id без каких-либо изменений.
Спасибо, учту. Вот только как пользователь передаст туда параметр? Ведь парсер как раз и работает на уровне PHP?
Так пользователь и не должен ничего передавать. При обращении к сайту $modx производит инициализацию пользователя.
$userId = isset($userId) ? $userId : 0;
$userId = $modx->getAuthenticatedUser()->get('id');


А правильней вообще проверять есть ли авторизованный пользователь, чтобы не вываливалось ошибок, типа объекта нет
if(!$user = $modx->getAuthenticatedUser()){
return false;
}
$userId = $user->get('id');


И нельзя напрямую обращаться к $modx->user;
Во-первых, $modx->user существует всегда (он автоматом его создает, даже если пользователя нет, просто дефолтовый объект с id 0);
Во-вторых, $modx->user легко подменить в любом блоке кода $modx->user = $modx->newObject(), getObject(), ->set('id')= $id и т.п.
Тупо в целях безопасности
Категорически согласен.
В свое оправдание скажу лишь, что в моем проекте пользователь-адресат заведомо существует. И форма отправки ему сообщения доступна только зарегистрированным, закрыта от посторонних ACL. Но тем не менее, лучше перебдеть))
Это не перебдеть. Это боле-менее правильный метод программирования. Это же не чистый PHP, а фреймворк, и надо писать с учетом его стандартов и специфики. Тем более вы делитесь своим кодом. Кто-то воткнет его на проект посерьезней, а там дырка…

У меня сейчас проект, в котором вообще не допустимы какие-то оплошности с пользователями. А проблема MODx-а в том, что $modx->user — публичный объект, и с ним делать можно что угодно. При чем бывает так, что и сам перегружаешь этого пользователя.
Я во избежание таких конфликтов и случайностей вообще использую дополнительный класс (привожу несколько измененный пример).

<?
class User{
static $modx;
private static $user = false;
private static $errors = array();

public static function init(& $modx){
self::$modx = $modx;
self::$user = self::$modx->getAuthenticatedUser();
}

static public function get($param){
if(!self::$user || !is_object(self::$user)){
return false;
}
switch($param){
// Обрубаем получение некоторых данных
case 'password':
case 'hash_class':
case 'salt':
return false;
break;
// Получаем тип тользователя
case 'type':
return self::getUserType();
break;
// Получаем кол-во бонусов
case 'bonuses':
return self::countBonuses();
break;
// Получаем кол-во дней
case 'subscribe_time':
return self::countSubscribe_time();
break;
default: return self::$user->get($param);
}

} .................


В момент обращения к сайту происходит инициализация данного класса с передачей в него инициализированного пользователя. А так как переменная $user приватная, исключается вероятность ее перегрузки.
Интересно, как говорится, хозяйке на заметку. Я, пожалуй, наберусь наглости и реквестирую статью на эту тему!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации