Personnellement j'ai implémenté la fonctionnalité d'upload d'avatar depuis le site en spécifique sur le mien en alternative à gravatar. Ce n'est pas très compliqué :
- injecter le membre du forum pour ajouter un champ avatar :
<add name="avatar" type="modules_media/media" preserve-old-value="true" />
- surcharger le template d'édition pour y ajouter le champ (Forums-Block-EditMemberProfile-Input.all.all.html) :
<li>
<label change:fieldlabel="name avatar"></label>
<input change:uploadfield="name avatar" labeled="false" accept="png,jpg,jpeg" />
<p class="help-text">${trans:m.forums.document.member.avatar-help,ucf}</p>
</li>- surcharger la méthode getGravtarUrl du membre pour en tenir compte :
/**
* @param Integer $size
* @param String $defaultImageUrl
* @param String $rating
* @return String
*/
public function getGravatarUrl($size = '32', $defaultImageUrl = '', $rating = 'g')
{
$avatar = $this->getAvatar();
if ($avatar === null)
{
return parent::getGravatarUrl($size, $defaultImageUrl, $rating);
}
$format = array(
'max-width' => $size . 'px',
'max-height' => $size . 'px'
);
return LinkHelper::getDocumentUrl($avatar, null, $format);
}- enfin dans le service du membre j'ai surchargé les méthodes preSave et postSave pour bien gérer le champ (en convertissant le tmpfile en média et supprimant l'ancien en cas de changement) :
/**
* @param forumsextended_persistentdocument_forummember $document
* @param Integer $parentNodeId Parent node ID where to save the document (optionnal => can be null !).
* @return void
*/
protected function preSave($document, $parentNodeId)
{
parent::preSave($document, $parentNodeId);
if ($document->getAvatar() instanceof media_persistentdocument_tmpfile)
{
$avatar = media_MediaService::getInstance()->importFromTempFile($document->getAvatar());
$document->setAvatar($avatar);
}
}
/**
* @param forumsextended_persistentdocument_forummember $document
* @param Integer $parentNodeId Parent node ID where to save the document.
* @return void
*/
protected function postUpdate($document, $parentNodeId)
{
parent::postUpdate($document, $parentNodeId);
$oldId = $document->getAvatarOldValueId();
$avatar = $document->getAvatar();
if ($oldId && ($avatar === null || $oldId !== $avatar->getId()))
{
DocumentHelper::getDocumentInstance($oldId)->delete();
}
}Je crois que c'est tout... ça peut être testé ici :
http://test.funomanciens.fr