Comments 12
Вопрос. А получается, что можно самому себе отправить сообщение? Проверка на ID пользователя (есть ли такой пользователь) в данных сниппетах нету. Спасибо за топик.
0
Ну я всего лишь объяснил принцип, как это делается. А добавить условие
Если вернулся null, облом. Кстати, оттуда же можно подтягивать юзернейм.
Прежде всего я это писал для своей системы, а там юзер заведомо существует, иначе ты даже не увидишь формы отправки сообщения. И id адресата подставляется автоматом.
if ($user_id != $to) ...
— дело техники. Согласен, по-хорошему надо попытаться сделать getObject('modUser', $to)
.Если вернулся null, облом. Кстати, оттуда же можно подтягивать юзернейм.
Прежде всего я это писал для своей системы, а там юзер заведомо существует, иначе ты даже не увидишь формы отправки сообщения. И id адресата подставляется автоматом.
0
И ещё, переместите топик в блог MODx :)
0
Могу я попросить более опытного товарища помочь с переносом?
0
Я, как и вы, тут только второй день :) Сначала вступите в блог habrahabr.ru/blogs/modx/, затем отредактируйте топик (В какой блог публикуем? — MODx). Вот такие вот дела.
0
Зачем параметр для сниппета [[+modx.user.id]]?
Во-первых, не надо лишний раз нагружать парсер MODx, во-вторых, такие параметры вообще НЕЛЬЗЯ создавать, ибо ничего не мешает хитроумному пользователю передать в него сторонний параметр. Надо на уровне PHP использовать $modx->user->id без каких-либо изменений.
Во-первых, не надо лишний раз нагружать парсер MODx, во-вторых, такие параметры вообще НЕЛЬЗЯ создавать, ибо ничего не мешает хитроумному пользователю передать в него сторонний параметр. Надо на уровне PHP использовать $modx->user->id без каких-либо изменений.
0
Спасибо, учту. Вот только как пользователь передаст туда параметр? Ведь парсер как раз и работает на уровне PHP?
+1
Так пользователь и не должен ничего передавать. При обращении к сайту $modx производит инициализацию пользователя.
А правильней вообще проверять есть ли авторизованный пользователь, чтобы не вываливалось ошибок, типа объекта нет
И нельзя напрямую обращаться к $modx->user;
Во-первых, $modx->user существует всегда (он автоматом его создает, даже если пользователя нет, просто дефолтовый объект с id 0);
Во-вторых, $modx->user легко подменить в любом блоке кода $modx->user = $modx->newObject(), getObject(), ->set('id')= $id и т.п.
Тупо в целях безопасности
$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 и т.п.
Тупо в целях безопасности
+1
Категорически согласен.
В свое оправдание скажу лишь, что в моем проекте пользователь-адресат заведомо существует. И форма отправки ему сообщения доступна только зарегистрированным, закрыта от посторонних ACL. Но тем не менее, лучше перебдеть))
В свое оправдание скажу лишь, что в моем проекте пользователь-адресат заведомо существует. И форма отправки ему сообщения доступна только зарегистрированным, закрыта от посторонних ACL. Но тем не менее, лучше перебдеть))
0
Это не перебдеть. Это боле-менее правильный метод программирования. Это же не чистый PHP, а фреймворк, и надо писать с учетом его стандартов и специфики. Тем более вы делитесь своим кодом. Кто-то воткнет его на проект посерьезней, а там дырка…
У меня сейчас проект, в котором вообще не допустимы какие-то оплошности с пользователями. А проблема MODx-а в том, что $modx->user — публичный объект, и с ним делать можно что угодно. При чем бывает так, что и сам перегружаешь этого пользователя.
Я во избежание таких конфликтов и случайностей вообще использую дополнительный класс (привожу несколько измененный пример).
В момент обращения к сайту происходит инициализация данного класса с передачей в него инициализированного пользователя. А так как переменная $user приватная, исключается вероятность ее перегрузки.
У меня сейчас проект, в котором вообще не допустимы какие-то оплошности с пользователями. А проблема 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 приватная, исключается вероятность ее перегрузки.
+1
Only those users with full accounts are able to leave comments. Log in, please.
Личные сообщения в MODx Revolution