Антон Фомичёв

Антон Фомичёв

С нами с 11 мая 2014; Место в рейтинге пользователей: #143
Антон Фомичёв
04 марта 2015, 16:35
0
Вот же блин, стока лишней работы, а вопрос всего лишь в одной строчке:)))

Спасибо за подсказку, пойду всё нафик перепишу:))
Антон Фомичёв
28 октября 2014, 14:01
0
Виталий, это же просто праздник какой-то!
Классная идея, классная реализация. Спасибо!
Антон Фомичёв
21 августа 2014, 12:59
0
Так я же без всякого сарказма написал:)) Действительно спасибо за дельный совет!

Я уже все сделал именно как Вы и написали в последнем комментарии и всё работает. И даже уже статус вопроса успел поменять на «Решено».
Антон Фомичёв
21 августа 2014, 12:35
0
Спасибо за дельный совет!
Антон Фомичёв
27 июля 2014, 12:30
0
Таким образом можно получить свойство $user->Profile->email, даже если именно в этот момент еще не был получен связанный объект modProfile для этого пользователя.
Вот за эту наводку — отдельное огромное спасибо! Во мне вскипает очередная волна влюблённости в modx:))
Антон Фомичёв
26 июля 2014, 21:23
0
Ууу, класс! Вот это — то что надо! Спасибо большое за наводку.

Даже как-то неудобно — нагородил я тут огород с замыканиями, а самого простого способа не увидел:))
Антон Фомичёв
25 июля 2014, 01:04
1
+1
В итоге проблема решилась, на мой взгляд, изящнее, чем расширение класса modUser.

С версии 5.3 в php появились замыкания, а с версии 5.4 к ним добавили два метода: bind и bindTo. Подробнее о теории можно почитать тут.

Эти методы позваляют связать ваше замыкание с конкретным объектом, после чего замыканию становится доступен $this. То есть, фактически, мы можем добавить на лету произвольный метод классу и он будет выполняться в контексте класса.

В рассмотренном мной в заметке случае делается так:
$user = $modx->user;
$method = function($name, $value)
	{
		$this->_setRaw($name, $value);
		return $this->save();
	}

$method = $method->bindTo($user, 'modUser');
$method('password', '12345');
Вуа-ля! Защищенный метод нам доступен из любого класса, поскольку выполняется как будто изнутри класса modUser.
Антон Фомичёв
18 июля 2014, 15:55
0
Хехе:)) Приятно слышать это от того, с чьих статей я начинал изучать MODX и кто подкинул замечательную идею управления контентом из фронтенда.
Антон Фомичёв
18 июля 2014, 15:53
0
Рад, что помог:))
Если изучать исходники, массу интересного можно найти!
Антон Фомичёв
18 июля 2014, 15:27
0
$options — массив значений.
Можно передавать subject, from, fromName, sender и html (флаг, указывающий, отправлять ли письма текстом или в виде html).
Я обычно передаю туда только
array('subject' => 'Тема письма')
Остальное подтягивается из системных настроек.
Подробнее можно глянуть тут:
https://github.com/modxcms/revolution/blob/develop/core/model/modx/moduser.class.php#L796
Антон Фомичёв
18 июля 2014, 12:12
+1
3. Перегрузка методов xPDOCacheManager. Но это уже дебри дремучие, с которыми придётся воевать с каждой новой версией modx.
Так не надо изменять их прямо в файле MODX. Напиши свою реализацию кэширования, какой-нибудь modMultipleCache, расширяющий xPDOCacheManager. Там опиши все, что тебе необходимо (собственно, и изменять поведение методов родительского класса никто не запрещал). В настройках системы укажи свой класс как отвечающий за кэширование и воевать ни с чем не придётся.
Антон Фомичёв
17 июля 2014, 13:23
1
0
Вижу два варианта.

Первый:
1. У каждой из форм есть атрибут id, а так же тэг
<input type="hidden" name="formid" value="[[+значение атрибута id]]">
2. Сниппет должен вместе с основным ответом возвращать значение $_POST['formid'] виде {«formid»:«значение»}.
3. Тогда обработчик события выглядит следующим образом:
$(document).on('af_complete', function(event,res) {
	var form = $("#"+res.formid);
	if(!res.success){
		form.find('[name="' + res.key + '"]').addClass('error');
	}
});
Второй:
1. Через гитхаб или как-то по-другому предложить Василию изменить часть кода default.js таким образом:
$(document).trigger("af_complete", response, form);
2. Если коммит будет принят, то тогда твой скрипт будет выглядеть так:
$(document).on('af_complete', function(event,res,form) {
	var $form = $(form);
	if(!res.success){
		$form.find('[name="' + res.key + '"]').addClass('error');
	}
});
Антон Фомичёв
16 июля 2014, 10:19
1
0
Я бы предложил что-то такое:

$(document).on('af_complete', function(event,res) {
	if(!res.success){
		form.find('[name="' + res.key + '"]').addClass('error');
	}
});
При этом, не забудь определить переменную form (она должна содержать объект jQuery).
Ну и твой сниппет должен отдавать json с полями success и key по меньшей мере.
Антон Фомичёв
14 июля 2014, 13:16
+2
В конструкции
$(document).on('af_complete', function(res) {
	console.log(res);
});
res предсказуемо содержит объект jquery.event, таргетом которого является $(document).
В соответствии с API jQuery дополнительные параметры передаются обработчику начиная со второго аргумента функции.

То есть так:
$(document).on('af_complete', function(event,res) {
	console.log(res);
});
Антон Фомичёв
11 июля 2014, 14:38
0
Было же недавно
А вообще, у меня такое только при запуске кроном через API_MODE. И только при использовании APC.
А у тебя ошибки генерит index.php. Подозреваю, что-то не так с настройками кэширования MODX.

Если используешь APC, то почитай здесь в сообществе статью Василия об этом. Там после изменения класса-обработчика кэша надо еще один параметр добавить, иначе есть вероятность пересечения кэшей разных сайтов, крутящихся на одном сервере. Ну и он должен присутствовать в виде установленного аддона к PHP и быть включенным в php.ini
Антон Фомичёв
11 июля 2014, 14:19
0
0.0046291: Created inline chunk
2.0591421: Total time
4 456 448: Memory usage

Ужжжасный компутер клиента, co-location, халявный.
Скока он мне мозга вынес с постоянной нехваткой памяти, дикими тормозами и отваливанием MySQL.
Стараюсь плавно агитировать за переход в нормальное облако. Все же это дешевле нового сервера тыщ за 100-150.
Антон Фомичёв
07 июля 2014, 14:10
0
Понял-понял, спасибо:)) Просто не успеваю так быстро отвечать:))
Антон Фомичёв
07 июля 2014, 14:10
0
Вот это уже больше подходит, спасибо!
Хотя всё равно придётся много где в моём коде внести изменения.

Странно, конечно, что этот метод объявлен защищенным… Его использование в моей ситуации здорово бы всё упростило:))
Антон Фомичёв
07 июля 2014, 14:06
0
Тебе нужно для обмена с удаленной БД, а не для авторизации — или я неправильно понял?
Не совсем так. Я получаю хэш пароля от удалённой БД и потом использую его для авторизации на сайте. Причины, по которым устроено всё именно так, сложны и многогранны и многими гранями упираются в требования заказчика:))

Есть нормальная работа с юзерами с одной стороны, а есть таблица id — открытый пароль, с другой.
Во-первых, не хотелось бы хранить пароль открытым, во-вторых, работа с юзерами и обмен с БД, как я написал выше, неразделимы. Я получаю хэш и он должен в итоге позволять пользователю авторизоваться во фронт-энде.

По моему, это гораздо красивее, чем вламываться в нутро движка и все там курочить.
Абсолютно согласен, я это сделал только как временное решение, чтобы сайт мог продолжать работать, пока я разбираюсь.
Антон Фомичёв
07 июля 2014, 13:57
0
А, мы, наверное, не поняли друг друга. Проблема не в том, что мне надо передать пароль удалённой БД (тут как раз всё просто), проблема в том, что я получаю хэш пароля из удалённой БД и мне его надо записать в БД сайта в обход хэширования.