User picture: Update contact's image attribute with preferences' placeholder so it can be used elsewhere

This commit is contained in:
Molkobain
2021-03-25 12:05:22 +01:00
parent 5d3a829f65
commit ba994c91fc
6 changed files with 116 additions and 8 deletions

View File

@@ -294,6 +294,7 @@ return array(
'Combodo\\iTop\\Composer\\iTopComposer' => $baseDir . '/sources/Composer/iTopComposer.php',
'Combodo\\iTop\\Controller\\AjaxRenderController' => $baseDir . '/sources/Controller/AjaxRenderController.php',
'Combodo\\iTop\\Controller\\Base\\Layout\\ActivityPanelController' => $baseDir . '/sources/Controller/Base/Layout/ActivityPanelController.php',
'Combodo\\iTop\\Controller\\PreferencesController' => $baseDir . '/sources/Controller/PreferencesController.php',
'Combodo\\iTop\\DesignDocument' => $baseDir . '/core/designdocument.class.inc.php',
'Combodo\\iTop\\DesignElement' => $baseDir . '/core/designdocument.class.inc.php',
'Combodo\\iTop\\Form\\Field\\BlobField' => $baseDir . '/sources/Form/Field/BlobField.php',

View File

@@ -524,6 +524,7 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b
'Combodo\\iTop\\Composer\\iTopComposer' => __DIR__ . '/../..' . '/sources/Composer/iTopComposer.php',
'Combodo\\iTop\\Controller\\AjaxRenderController' => __DIR__ . '/../..' . '/sources/Controller/AjaxRenderController.php',
'Combodo\\iTop\\Controller\\Base\\Layout\\ActivityPanelController' => __DIR__ . '/../..' . '/sources/Controller/Base/Layout/ActivityPanelController.php',
'Combodo\\iTop\\Controller\\PreferencesController' => __DIR__ . '/../..' . '/sources/Controller/PreferencesController.php',
'Combodo\\iTop\\DesignDocument' => __DIR__ . '/../..' . '/core/designdocument.class.inc.php',
'Combodo\\iTop\\DesignElement' => __DIR__ . '/../..' . '/core/designdocument.class.inc.php',
'Combodo\\iTop\\Form\\Field\\BlobField' => __DIR__ . '/../..' . '/sources/Form/Field/BlobField.php',

View File

@@ -6,6 +6,7 @@
use Combodo\iTop\Controller\AjaxRenderController;
use Combodo\iTop\Controller\Base\Layout\ActivityPanelController;
use Combodo\iTop\Controller\PreferencesController;
use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer;
use Combodo\iTop\Renderer\Console\ConsoleFormRenderer;
@@ -2736,6 +2737,24 @@ EOF
$oPage->add(json_encode($aResult));
break;
//--------------------------------
// Preferences
//--------------------------------
case 'preferences_set_user_picture':
$oPage = new JsonPage();
try {
$aResult = PreferencesController::SetUserPicture();
$aResult['success'] = true;
}
catch (Exception $oException) {
$aResult = [
'success' => false,
'error_message' => $oException->getMessage(),
];
}
$oPage->SetData($aResult);
break;
//--------------------------------
// Activity panel
//--------------------------------

View File

@@ -402,9 +402,28 @@ JS
$oP->add_ready_script(
<<<JS
$('[data-role="ibo-preferences--user-preferences--picture-placeholder--image"]').on('click',function(){
SetUserPreference('user_picture_placeholder', $(this).attr('data-image-name'), true);
$('[data-role="ibo-preferences--user-preferences--picture-placeholder--image"]').removeClass('ibo-is-active');
$(this).addClass('ibo-is-active');
const me = this;
// Save new preference
$.post(
GetAbsoluteUrlAppRoot()+'pages/ajax.render.php',
{
'operation': 'preferences_set_user_picture',
'image_filename': $(this).attr('data-image-name')
}
)
.done(function(oData){
if(false === oData.success){
return;
}
// Update selection
$('[data-role="ibo-preferences--user-preferences--picture-placeholder--image"]').removeClass('ibo-is-active');
$(me).addClass('ibo-is-active');
// Update navigation menu
$('[data-role="ibo-navigation-menu--user-picture--image"]').attr('src', oData.data.image_url);
});
});
JS
);

View File

@@ -0,0 +1,67 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\Controller;
use appUserPreferences;
use Exception;
use MetaModel;
use ormDocument;
use UserRights;
use utils;
/**
* Class PreferencesController
*
* @internal
* @author Guillaume Lajarige <guillaume.lajarige@combodo.com>
* @since 3.0.0
* @package Combodo\iTop\Controller
*/
class PreferencesController
{
/**
* @return string[]
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \MySQLException
* @throws \Exception
*/
public static function SetUserPicture(): array
{
$sImageFilename = utils::ReadPostedParam('image_filename', null, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
// Set preference for the user
appUserPreferences::SetPref('user_picture_placeholder', $sImageFilename);
$sUserPicturesFolder = 'images/user-pictures/';
$sImageAbsPath = APPROOT.$sUserPicturesFolder.$sImageFilename;
$sImageAbsUrl = utils::GetAbsoluteUrlAppRoot().$sUserPicturesFolder.$sImageFilename;
// Check file can be read
$sImageData = file_get_contents($sImageAbsPath);
if (false === $sImageData) {
throw new Exception('Error while updating user image, could not open file "'.$sImageAbsPath.'"');
}
// Check if user has a contact with an image attribute, so we put the image in it also
$sPersonClass = 'Person';
if (true === MetaModel::HasImageAttributeCode($sPersonClass)) {
$oCurContact = UserRights::GetContactObject();
if (null !== $oCurContact) {
// Update contact
$sImageMimeType = mime_content_type($sImageAbsPath);
$oOrmImage = new ormDocument($sImageData, $sImageMimeType, $sImageFilename);
$sImageAttCode = MetaModel::GetImageAttributeCode($sPersonClass);
$oCurContact->Set($sImageAttCode, $oOrmImage);
$oCurContact->DBUpdate();
}
}
return ['image_url' => $sImageAbsUrl];
}
}

View File

@@ -42,11 +42,12 @@
</div>
</div>
{% endif %}
<div class="ibo-navigation-menu--user-info">
<div class="ibo-navigation-menu--user-picture">
<a data-role="ibo-navigation-menu--user-menu--toggler" href="#">
<img class="ibo-navigation-menu--user-picture--image"
src="{{ oUIBlock.GetUserData().sPictureUrl }}"
<div class="ibo-navigation-menu--user-info">
<div class="ibo-navigation-menu--user-picture">
<a data-role="ibo-navigation-menu--user-menu--toggler" href="#">
<img class="ibo-navigation-menu--user-picture--image"
data-role="ibo-navigation-menu--user-picture--image"
src="{{ oUIBlock.GetUserData().sPictureUrl }}"
alt="{{ 'UI:Layout:NavigationMenu:UserInfo:Picture:AltText'|dict_format(oUIBlock.GetUserData().sFirstname) }}"
data-tooltip-content="{{ oUIBlock.GetUserData().sLogonMessage }}"
data-tooltip-placement="right"