Специфика продукта в его модульности. Это накладывает свои нюансы в разработке. Один из них: у пользователя сайта разные аватары для блогов и форума. А социальная сеть хранит фотографию в свойствах пользователя. Такая "фича" понятна не всем пользователям, можно написать обработчик, который автоматически будет создавать нужные копии аватара.
[spoiler]
15.09.2010 Поправил код: теперь удаляются старые аватары. Спасибо Дмитрию Яковенко.
Кстати, есть и другой вариант: переписать шаблоны компонентов, так чтобы они все брали аватар из одного места (не складно получилось ). Но это весьма трудоёмко.
Делаем следующее: на событие обновления профиля пользователя (предполагаем, что это делается из социальной сети) проверяем наличие фотографии, затем масштабируем её до нужных размеров и помещаем в блоги и соцсеть.
Надо сказать, что эта задача требует внимательного чтения справки по АПИ: каждая строчка содержит какой-то нюанс, можно использовать как пособие для начинающих программистов под Битрикс
Итак, вставляем в /bitrix/php_interface/init.php
AddEventHandler("main", "OnAfterUserUpdate", Array("MyClass", "OnUserUpdate"));
class MyClass
{
function OnUserUpdate(&$arFields)
{
$arSize = array('width'=>100, 'height'=>100);
if ($arFields['PERSONAL_PHOTO'])
{
if ($arTmp = CFile::ResizeImageGet($arFields['PERSONAL_PHOTO'], $arSize))
{
$arFile = CFile::MakeFileArray($_SERVER['DOCUMENT_ROOT'].$arTmp['src']);
if (CModule::IncludeModule('blog'))
{
$arUser = CBlogUser::GetByID($arFields['ID'], BLOG_BY_USER_ID);
if (intval($arUser['AVATAR'])>0)
{
$arFile['del'] = 'Y';
$arFile['old_file'] = $arUser['AVATAR'];
}
CBlogUser::Update($arUser['ID'], array('AVATAR' => $arFile));
unset($arFile['del']);
unset($arFile['old_file']);
}
if (CModule::IncludeModule('forum'))
{
$arUser = CForumUser::GetByUSER_ID($arFields['ID']);
if (intval($arUser['AVATAR'])>0)
{
$arFile['del'] = 'Y';
$arFile['old_file'] = $arUser['AVATAR'];
}
CForumUser::Update($arUser['ID'], array('AVATAR' => $arFile));
}
}
}
}
}
Теперь после каждого обновления профиля пользователя из компонентов соцсети или из админки будут автоматически создаваться уменьшенные копии фотографии для аватаров блогов и форумов.
В моём примере указан размер 100x100, установите значения по своему усмотрению.
А как быть, если, скажем, у вас уже есть 16000 пользователей с разными аватарами?
Открываем выполнение php кода из админки и выполняем
Для всех пользователей, у кого указана фотография, она будет установлена как аватар. Но будьте осторожны, если аватары уже есть, они будут перезаписаны!
Общий аватар очень правильная идея. Вообще профиль пользователя должен быть единым, а те или иные модули лишь добавляют его своими функциями.
Некоторые пользовательские данные одни и те же в каждом из этих модулей (аватар, ник, имя и т.д.), так логично их хранить в одном месте и использовать в разных модулях.
Денис, а фоточки, которые уже у пользователей есть, при апдейте останутся в файловой системе и табличке b_file? А так понимаю, чтобы избежать того, что файлы будут оставаться нужно немного модифицировать ваш пример
if ($arFields['PERSONAL_PHOTO'])
{
if (CModule::IncludeModule('blog'))
{
if ($arTmp = CFile::ResizeImageGet($arFields['PERSONAL_PHOTO'], $arSize))
{
$arFile = CFile::MakeFileArray($_SERVER['DOCUMENT_ROOT'].$arTmp['src']);
$arUser = CBlogUser::GetByID($arFields['ID'], BLOG_BY_USER_ID);
if (intval($arUser['AVATAR'])>0)
{
$arFile['del'] = 'Y';
$arFile['old_file'] = $arUser['AVATAR'];
}
CBlogUser::Update($arUser['ID'], array('AVATAR' => $arFile));
}
}
if (CModule::IncludeModule('forum'))
{
if ($arTmp = CFile::ResizeImageGet($arFields['PERSONAL_PHOTO'], $forumSize))
{
$arFile = CFile::MakeFileArray($_SERVER['DOCUMENT_ROOT'].$arTmp['src']);
$arUser = CForumUser::GetByUSER_ID($arFields['ID']);
if (intval($arUser['AVATAR'])>0)
{
$arFile['del'] = 'Y';
$arFile['old_file'] = $arUser['AVATAR'];
}
CForumUser::Update($arUser['ID'], array('AVATAR' => $arFile));
}
}
}
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».