Финансовая поддержка VPS, бесплатные дополнения и docs Донаты оплачивают сервер и двигают бесплатные дополнения MODX и документацию. Поддержать

Всего 126 147 комментариев

Антон Соловьёв
Антон Соловьёв
Снёс все, установил и прописал ключи-чекреты заново — заработало.
Единственно, в яндексе соглашаюсь с условиями, он редериктит на сайт, а авторизации не происходит.
И ещё, когда первый раз пробовал зарегится через Яндекс, согласился отдать информацию, меня редериктит обратно на сайт по ссылке
адрес-сайта.ru/?hauth.done=Yandex&code=цифры,_наверно_конфиденциальные&state=
увидел сообщение в фф
Firefox определил, что сервер перенаправляет запрос на этот адрес таким образом, что он никогда не завершится.
Но Яндекса в списке требуемых сетей небыло, так что не страшно. Наверно надо там что-то при регистрации на яндексе указать. Или в настройках ЧПУ поковыряться.
Василий Наумкин
Василий Наумкин
Все просто — в ajax возвращаются все отправленные поля.

Поэтому, надо в форме сделать так:
<input type="hidden" name="photo" value="" />
<input type="file" name="newphoto" />
В поле newfile отправится загружаемый файл — именно его мы ловим в плагине.
А скрытое поле photo нужно только для того, чтобы в ajax ответе появилось значение.
Василий Наумкин
Василий Наумкин
Как будет время — постараюсь добавить это в дефолтный функционал.

А пока держи готовое решение плагином:
switch ($modx->event->name) {

case 'OnBeforeUserFormSave':
if ($mode != 'upd') {return;}
$profile = $user->getOne('Profile');

if (!empty($_FILES['newphoto']) && preg_match('/image/', $_FILES['newphoto']['type']) && $_FILES['newphoto']['error'] == 0) {
	$path = 'images/users/';
	$file = $path . md5($modx->user->id . time()).'.jpg';
	$url = MODX_ASSETS_URL . $file;
	$dst = MODX_ASSETS_PATH . $file;
	
	$tmp = explode('/', $profile->get('photo'));
	$cur = MODX_ASSETS_PATH . $path . end($tmp);
	$params = array(
		'w' => 200		// Ширина
		,'h' => 200		// Высота
		,'bg' => 'ffffff'	// Фон
		,'q' => 95		// Качество в %
		,'zc' => 0		// Обрезка, TL - это Top Left, есть еще C - center, BR - Bootom Right  и т.д.
		,'f' => 'jpg'		// Формат изображения
	);
	
	if (empty($_FILES['newphoto']['tmp_name'])) {return;}
	elseif ($profile->get('photo') && empty($_REQUEST['photo'])) {
		if (file_exists($cur)) {unlink($cur);}
		$profile->set('photo', '');
		return;
	}
	else {
		move_uploaded_file($_FILES['newphoto']['tmp_name'], $dst);
		$phpThumb = $modx->getService('modphpthumb','modPhpThumb', MODX_CORE_PATH . 'model/phpthumb/', array());
		$phpThumb->setSourceFilename($dst);
		foreach ($params as $k => $v) {
			$phpThumb->setParameter($k, $v);
		}
		if ($phpThumb->GenerateThumbnail()) {
			if (!$phpThumb->renderToFile($dst)) {
				$modx->log(modX::LOG_LEVEL_ERROR, 'Could not save rendered image to'.$dst);
			}
			if (file_exists($cur)) {unlink($cur);}
			$profile->set('photo', $url);
		}
		else {$modx->log(modX::LOG_LEVEL_ERROR, print_r($phpThumb->debugmessages, 1));}
	}
}
break;
Олег Трубин
Олег Трубин
P.S. Контроллер было не обязательно менять. Лучше использовать плагин на событие OnBeforeUserFormSave, чтобы получить картинку, проверить и добавить в сохраняемый массив.
Пытаюсь сделать, так, как ты сказал — через плагин на OnBeforeUserFormSave.
Это событие вызывается когда у тебя в функции Update запускается соответствующий процессор:
"$response = $this->office->runProcessor('profile/update', $fields);"
Я не могу понять, как мне в плагине получить массив $fields и добавить туда нужное мне поле.
Конечно в плагине доступен объект user, и я могу адрес картинки записать через него, но как тогда добиться чтобы этот адрес картинки попал в ответ ajax запроса?