resolve conflic
|
@ -14,6 +14,10 @@ websocket:
|
||||||
resource: "@CadolesWebsocketBundle/Resources/config/routing.yml"
|
resource: "@CadolesWebsocketBundle/Resources/config/routing.yml"
|
||||||
prefix: /
|
prefix: /
|
||||||
|
|
||||||
|
edispatcher:
|
||||||
|
resource: "@CadolesEdispatcherBundle/Resources/config/routing.yml"
|
||||||
|
prefix: /
|
||||||
|
|
||||||
lightsaml_sp:
|
lightsaml_sp:
|
||||||
resource: "@LightSamlSpBundle/Resources/config/routing.yml"
|
resource: "@LightSamlSpBundle/Resources/config/routing.yml"
|
||||||
prefix: saml
|
prefix: saml
|
||||||
|
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.7 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
@ -0,0 +1,71 @@
|
||||||
|
|
||||||
|
$(function() {
|
||||||
|
var _reduit_timeout=null
|
||||||
|
var _resize_timeout=null
|
||||||
|
var METICE= {
|
||||||
|
logoutSelector : ".navbar-top-links li:last-child a",
|
||||||
|
logoutSessionName : "_metice_logout"
|
||||||
|
}
|
||||||
|
window.addEventListener("message", function(msg){
|
||||||
|
|
||||||
|
var header = window.top.document.getElementsByClassName("header")
|
||||||
|
|
||||||
|
// logout url envoyé par message, pour changer le lien de logout
|
||||||
|
if (msg.data.message=="setLogoutUrl" && header && header.length!=0) {
|
||||||
|
|
||||||
|
// récupère la valeur de l'attribut href du lien de login/logout
|
||||||
|
var elt=header[0].querySelector(METICE.logoutSelector);
|
||||||
|
var logoutUrl=elt.getAttribute("href")
|
||||||
|
// Ce n'est pas du logout => on ne fait rien
|
||||||
|
if (logoutUrl.indexOf("logout")==-1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// url de logout déja renseignée, on va l'utiliser
|
||||||
|
var logoutSession = sessionStorage.getItem(METICE.logoutSessionName)
|
||||||
|
if (logoutSession) {
|
||||||
|
if (header && header.length!=0) { header[0].querySelector(METICE.logoutSelector).setAttribute("href",logoutSession) }
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var elt=header[0].querySelector(METICE.logoutSelector);
|
||||||
|
logoutUrl = window.location.origin+logoutUrl
|
||||||
|
elt.setAttribute("href",msg.data.url+"?orign="+logoutUrl)
|
||||||
|
// Sauvegarde de l'url de logout, pour restauration lors de l'actualisation page
|
||||||
|
sessionStorage.setItem(METICE.logoutSessionName,msg.data.url+"?orign="+logoutUrl)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// message on scroll, pour réduire le header
|
||||||
|
if (msg.data.message=="onScroll" && header && header.length!=0){
|
||||||
|
|
||||||
|
if (msg.data.position > 100 ) {
|
||||||
|
if(_reduit_timeout) {clearTimeout(_reduit_timeout);_reduit_timeout=null}
|
||||||
|
header[0].classList.add("reduit");
|
||||||
|
if (_resize_timeout==null) {
|
||||||
|
_resize_timeout=setTimeout(function() {console.log("resize");window.top.resizeFrame();_resize_timeout=null},100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg.data.position == 0 ) {
|
||||||
|
header[0].classList.remove("reduit");
|
||||||
|
_reduit_timeout = setTimeout(function(){ console.log("resize");window.top.resizeFrame();},100)
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Remise en place de l'url de logout si c'est une url de logout qui est présente dans
|
||||||
|
var header = window.top.document.getElementsByClassName("header")
|
||||||
|
if (header && header.length!=0) {
|
||||||
|
var logout = sessionStorage.getItem(METICE.logoutSessionName)
|
||||||
|
var elt = header[0].querySelector(METICE.logoutSelector);
|
||||||
|
var logoutUrl = elt.getAttribute("href")
|
||||||
|
|
||||||
|
if (logout && logoutUrl.indexOf("logout")!=-1) {
|
||||||
|
header[0].querySelector(METICE.logoutSelector).setAttribute("href",logout)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
After Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 556 KiB After Width: | Height: | Size: 22 KiB |
|
@ -1,53 +1,186 @@
|
||||||
div.header {
|
/* feuille de style Ninegate
|
||||||
background-image: linear-gradient(90deg,rgba(255,255,255,1) 0%, rgba(255,255,255,1) 15%, rgba(255,255,255,0.1) 50%, rgba(255,255,255,0) 100%),var(--header) !important;
|
* METICE 2020 - Académie de la Réunion
|
||||||
|
* --
|
||||||
|
* DSI4
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Teintes en fonction du profil utilisateur */
|
||||||
|
|
||||||
|
/* eleves #VERT #169B62
|
||||||
|
* dark : #3b8211
|
||||||
|
* light : #dffdcf
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ====== ESSAI D'UN MODE REDUIT ======= */
|
||||||
|
.header.reduit {
|
||||||
|
height: 38px !important;
|
||||||
|
overflow-y: hidden;
|
||||||
|
}
|
||||||
|
.header.reduit .nav.navbar-top-links.navbar-right > li a {font-size: 1.5em; }
|
||||||
|
|
||||||
|
.header .title img {transition:margin-left 0.1s ease; }
|
||||||
|
.header.reduit .title img { margin-left:-300px !important;}
|
||||||
|
.header.reduit small {
|
||||||
|
top: 18px !important;
|
||||||
|
font-size: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header.reduit > a.title > span {
|
||||||
|
line-height: 25px !important;
|
||||||
|
transition:line-height 0.5s ease;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header.reduit .avatar {height: 25px; }
|
||||||
|
|
||||||
|
/* ===================== FIN MODE REDUIT ==========================*/
|
||||||
|
|
||||||
|
/* fix defaut d'affichage sur toogle switch */
|
||||||
|
body, .slick .slicksubtitle, .slick .slicklink { height: 30px;}
|
||||||
|
body {
|
||||||
|
background: linear-gradient(180deg, var(--main), white,50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
body.eleves, body.grp-National_1 {
|
||||||
|
--colorbody: #ffffff;
|
||||||
|
--main: #169b62;
|
||||||
|
--mainR: 22;
|
||||||
|
--mainG: 155;
|
||||||
|
--mainB: 98;
|
||||||
|
--dark: #006930;
|
||||||
|
--darkR: 0;
|
||||||
|
--darkG: 105;
|
||||||
|
--darkB: 48;
|
||||||
|
--light: #48cd94;
|
||||||
|
--lightR: 72;
|
||||||
|
--lightG: 205;
|
||||||
|
--lightB: 148;
|
||||||
|
--heightheader: 150;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* responsables #MAUVE #7D4E5B
|
||||||
|
*/
|
||||||
|
|
||||||
|
body.responsables, body.grp-National_2 {
|
||||||
|
--colorbody: #ffffff;
|
||||||
|
--main: #7d4e5b;
|
||||||
|
--mainR: 125;
|
||||||
|
--mainG: 78;
|
||||||
|
--mainB: 91;
|
||||||
|
--dark: #4b1c29;
|
||||||
|
--darkR: 75;
|
||||||
|
--darkG: 28;
|
||||||
|
--darkB: 41;
|
||||||
|
--light: #af7f8d;
|
||||||
|
--lightR: 175;
|
||||||
|
--lightG: 128;
|
||||||
|
--lightB: 141;
|
||||||
|
--heightheader: 150;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* professeurs, enseignants1d #BLEU1 #5770BE */
|
||||||
|
body.professeurs, body.enseignants1d, body.grp-National_3 {
|
||||||
|
--colorbody: #ffffff;
|
||||||
|
--main: #5770be;
|
||||||
|
--mainR: 87;
|
||||||
|
--mainG: 112;
|
||||||
|
--mainB: 190;
|
||||||
|
--dark: #253e8c;
|
||||||
|
--darkR: 37;
|
||||||
|
--darkG: 62;
|
||||||
|
--darkB: 140;
|
||||||
|
--light: #89a2f0;
|
||||||
|
--lightR: 137;
|
||||||
|
--lightG: 162;
|
||||||
|
--lightB: 240;
|
||||||
|
--heightheader: 150;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* administratifs, admin #ORANGE #FF6F4C */
|
||||||
|
body.administratifs, body.admin, body.grp-National_4 , body.grp-National_5, body.grp-National_6 {
|
||||||
|
--colorbody: #ffffff;
|
||||||
|
--main: #ff6f4c;
|
||||||
|
--mainR: 255;
|
||||||
|
--mainG: 111;
|
||||||
|
--mainB: 76;
|
||||||
|
--dark: #cd3d1a;
|
||||||
|
--darkR: 205;
|
||||||
|
--darkG: 61;
|
||||||
|
--darkB: 26;
|
||||||
|
--light: #ffa17e;
|
||||||
|
--lightR: 255;
|
||||||
|
--lightG: 161;
|
||||||
|
--lightB: 126;
|
||||||
|
--heightheader: 150;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* PersAcad #BLEU2 #484d7a */
|
||||||
|
body.PersAcad, body.grp-National_7, body.grp-PersAcad {
|
||||||
|
--colorbody: #ffffff;
|
||||||
|
--main: #484d7a;
|
||||||
|
--mainR: 72;
|
||||||
|
--mainG: 77;
|
||||||
|
--mainB: 122;
|
||||||
|
--dark: #161b48;
|
||||||
|
--darkR: 22;
|
||||||
|
--darkG: 27;
|
||||||
|
--darkB: 72;
|
||||||
|
--light: #7a7fac;
|
||||||
|
--lightR: 122;
|
||||||
|
--lightG: 127;
|
||||||
|
--lightB: 172;
|
||||||
|
--heightheader: 150;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cartouche header Métice - région académique La Réunion */
|
||||||
|
|
||||||
|
div.header {
|
||||||
|
background: white !important;
|
||||||
|
/*background-image: linear-gradient(45deg, white 200px, var(--light));
|
||||||
|
background-position-x: 300px;
|
||||||
|
background-repeat: no-repeat;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
.avatar { background-color: var(--main) !important; }
|
|
||||||
|
|
||||||
#logo {
|
#logo {
|
||||||
height: 79px !important;
|
height: 130px !important;
|
||||||
float: left !important;
|
float: left !important;
|
||||||
top: -8px !important;
|
top: -10px !important;
|
||||||
left: -10px !important;
|
left: 0px !important;
|
||||||
position: relative !important;
|
position: relative !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.header > a > span {
|
.container-fluid #logo { display: none; }
|
||||||
|
|
||||||
|
.header .avatar {height: 32px; }
|
||||||
|
|
||||||
|
.header .title {
|
||||||
|
font-size: 30px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.header > a.title > span {
|
||||||
color: black !important;
|
color: black !important;
|
||||||
|
line-height: 114px !important;
|
||||||
|
padding-left: 20px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
nav#appmenu > ul > li.active > a.active, .nav>li>a:hover {
|
.header small {
|
||||||
background-color: white !important;
|
/* font-size: 16px !important; */
|
||||||
color: var(--main);
|
font-size: initial;
|
||||||
font-weight: bold;
|
top: 24px !important;
|
||||||
|
margin-left: 3px !important;
|
||||||
|
font-family: var(--fontfacebody) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar-default, .grid-item, .widgetheader {
|
/* reprise des couleurs sur les icones d'action */
|
||||||
background-color: var(--main) !important;
|
|
||||||
}
|
|
||||||
.grid-item-content {
|
|
||||||
background-color: var(--dark) !important;
|
|
||||||
}
|
|
||||||
.widget-mini > .widgetheader {
|
|
||||||
background-color: var(--light) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
.nav.navbar-top-links.navbar-right > li a {
|
||||||
.navbar-default { border-color: var(--light) !important }
|
color: var(--main, #337ab7) !important;
|
||||||
|
font-size: 2.0em;
|
||||||
.nav > li > a:hover {
|
padding-top: 9px;
|
||||||
background:none !important;
|
|
||||||
}
|
}
|
||||||
.nav.navbar-top-links.navbar-left>li>a:hover {
|
.nav.navbar-top-links.navbar-right > li a:hover {
|
||||||
text-shadow: var(--light) 0px 0px 20px;
|
color: var(--fontcolorhover, white) !important;
|
||||||
color: var(--main) !important;
|
background: var(--fontcolorhoverdark, black) !important;
|
||||||
background-color: var(--light) !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav.navbar-top-links.navbar-right>li>a:hover {
|
|
||||||
text-shadow: white 0px 0px 20px;
|
|
||||||
color: var(--main) !important;
|
|
||||||
background: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav#appmenu { zoom: 0.68; font-weight: bold; }
|
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
*~
|
||||||
|
*.swp
|
||||||
|
*.swo
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Cadoles\EdispatcherBundle;
|
||||||
|
|
||||||
|
use Symfony\Component\HttpKernel\Bundle\Bundle;
|
||||||
|
|
||||||
|
class CadolesEdispatcherBundle extends Bundle
|
||||||
|
{
|
||||||
|
}
|
|
@ -0,0 +1,903 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Cadoles\EdispatcherBundle\Controller;
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
|
||||||
|
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
|
||||||
|
use Symfony\Component\EventDispatcher\EventDispatcher;
|
||||||
|
use Doctrine\Common\Collections\ArrayCollection;
|
||||||
|
use Symfony\Component\Finder\Finder;
|
||||||
|
use Symfony\Component\Filesystem\Filesystem;
|
||||||
|
use Symfony\Component\HttpFoundation\File\File;
|
||||||
|
use GuzzleHttp\Exception\RequestException;
|
||||||
|
use Symfony\Component\Form\FormError;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
|
||||||
|
use Symfony\Component\Serializer\Serializer;
|
||||||
|
|
||||||
|
use Cadoles\CoreBundle\Entity\User;
|
||||||
|
use Cadoles\CoreBundle\Entity\Group;
|
||||||
|
use Cadoles\CoreBundle\Entity\UserGroup;
|
||||||
|
use Cadoles\CoreBundle\Entity\UserModo;
|
||||||
|
use Cadoles\CoreBundle\Entity\Niveau01;
|
||||||
|
use Cadoles\CoreBundle\Entity\Niveau02;
|
||||||
|
use Cadoles\WebsocketBundle\Entity\Message;
|
||||||
|
|
||||||
|
use Cadoles\CoreBundle\Form\UserType;
|
||||||
|
use Cadoles\CoreBundle\Form\MailingType;
|
||||||
|
|
||||||
|
use Cadoles\PortalBundle\Entity\Pagewidget;
|
||||||
|
use Cadoles\PortalBundle\Form\PagewidgetType;
|
||||||
|
use Cadoles\PortalBundle\Entity\Bookmark;
|
||||||
|
|
||||||
|
use Cadoles\CASBundle\Controller\SecurityController;
|
||||||
|
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||||
|
|
||||||
|
use Cadoles\EdispatcherBundle\Entity\Datasource;
|
||||||
|
|
||||||
|
class ApiController extends Controller
|
||||||
|
{
|
||||||
|
public function testAction() {
|
||||||
|
|
||||||
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
$datasource = $em->getRepository('CadolesEdispatcherBundle:Datasource')->findAll();
|
||||||
|
$request = $this->container->get('request_stack')->getCurrentRequest();
|
||||||
|
$id = $request->query->get('id',false);
|
||||||
|
if ($id) {
|
||||||
|
$user=$em->getRepository('CadolesCoreBundle:User')->findOneBy(["username"=>$id]);
|
||||||
|
if (!$user) {
|
||||||
|
$output["error"]="id=".$id." : user not found";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
$groups = array();
|
||||||
|
foreach($user->getGroups() as $usergroup) {
|
||||||
|
$tmp = $usergroup->getGroup()->getLabel();
|
||||||
|
array_push($groups,$tmp);
|
||||||
|
}
|
||||||
|
$groups = implode("|",$groups);
|
||||||
|
} else $groups = "syntaxe: /edispatcher/test?id={username} - pour afficher une liste des groupes d'un username arbitraire (pas celui en session)";
|
||||||
|
// Init Client CAS
|
||||||
|
\phpCAS::setDebug(false);
|
||||||
|
\phpCAS::client(CAS_VERSION_2_0, $this->getParameter('cas_host'), $this->getParameter('cas_port'), is_null($this->getParameter('cas_path')) ? '' : $this->getParameter('cas_path'), false);
|
||||||
|
\phpCAS::setNoCasServerValidation();
|
||||||
|
|
||||||
|
// Authentification
|
||||||
|
\phpCAS::forceAuthentication();
|
||||||
|
|
||||||
|
// Récupération UID
|
||||||
|
$username = \phpCAS::getUser();
|
||||||
|
$attributes = \phpCAS::getAttributes();
|
||||||
|
|
||||||
|
return $this->render('CadolesEdispatcherBundle:Test:test.html.twig',[
|
||||||
|
'useheader' => true,
|
||||||
|
'usemenu' => false,
|
||||||
|
'usesidebar' => false,
|
||||||
|
'attributes' => $attributes,
|
||||||
|
'groups' => $groups,
|
||||||
|
'username' => $username,
|
||||||
|
'datasource' => $datasource,
|
||||||
|
]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function desktopitemAction() {
|
||||||
|
$request = $this->container->get('request_stack')->getCurrentRequest();
|
||||||
|
$id = $request->query->get('id','null');
|
||||||
|
|
||||||
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
// Récupération Attribut
|
||||||
|
// acces base pour recuperer profil et groupe pour le user
|
||||||
|
$datasource = $em->getRepository('CadolesEdispatcherBundle:Datasource')->findOneBy(["iddatasource"=>$id]);
|
||||||
|
if (!$datasource) {
|
||||||
|
$output["error"]="no datasource session found for id = $id";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
$login = $datasource->getUsername();
|
||||||
|
$profil = $datasource->getProfil();
|
||||||
|
|
||||||
|
// Récupérer l'utilisateur
|
||||||
|
$user=$em->getRepository('CadolesCoreBundle:User')->findOneBy(["username"=>$login]);
|
||||||
|
if(!$user) {
|
||||||
|
$output["error"]="user not exist";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
$groups = array();
|
||||||
|
foreach($user->getGroups() as $usergroup) {
|
||||||
|
$tmp = $usergroup->getGroup()->getLabel();
|
||||||
|
array_push($groups,$tmp);
|
||||||
|
}
|
||||||
|
$groupes=implode("|",$groups);
|
||||||
|
|
||||||
|
$listessoitems = $datasource->getSsoitems();
|
||||||
|
$ssoitems=explode("|",$listessoitems);
|
||||||
|
|
||||||
|
|
||||||
|
// Format de sortie
|
||||||
|
$output["bookmarks"] = [];
|
||||||
|
$output["items"] = [];
|
||||||
|
$output["itemcategorys"] = [];
|
||||||
|
|
||||||
|
$bookmarks=null;
|
||||||
|
$items=null;
|
||||||
|
$itemcategorys=null;
|
||||||
|
$weburl="https://".$this->getParameter("weburl")."/".$this->getParameter("alias")."/";
|
||||||
|
|
||||||
|
$em->getRepository("CadolesPortalBundle:Item")->getUserItems($user,$bookmarks,$items,$itemcategorys,null,$ssoitems,3);
|
||||||
|
|
||||||
|
$itemsperso = false;
|
||||||
|
if($bookmarks) {
|
||||||
|
foreach($bookmarks as $bookmark) {
|
||||||
|
$tmp=[];
|
||||||
|
$tmp["id"] = $bookmark->getId();
|
||||||
|
$tmp["title"] = $bookmark->getTitle();
|
||||||
|
$tmp["subtitle"] = $bookmark->getSubtitle();
|
||||||
|
$tmp["url"] = $bookmark->getUrl();
|
||||||
|
$tmp["target"] = $bookmark->getTarget();
|
||||||
|
$tmp["order"] = 0;
|
||||||
|
$tmp["icon"] = $weburl.($bookmark->getIcon()?$bookmark->getIcon()->getLabel():"uploads/icon/icon_pin.png");
|
||||||
|
$tmp["color"] = ($bookmark->getColor()?$bookmark->getColor():$this->get('session')->get('color')["main"]);
|
||||||
|
$tmp["essential"] = false;
|
||||||
|
if ($bookmark->getItem())
|
||||||
|
$tmp["category"] = $bookmark->getItem()->getItemcategory()->getId();
|
||||||
|
else {
|
||||||
|
$tmp["category"] = -999;
|
||||||
|
$itemsperso = true;
|
||||||
|
}
|
||||||
|
$tmp["badge_url"] = "";
|
||||||
|
$tmp["badge_type"] = "";
|
||||||
|
$tmp["badge_message"] = "";
|
||||||
|
$tmp["mode"] = false;
|
||||||
|
|
||||||
|
if ($tmp["category"] != -999) array_push($output["bookmarks"],$tmp);
|
||||||
|
array_push($output["items"],$tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$arrayitems = array();
|
||||||
|
if($items) {
|
||||||
|
foreach($items as $item) {
|
||||||
|
$tmp=[];
|
||||||
|
$tmp["id"] = $item->getId();
|
||||||
|
$tmp["title"] = $item->getTitle();
|
||||||
|
$tmp["subtitle"] = $item->getSubtitle();
|
||||||
|
$tmp["url"] = $item->getUrl();
|
||||||
|
$tmp["target"] = $item->getTarget();
|
||||||
|
$tmp["order"] = $item->getRoworder();
|
||||||
|
$tmp["color"] = ($item->getColor()?$item->getColor():$this->get('session')->get('color')["main"]);
|
||||||
|
$tmp["icon"] = $weburl.($item->getIcon()?$item->getIcon()->getLabel():"uploads/icon/icon_pin.png");
|
||||||
|
$tmp["essential"] = $item->getEssential();
|
||||||
|
$tmp["category"] = $item->getItemcategory()->getId();
|
||||||
|
$tmp["badge_url"] = "";
|
||||||
|
$tmp["badge_type"] = "";
|
||||||
|
$tmp["badge_message"] = "";
|
||||||
|
$tmp["mode"] = false;
|
||||||
|
|
||||||
|
array_push($arrayitems,$tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sort($arrayitems);
|
||||||
|
foreach ($arrayitems as $elem) {
|
||||||
|
if (!in_array($elem,$output["items"])) array_push($output["items"],$elem);
|
||||||
|
}
|
||||||
|
$arrayitemcats = array();
|
||||||
|
if($itemcategorys) {
|
||||||
|
foreach($itemcategorys as $itemcategory) {
|
||||||
|
$tmp=[];
|
||||||
|
$tmp["id"] = $itemcategory->getId();
|
||||||
|
$tmp["title"] = $itemcategory->getLabel();
|
||||||
|
$tmp["order"] = $itemcategory->getRoworder();
|
||||||
|
$tmp["color"] = ($itemcategory->getColor()?$itemcategory->getColor():$this->get('session')->get('color')["main"]);
|
||||||
|
array_push($arrayitemcats,$tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sort($arrayitemcats);
|
||||||
|
foreach ($arrayitemcats as $elem) {
|
||||||
|
if (!in_array($elem,$output["itemcategorys"])) array_push($output["itemcategorys"],$elem);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// xdesktop2ninegate 2020
|
||||||
|
//
|
||||||
|
|
||||||
|
// Gestion des infos du profil ==============
|
||||||
|
$rne = $user->getSiren();
|
||||||
|
|
||||||
|
$arr=array();
|
||||||
|
$arr["profil"]=$profil;
|
||||||
|
$arr["rne"]=$rne;
|
||||||
|
$arr["groupes"]=$groupes;
|
||||||
|
$user_infos=json_encode($arr);
|
||||||
|
|
||||||
|
// L'ensemble des favoris qui correspond à l'utilisateur
|
||||||
|
$tbfav=array();
|
||||||
|
foreach($output["bookmarks"] as $bookmark) {
|
||||||
|
$tmp=array('url'=>$bookmark['url'],'libelle'=>$bookmark['title'],'icon'=>$bookmark['icon']);
|
||||||
|
array_push($tbfav,$tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
$favoris=json_encode($tbfav);
|
||||||
|
|
||||||
|
// Nom des categories
|
||||||
|
$tbcat = $output["itemcategorys"];
|
||||||
|
$cat=array();
|
||||||
|
foreach($tbcat as $item)
|
||||||
|
{
|
||||||
|
$cat[$item['id']] = $item['title'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$tbitem = $output["items"];
|
||||||
|
// Construction de la chaine xml
|
||||||
|
$carriage_return = array("\r\n", "\n", "\r");
|
||||||
|
$ret_str="<main>";
|
||||||
|
$ret_str=$ret_str."<buttondatas>";
|
||||||
|
foreach($tbitem as $item) {
|
||||||
|
$ret_str=$ret_str."<buttondata>";
|
||||||
|
$ret_str=$ret_str."<nom>".str_replace("&"," ",($item['title']))."</nom>";
|
||||||
|
$ret_str=$ret_str."<icon>".htmlentities(($item['icon']))."</icon>";
|
||||||
|
$ret_str=$ret_str."<libelle>".str_replace("&"," ",($item['subtitle']))."</libelle>";
|
||||||
|
$ret_str=$ret_str."<url>".htmlentities(($item['url']))."</url>";
|
||||||
|
if ( $item['category'] != -999 ) {
|
||||||
|
$ret_str=$ret_str."<categoriename>".($cat[$item['category']])."</categoriename>";
|
||||||
|
} else $ret_str=$ret_str."<categoriename>Mes Ressources</categoriename>";
|
||||||
|
$ret_str=$ret_str."<categorieid>".$item['category']."</categorieid>";
|
||||||
|
$ret_str=$ret_str."<infos_url>".htmlentities($item['badge_url'])."</infos_url>";
|
||||||
|
$ret_str=$ret_str."<infos_type>".$item['badge_type']."</infos_type>";
|
||||||
|
|
||||||
|
# ref: #5629 et #4261
|
||||||
|
if ($item['mode']) {
|
||||||
|
$ret_str=$ret_str."<external>true</external>";
|
||||||
|
}
|
||||||
|
|
||||||
|
$ret_str=$ret_str."<infos_message>".str_replace($carriage_return,"<br/>",htmlentities($item['badge_message']))."</infos_message>";
|
||||||
|
$ret_str=$ret_str."</buttondata>";
|
||||||
|
}
|
||||||
|
$ret_str=$ret_str."</buttondatas>";
|
||||||
|
|
||||||
|
// Description
|
||||||
|
$ret_str=$ret_str."<description>";
|
||||||
|
$ret_str=$ret_str."<services_url>mxServices</services_url>";
|
||||||
|
$ret_str=$ret_str."</description>";
|
||||||
|
|
||||||
|
// Categories
|
||||||
|
$ret_str=$ret_str."<categories>";
|
||||||
|
foreach ($tbcat as $categorie) {
|
||||||
|
$ret_str=$ret_str."<categorie>";
|
||||||
|
$ret_str=$ret_str."<nom>".$categorie['title']."</nom>";
|
||||||
|
if (isset($categorie['color'])) $ret_str=$ret_str."<couleur>".$categorie['color']."</couleur>";
|
||||||
|
$ret_str=$ret_str."<indice>".$categorie['order']."</indice>";
|
||||||
|
$ret_str=$ret_str."<icone></icone>";
|
||||||
|
$ret_str=$ret_str."</categorie>";
|
||||||
|
}
|
||||||
|
if ($itemsperso) {
|
||||||
|
$ret_str=$ret_str."<categorie>";
|
||||||
|
$ret_str=$ret_str."<nom>Mes Ressources</nom>";
|
||||||
|
$ret_str=$ret_str."<indice>-1</indice>";
|
||||||
|
$ret_str=$ret_str."<icone>fa-user-circle</icone>";
|
||||||
|
$ret_str=$ret_str."</categorie>";
|
||||||
|
}
|
||||||
|
|
||||||
|
$ret_str=$ret_str."</categories>";
|
||||||
|
$ret_str=$ret_str."</main>";
|
||||||
|
|
||||||
|
if (isset($_GET["callback"])) {postData($ret_str,$message,$favoris,$user_infos);die();}
|
||||||
|
|
||||||
|
$message="";
|
||||||
|
|
||||||
|
// Si js
|
||||||
|
if (isset($_GET["js"])) {
|
||||||
|
$id=$_GET["id"];
|
||||||
|
header("Content-type: text/javascript");
|
||||||
|
|
||||||
|
$data=json_encode(array("xml"=>(htmlentities($ret_str,ENT_QUOTES,"UTF-8")),
|
||||||
|
"favoris"=>(htmlentities($favoris,ENT_QUOTES,"UTF-8")),
|
||||||
|
"userinfos"=>(htmlentities(str_replace("'",'"',$user_infos),ENT_QUOTES,"UTF-8")),
|
||||||
|
"id"=>$id/*,
|
||||||
|
"referer"=>(isset($_SERVER['HTTPS']) ? "https" : "http") . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"*/
|
||||||
|
));
|
||||||
|
ob_start();
|
||||||
|
echo <<<EOL
|
||||||
|
/* DATA_FOR_MXDESKTOP: Ne pas supprimer cette ligne */
|
||||||
|
var username='$login';
|
||||||
|
var source=MX.getSource('$id');
|
||||||
|
if (!source) {
|
||||||
|
console.log("Source $id introuvable");
|
||||||
|
} else {
|
||||||
|
source.setData('$data');
|
||||||
|
}
|
||||||
|
EOL
|
||||||
|
;
|
||||||
|
$sortie= ob_get_clean();
|
||||||
|
$reponse = new Response();
|
||||||
|
$reponse->setContent($sortie);
|
||||||
|
$reponse->headers->set('Content-Type', 'text/javascript');
|
||||||
|
return $reponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
echo $ret_str;
|
||||||
|
echo "\n";
|
||||||
|
echo "MSG=$message";
|
||||||
|
echo "\n";
|
||||||
|
echo "FAV=$favoris";
|
||||||
|
echo "\n";
|
||||||
|
echo "UI=$user_infos";
|
||||||
|
$sortie= ob_get_clean();
|
||||||
|
$reponse = new Response();
|
||||||
|
$reponse->setContent($sortie);
|
||||||
|
$reponse->headers->set('Content-Type', 'text/html');
|
||||||
|
return $reponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function messageAction($idalert = null,$action = null,$access="config") {
|
||||||
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
|
$request = $this->container->get('request_stack')->getCurrentRequest();
|
||||||
|
$id = $request->query->get('id',null);
|
||||||
|
$token = $request->request->get('token',null);
|
||||||
|
$data = $request->request->get('data',null);
|
||||||
|
if($data) $token=$data['token'];
|
||||||
|
$api = $request->query->get('api','');
|
||||||
|
// Tester présence des parametres
|
||||||
|
if ((is_null($id)) and (is_null($token))) {
|
||||||
|
$output["error"]="missing parameter : id / token";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Récupération Attribut
|
||||||
|
// acces base pour recuperer profil et groupe pour le user
|
||||||
|
if($id) $datasource = $em->getRepository('CadolesEdispatcherBundle:Datasource')->findOneBy(["iddatasource"=>$id]);
|
||||||
|
else if($token) $datasource = $em->getRepository('CadolesEdispatcherBundle:Datasource')->findOneBy(["token"=>$token]);
|
||||||
|
if (!$datasource) {
|
||||||
|
$output["error"]="no datasource session found for id = $id / token = $token";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
$username = $datasource->getUsername();
|
||||||
|
|
||||||
|
// Gestion des infos du profil ==============
|
||||||
|
$output = [];
|
||||||
|
|
||||||
|
// Récupérer l'utilisateur
|
||||||
|
$user=$em->getRepository('CadolesCoreBundle:User')->findOneBy(["username"=>$username]);
|
||||||
|
if(!$user) {
|
||||||
|
$output["error"]="user not exist";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
$weburl="https://".$this->getParameter("weburl")."/".$this->getParameter("alias")."/";
|
||||||
|
$serializer = new Serializer(array(new DateTimeNormalizer()));
|
||||||
|
|
||||||
|
if ($action == null) {
|
||||||
|
|
||||||
|
// /!\ ->getUserAlerts from eoledev repository paquet dev1.0+3-100 (ssoitems)
|
||||||
|
$listessoitems = $datasource->getSsoitems();
|
||||||
|
$ssoitems=explode("|",$listessoitems);
|
||||||
|
$alerts=$em->getRepository("CadolesPortalBundle:Alert")->getUserAlerts($user,null,null,$ssoitems);
|
||||||
|
$messages = [];
|
||||||
|
foreach($alerts as $alert) {
|
||||||
|
$tmp=[];
|
||||||
|
$tmp["id"] = $alert->getId();
|
||||||
|
$bgcolor = ($alert->getAlertcategory()->getColor()?$alert->getAlertcategory()->getColor():$this->get('session')->get('color')["main"]);
|
||||||
|
$iconeurl = $weburl.($alert->getAlertcategory()->getIcon()?$alert->getAlertcategory()->getIcon()->getLabel():"uploads/icon/icon_pin.png");
|
||||||
|
$compteur=0;
|
||||||
|
$urls=[];
|
||||||
|
foreach($alert->getItems() as $item) {
|
||||||
|
$urls[] = $item->getUrl();
|
||||||
|
$compteur++;
|
||||||
|
}
|
||||||
|
$tmp["url"] = implode("|",$urls);
|
||||||
|
switch ($alert->getAlertcategory()->getLabel()) {
|
||||||
|
case "sans categorie": $flag="none"; break;
|
||||||
|
case "Rappel": $flag="rappel"; break;
|
||||||
|
case "Attention/Important": $flag="attention"; break;
|
||||||
|
case "Message": $flag="mail"; break;
|
||||||
|
default: $flag=""; break;
|
||||||
|
}
|
||||||
|
$categorielabel="";
|
||||||
|
if ($compteur==0) {
|
||||||
|
if ($alert->getAlertcategory()->getLabel()!="sans categorie")
|
||||||
|
if ($flag=="") {
|
||||||
|
$categorielabel="<div style='float:left;width: 102.5%;padding: 4px;padding-left: 4px;color:white;background-color: #$bgcolor;position:relative;top: -16px;left: -11px;'><img src='$iconeurl' width='24em'> ".$alert->getAlertcategory()->getLabel()."</div></br>";
|
||||||
|
$tmp["message"] = "$categorielabel<h4>".$alert->getTitle()."</h4>".$alert->getContent();
|
||||||
|
} else $tmp["message"] = "<h4>".$alert->getTitle()."</h4>".$alert->getContent();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ($alert->getAlertcategory()->getLabel()!="sans categorie")
|
||||||
|
if ($flag=="") {
|
||||||
|
$categorielabel="<img src='$iconeurl' width='16em' ><span style='font-weight: bold'> ".$alert->getAlertcategory()->getLabel()."</span> : ";
|
||||||
|
$tmp["message"] = $categorielabel.$alert->getTitle()."".$alert->getContent();
|
||||||
|
} else $tmp["message"] = $alert->getTitle()."</br>".$alert->getContent();
|
||||||
|
}
|
||||||
|
$tmp["filtre"] = "aucun";
|
||||||
|
$tmp["valeur"] = "[]";
|
||||||
|
$tmp["flag"] = $flag;
|
||||||
|
$tmp["closeable"] = ($alert->getFghideable()?"true":"false");
|
||||||
|
$tmp["requestable"] = "false";
|
||||||
|
$tmp["display_mode"]= "postit";
|
||||||
|
$tmp["responses"] = "[]";
|
||||||
|
$tmp["start"] = $serializer->normalize($alert->getPublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s'));
|
||||||
|
$tmp["stop"] = $serializer->normalize($alert->getUnpublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s'));
|
||||||
|
$tmp["updated"] = $serializer->normalize($alert->getPublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s'));
|
||||||
|
$tmp["user_responses"] = "[]";
|
||||||
|
array_push($messages,$tmp);
|
||||||
|
}
|
||||||
|
$data = json_encode([
|
||||||
|
'messages' => $messages,
|
||||||
|
'admin' => false,
|
||||||
|
]);
|
||||||
|
$datajs="var data=$data;
|
||||||
|
$api('$id',data);";
|
||||||
|
$reponse = new Response();
|
||||||
|
$reponse->setContent($datajs);
|
||||||
|
$reponse->headers->set('Content-Type', 'text/javascript');
|
||||||
|
}
|
||||||
|
else if ($action=="never") {
|
||||||
|
/*
|
||||||
|
* ACTION : BASCULER LA VISIBILITE DU MESSAGE : SI VISIBLE, LE CACHER ET INVERSEMENT
|
||||||
|
*/
|
||||||
|
// Tester présence des parametres
|
||||||
|
if(is_null($idalert)||is_null($action)) {
|
||||||
|
$output["error"]="missing parameter : idalert - action";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tester l'existence de l'alert
|
||||||
|
$alert=$em->getRepository('CadolesPortalBundle:Alert')->find($idalert);
|
||||||
|
if(!$alert) {
|
||||||
|
$output["error"]="alert not exist";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// construction de la réponse
|
||||||
|
$tmp=[];
|
||||||
|
$tmp["id"] = $alert->getId();
|
||||||
|
$bgcolor = ($alert->getAlertcategory()->getColor()?$alert->getAlertcategory()->getColor():$this->get('session')->get('color')["main"]);
|
||||||
|
$iconeurl = $weburl.($alert->getAlertcategory()->getIcon()?$alert->getAlertcategory()->getIcon()->getLabel():"uploads/icon/icon_pin.png");
|
||||||
|
$tmp["message"] = "<div width=100% style='background-color:#$bgcolor;color:white;padding:12px'><h4><img src='$iconeurl' width='30em' ><span style='font-weight: bold'> ".$alert->getAlertcategory()->getLabel()."</span> : <small style='color:white'>".$alert->getTitle()."</small></h4>".$alert->getContent()."</div>";
|
||||||
|
$tmp["filtre"] = "aucun";
|
||||||
|
$tmp["valeur"] = "[]";
|
||||||
|
$tmp["flag"] = "";
|
||||||
|
$tmp["closeable"] = ($alert->getFghideable()?"true":"false");
|
||||||
|
$tmp["requestable"] = "false";
|
||||||
|
$tmp["display_mode"]= "postit";
|
||||||
|
$tmp["responses"] = "[]";
|
||||||
|
$tmp["start"] = $serializer->normalize($alert->getPublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s'));
|
||||||
|
$tmp["stop"] = $serializer->normalize($alert->getUnpublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s'));
|
||||||
|
$tmp["updated"] = $serializer->normalize($alert->getPublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s'));
|
||||||
|
$tmp["user_responses"] = "[]";
|
||||||
|
|
||||||
|
// Tester que l'alert est masquable
|
||||||
|
if(!$alert->getFghideable()) {
|
||||||
|
$output["error"]="alert not hideable";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Basculer l'état de visibilité de l'alert
|
||||||
|
if($alert->getReaders()->contains($user)) $alert->removeReader($user);
|
||||||
|
else $alert->addReader($user);
|
||||||
|
|
||||||
|
$em->persist($alert);
|
||||||
|
$em->flush();
|
||||||
|
|
||||||
|
$reponse=new Response(json_encode($tmp), 200);
|
||||||
|
$reponse->headers->set('Access-Control-Allow-Origin', '*');
|
||||||
|
return $reponse;
|
||||||
|
}
|
||||||
|
else if ($action=="reset") {
|
||||||
|
/*
|
||||||
|
* ACTION : RESTAURER LE MESSAGE
|
||||||
|
*/
|
||||||
|
// Tester présence des parametres
|
||||||
|
if(is_null($idalert)||is_null($action)) {
|
||||||
|
$output["error"]="missing parameter : idalert - action";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tester l'existence de l'alert
|
||||||
|
$alert=$em->getRepository('CadolesPortalBundle:Alert')->find($idalert);
|
||||||
|
if(!$alert) {
|
||||||
|
$output["error"]="alert not exist";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// construction de la réponse
|
||||||
|
$tmp=[];
|
||||||
|
$tmp["id"] = $alert->getId();
|
||||||
|
$bgcolor = ($alert->getAlertcategory()->getColor()?$alert->getAlertcategory()->getColor():$this->get('session')->get('color')["main"]);
|
||||||
|
$iconeurl = $weburl.($alert->getAlertcategory()->getIcon()?$alert->getAlertcategory()->getIcon()->getLabel():"uploads/icon/icon_pin.png");
|
||||||
|
$tmp["message"] = "<div width=100% style='background-color:#$bgcolor;color:white;padding:12px'><h4><img src='$iconeurl' width='30em' ><span style='font-weight: bold'> ".$alert->getAlertcategory()->getLabel()."</span> : <small style='color:white'>".$alert->getTitle()."</small></h4>".$alert->getContent()."</div>";
|
||||||
|
$tmp["filtre"] = "aucun";
|
||||||
|
$tmp["valeur"] = "[]";
|
||||||
|
$tmp["flag"] = "";
|
||||||
|
$tmp["closeable"] = ($alert->getFghideable()?"true":"false");
|
||||||
|
$tmp["requestable"] = "false";
|
||||||
|
$tmp["display_mode"]= "postit";
|
||||||
|
$tmp["responses"] = "[]";
|
||||||
|
$tmp["start"] = $serializer->normalize($alert->getPublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s'));
|
||||||
|
$tmp["stop"] = $serializer->normalize($alert->getUnpublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s'));
|
||||||
|
$tmp["updated"] = $serializer->normalize($alert->getPublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s'));
|
||||||
|
$tmp["user_responses"] = "[]";
|
||||||
|
|
||||||
|
// Tester que l'alert est masquable
|
||||||
|
if(!$alert->getFghideable()) {
|
||||||
|
$output["error"]="alert not hideable";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Restaurer l'alert
|
||||||
|
if($alert->getReaders()->contains($user)) {
|
||||||
|
$alert->removeReader($user);
|
||||||
|
$em->persist($alert);
|
||||||
|
$em->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
$reponse=new Response(json_encode($tmp), 200);
|
||||||
|
$reponse->headers->set('Access-Control-Allow-Origin', '*');
|
||||||
|
return $reponse;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
dump("action = $action sur idmsg = $idmsg");
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
return $reponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function helloAction() {
|
||||||
|
$reponse = new Response('ninegate', Response::HTTP_OK);
|
||||||
|
return $reponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function meAction($access="config") {
|
||||||
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
$request = $this->container->get('request_stack')->getCurrentRequest();
|
||||||
|
$token = $request->query->get('token',false);
|
||||||
|
|
||||||
|
// Récupération Attribut
|
||||||
|
// acces base pour recuperer profil et groupe pour le user
|
||||||
|
if ($token) {
|
||||||
|
$datasource = $em->getRepository('CadolesEdispatcherBundle:Datasource')->findOneBy(["token"=>$token]);
|
||||||
|
if (!$datasource) {
|
||||||
|
$output["error"]="no datasource session found for token = $token";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
$username = $datasource->getUsername();
|
||||||
|
} else {
|
||||||
|
$output["error"]="no token provided - Abort";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
$output = [];
|
||||||
|
|
||||||
|
// Récupérer l'utilisateur
|
||||||
|
$user=$em->getRepository('CadolesCoreBundle:User')->findOneBy(["username"=>$username]);
|
||||||
|
if(!$user) {
|
||||||
|
$output["error"]="user not exist";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
$roles=($user?$user->getRoles():["ROLE_ANONYME"]);
|
||||||
|
if (in_array("ROLE_MODO",$roles)) {
|
||||||
|
$permmod=$em->getRepository("CadolesCoreBundle:PermModo")->findOneBy(["route"=>"cadoles_portal_config_alert","permmodoprofil"=>$user->getPermmodoprofil()]);
|
||||||
|
$adminpostit=$permmod?$permmod->getVisible():false;
|
||||||
|
} else $adminpostit=in_array("ROLE_ADMIN",$roles);
|
||||||
|
|
||||||
|
// Profilage
|
||||||
|
$username = $user->getFirstName()." ".$user->getLastName();
|
||||||
|
$reponse = new Response();
|
||||||
|
$reponse->setContent(json_encode([
|
||||||
|
'display_name' => $username,
|
||||||
|
'admin_postit' => $adminpostit,
|
||||||
|
]));
|
||||||
|
|
||||||
|
$reponse->headers->set('Content-Type', 'text/html');
|
||||||
|
$reponse->headers->set('Access-Control-Allow-Origin', '*');
|
||||||
|
return $reponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function sessionAction($id="",$access="config") {
|
||||||
|
// Masteridentity
|
||||||
|
$masteridentity=$this->getParameter("masteridentity");
|
||||||
|
if($masteridentity!="SSO") {
|
||||||
|
$output["error"]="Le bundle Edispatcher ne fonctionne qu'en mode MasterIdentity=SSO";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Init Client CAS
|
||||||
|
\phpCAS::setDebug(false);
|
||||||
|
\phpCAS::client(CAS_VERSION_2_0, $this->getParameter('cas_host'), $this->getParameter('cas_port'), is_null($this->getParameter('cas_path')) ? '' : $this->getParameter('cas_path'), false);
|
||||||
|
\phpCAS::setNoCasServerValidation();
|
||||||
|
|
||||||
|
// Authentification
|
||||||
|
\phpCAS::forceAuthentication();
|
||||||
|
|
||||||
|
// Récupération UID
|
||||||
|
$username = \phpCAS::getUser();
|
||||||
|
$attributes = \phpCAS::getAttributes();
|
||||||
|
$profil = $attributes["ENTPersonProfils"];
|
||||||
|
|
||||||
|
// -- autocreate
|
||||||
|
|
||||||
|
// Rechercher l'utilisateur
|
||||||
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
if(isset($attributes[$this->getParameter('user_attr_cas_username')]))
|
||||||
|
$username = $attributes[$this->getParameter('user_attr_cas_username')];
|
||||||
|
|
||||||
|
if(isset($attributes[$this->getParameter('user_attr_cas_mail')]))
|
||||||
|
$email = $attributes[$this->getParameter('user_attr_cas_mail')];
|
||||||
|
|
||||||
|
if(isset($attributes[$this->getParameter('user_attr_cas_lastname')]))
|
||||||
|
$lastname = $attributes[$this->getParameter('user_attr_cas_lastname')];
|
||||||
|
|
||||||
|
if(isset($attributes[$this->getParameter('user_attr_cas_firstname')]))
|
||||||
|
$firstname = $attributes[$this->getParameter('user_attr_cas_firstname')];
|
||||||
|
$user = $em->getRepository('CadolesCoreBundle:User')->findOneBy(array("username"=>$username));
|
||||||
|
|
||||||
|
if (!$user) {
|
||||||
|
$user = new User();
|
||||||
|
// On calcule le niveau01 de l'utilisateur
|
||||||
|
$niveau01=$em->getRepository('CadolesCoreBundle:Niveau01')->calculateNiveau01($attributes);
|
||||||
|
if(!$niveau01)
|
||||||
|
throw $this->createNotFoundException('Permission denied. No Organisation Niveau 01 match');
|
||||||
|
$user->setUsername($username);
|
||||||
|
$user->setEmail($email);
|
||||||
|
$user->setLastname($lastname);
|
||||||
|
$user->setFirstname($firstname);
|
||||||
|
$user->setPassword("CASPWD-".$username);
|
||||||
|
$user->setSalt("CASPWD-".$username);
|
||||||
|
|
||||||
|
$user->setNiveau01($niveau01);
|
||||||
|
$user->setSiren($niveau01->getSiren());
|
||||||
|
$user->setSiret("");
|
||||||
|
$user->setAvatar("noavatar.png");
|
||||||
|
$user->setVisible(true);
|
||||||
|
$user->setAuthlevel("simple");
|
||||||
|
$user->setRole("ROLE_USER");
|
||||||
|
|
||||||
|
if(in_array($username,$this->getParameter("ldap_usersadmin")))
|
||||||
|
$user->setRole("ROLE_ADMIN");
|
||||||
|
$em->persist($user);
|
||||||
|
$em->flush();
|
||||||
|
// Génération auto des groupes
|
||||||
|
$this->submitGroup($attributes);
|
||||||
|
// On calcule les groupes de l'utilisateur
|
||||||
|
$user=$em->getRepository('CadolesCoreBundle:Group')->calculateGroup($user,$attributes);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-- fin de l'auto create --
|
||||||
|
|
||||||
|
// groupes depuis ninegate
|
||||||
|
$roles=($user?$user->getRoles():["ROLE_ANONYME"]);
|
||||||
|
$adminpostit=(in_array("ROLE_MODO",$roles));
|
||||||
|
$groups = array();
|
||||||
|
foreach($user->getGroups() as $usergroup) {
|
||||||
|
$tmp = $usergroup->getGroup()->getLabel();
|
||||||
|
array_push($groups,$tmp);
|
||||||
|
}
|
||||||
|
$groupes=implode("|",$groups);
|
||||||
|
|
||||||
|
if($this->getParameter('ssosynchroitem')) {
|
||||||
|
$ssoitems=implode("|",$attributes[$this->GetParameter("user_attr_cas_item")]);
|
||||||
|
} else $ssoitems = "";
|
||||||
|
|
||||||
|
$request = $this->container->get('request_stack')->getCurrentRequest();
|
||||||
|
$api = $request->query->get('api','null');
|
||||||
|
$id = $request->query->get('id','xxxxx-xxxxx-xxxx');
|
||||||
|
|
||||||
|
// profil et groupes fournis par SSO => on les update dans l'entité Datasource
|
||||||
|
// en attendant que les infos soient dispos dans le modele User de ninegate
|
||||||
|
$datasource = $em->getRepository('CadolesEdispatcherBundle:Datasource')->findOneBy(["username"=>$username]);
|
||||||
|
if(!$datasource) {
|
||||||
|
$datasource = new Datasource();
|
||||||
|
$datasource->setUsername($username);
|
||||||
|
$token = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyz'),1,16);
|
||||||
|
$datasource->setToken($token);
|
||||||
|
$datasource->setHorodatage(date('YmdHi'));
|
||||||
|
} else $token = $datasource->getToken();
|
||||||
|
$datasource->setProfil($profil);
|
||||||
|
$datasource->setGroupes($groupes);
|
||||||
|
$datasource->setIddatasource($id);
|
||||||
|
$datasource->setSsoitems($ssoitems);
|
||||||
|
|
||||||
|
// persistance du token pour 24h (1j)
|
||||||
|
$horodatage=$datasource->getHorodatage();
|
||||||
|
$maintenant=date('YmdHi');
|
||||||
|
$delta=($maintenant)-($horodatage);
|
||||||
|
if ($delta > 10000) {
|
||||||
|
$token = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyz'),1,16);
|
||||||
|
$datasource->setToken($token);
|
||||||
|
$datasource->setHorodatage(date('YmdHi'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$em->persist($datasource);
|
||||||
|
$em->flush();
|
||||||
|
|
||||||
|
$data = json_encode([
|
||||||
|
'token' => $token,
|
||||||
|
'adminPostit' => $adminpostit,
|
||||||
|
]);
|
||||||
|
// Profilage
|
||||||
|
$reponse = new Response();
|
||||||
|
if ($api!="null") {
|
||||||
|
$datajs="var data=$data;
|
||||||
|
$api('$id',data);";
|
||||||
|
$reponse->setContent($datajs);
|
||||||
|
$reponse->headers->set('Content-Type', 'text/javascript');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$reponse->setContent($data);
|
||||||
|
$reponse->headers->set('Content-Type', 'text/html');
|
||||||
|
}
|
||||||
|
//$reponse->headers->set('Access-Control-Allow-Origin', '*');
|
||||||
|
return $reponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
// /edispatcher/api/mxServices
|
||||||
|
//
|
||||||
|
// Ajout d'un item ninegate existant comme bookmark d'un utilisateur
|
||||||
|
// POST
|
||||||
|
// token = datasource user token, permettant d'établir le lien avec l'uid de l'utilisateur
|
||||||
|
// GET
|
||||||
|
// id = id interne de l'item sur lequel on souhaite ajouter/supprimer un bookmark
|
||||||
|
// libelle = libelle de la ressource
|
||||||
|
// icon = icone de la ressource
|
||||||
|
// favurl = url icone escapée
|
||||||
|
// nom = nom ou id
|
||||||
|
// categorie = categorie de la ressource
|
||||||
|
// callback = url du call back à retourner
|
||||||
|
// action = BOOKMARK_ADD | BOOKMARK_DEL
|
||||||
|
// callbackid = listeDesApplications/idinterne
|
||||||
|
public function mxServicesAction(Request $request) {
|
||||||
|
|
||||||
|
$token = $request->query->get('token',null);
|
||||||
|
$id = $request->query->get('id',null);
|
||||||
|
$libelle =$request->query->get('libelle',null);
|
||||||
|
$icon =$request->query->get('icon',null);
|
||||||
|
$favurl = rtrim($request->query->get('favurl',null),"?");
|
||||||
|
// urldecode(stripslashes(
|
||||||
|
$nom =$request->query->get('nom',null);
|
||||||
|
$categorie =$request->query->get('categorie',null);
|
||||||
|
$callback =$request->query->get('callback',null);
|
||||||
|
$action =$request->query->get('action',null);
|
||||||
|
$callbackid =$request->query->get('callbackid',null);
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
//var_dump($request->request);
|
||||||
|
var_dump($request->query);
|
||||||
|
$debug = ob_get_clean();
|
||||||
|
//$debug=json_encode($request->query);
|
||||||
|
|
||||||
|
if(is_null($token)||is_null($libelle)||is_null($icon)||is_null($favurl)||is_null($nom)||is_null($categorie)||is_null($callback)||is_null($action)||is_null($callbackid)){
|
||||||
|
$output["error"]="missing parameter : token - id - libelle - icon - favurl - nom - categorie - callback - action - callbackid";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
// Récupération Attribut
|
||||||
|
$datasource = $em->getRepository('CadolesEdispatcherBundle:Datasource')->findOneBy(["token"=>$token]);
|
||||||
|
if (!$datasource) {
|
||||||
|
$output["error"]="no datasource session found for token = $token";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
$login = $datasource->getUsername();
|
||||||
|
|
||||||
|
// Récupérer l'utilisateur
|
||||||
|
$user=$em->getRepository('CadolesCoreBundle:User')->findOneBy(["username"=>$login]);
|
||||||
|
if(!$user) {
|
||||||
|
$output["error"]="user not exist";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// chercher l'item
|
||||||
|
$item=$em->getRepository('CadolesPortalBundle:Item')->findOneBy(["url"=>$favurl]);
|
||||||
|
if(!$item) {
|
||||||
|
$altitem=$em->getRepository('CadolesPortalBundle:Item')->findOneBy(["url"=>$favurl."?gestion_edispatcher=locale"]);
|
||||||
|
if(!$altitem) {
|
||||||
|
$output["error"]="item with url=$favurl(?gestion_edispatcher=locale) not exist";
|
||||||
|
return new Response(json_encode($output), 400);
|
||||||
|
} else {
|
||||||
|
$item = $altitem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$bookmark = $em->getRepository('CadolesPortalBundle:Bookmark')->findOneBy(["user"=>$user,"item"=>$item]);
|
||||||
|
$title="";
|
||||||
|
$subtitle="";
|
||||||
|
$output="";
|
||||||
|
if(!$bookmark) {
|
||||||
|
if ($action=="BOOKMARK_ADD") {
|
||||||
|
|
||||||
|
$bookmark = new Bookmark();
|
||||||
|
$bookmark->setTitle($item->getTitle());
|
||||||
|
$title=$item->getTitle();
|
||||||
|
$bookmark->setSubtitle($item->getSubtitle());
|
||||||
|
$subtitle=$item->getSubtitle();
|
||||||
|
$bookmark->setUrl($item->getUrl());
|
||||||
|
$bookmark->setIcon($item->getIcon());
|
||||||
|
$bookmark->setColor($item->getColor());
|
||||||
|
$bookmark->setTarget($item->getTarget());
|
||||||
|
$bookmark->setItem($item);
|
||||||
|
$bookmark->setUser($user);
|
||||||
|
$em->persist($bookmark);
|
||||||
|
$em->flush();
|
||||||
|
$success=1;
|
||||||
|
$output="<html><body>
|
||||||
|
<form id='form2submit' name='form2submit' method='POST' action='$callback'>
|
||||||
|
<input name='action' id='action' type='hidden' value='$action' />
|
||||||
|
<input name='message' id='message' type='hidden' value='$title : $subtitle a été ajouté à vos favoris' />
|
||||||
|
<input name='success' id='success' type='hidden' value='1' />
|
||||||
|
<input name='id' id='id' type='hidden' value='$id' />
|
||||||
|
<input name='callbackid' id='callbackid' type='hidden' value='$callbackid' />
|
||||||
|
</form>
|
||||||
|
<script>
|
||||||
|
document.form2submit.submit();
|
||||||
|
</script>
|
||||||
|
</body></html>
|
||||||
|
";
|
||||||
|
|
||||||
|
|
||||||
|
} else $success=0; // item pas en favori, mais ce n'est pas une demande d'ajout
|
||||||
|
} else {
|
||||||
|
if ($action=="BOOKMARK_DEL") {
|
||||||
|
|
||||||
|
$em->remove($bookmark);
|
||||||
|
$em->flush();
|
||||||
|
$success=1;
|
||||||
|
$output="<html><body>
|
||||||
|
<form id='form2submit' name='form2submit' method='POST' action='$callback'>
|
||||||
|
<input name='action' id='action' type='hidden' value='$action' />
|
||||||
|
<input name='message' id='message' type='hidden' value='item supprimé de vos favoris' />
|
||||||
|
<input name='success' id='success' type='hidden' value='1' />
|
||||||
|
<input name='id' id='id' type='hidden' value='$id' />
|
||||||
|
<input name='callbackid' id='callbackid' type='hidden' value='$callbackid' />
|
||||||
|
</form>
|
||||||
|
<script>
|
||||||
|
document.form2submit.submit();
|
||||||
|
</script>
|
||||||
|
</body></html>
|
||||||
|
";
|
||||||
|
|
||||||
|
} else $success=0; // item deja en favori mais demande d'ajout
|
||||||
|
}
|
||||||
|
|
||||||
|
$reponse = new Response();
|
||||||
|
$reponse->setContent($output);
|
||||||
|
$reponse->headers->set('Content-Type', 'text/html');
|
||||||
|
$reponse->headers->set('Access-Control-Allow-Origin', '*');
|
||||||
|
return $reponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function submitGroup($attributes) {
|
||||||
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
if(!$this->getParameter('ssosynchrogroup'))
|
||||||
|
return null;
|
||||||
|
$user_attr_cas_group=$this->getParameter('user_attr_cas_group');
|
||||||
|
// Si l'utilisateur possège l'attribut groupe dans ses attributs
|
||||||
|
if(array_key_exists($user_attr_cas_group,$attributes)) {
|
||||||
|
if(!is_array($attributes[$user_attr_cas_group])) {
|
||||||
|
$attributes[$user_attr_cas_group]=[$attributes[$user_attr_cas_group]];
|
||||||
|
}
|
||||||
|
foreach($attributes[$user_attr_cas_group] as $ssogroup) {
|
||||||
|
// Recherche du groupe
|
||||||
|
$group=$em->getRepository("CadolesCoreBundle:Group")->findOneBy(["label"=>$ssogroup]);
|
||||||
|
if(!$group) {
|
||||||
|
$group=new Group();
|
||||||
|
$group->setLabel($ssogroup);
|
||||||
|
$group->setFgcancreatepage(false);
|
||||||
|
$group->setFgcancreateblog(false);
|
||||||
|
$group->setFgcancreatecalendar(false);
|
||||||
|
$group->setFgcancreateproject(false);
|
||||||
|
$group->setFgcanshare(false);
|
||||||
|
$group->setFgopen(false);
|
||||||
|
$group->setFgall(false);
|
||||||
|
}
|
||||||
|
$group->setAttributes('{"'.$user_attr_cas_group.'":"'.$ssogroup.'"}');
|
||||||
|
$group->setFgtemplate(false);
|
||||||
|
$em->persist($group);
|
||||||
|
$em->flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,245 @@
|
||||||
|
<?php
|
||||||
|
namespace Cadoles\EdispatcherBundle\Entity;
|
||||||
|
|
||||||
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
|
||||||
|
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
|
||||||
|
use Symfony\Component\Validator\Constraints as Assert;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Entity
|
||||||
|
* @ORM\Table(name="edispatcher")
|
||||||
|
* @ORM\HasLifecycleCallbacks()
|
||||||
|
*
|
||||||
|
* @UniqueEntity(fields="username", message="Un utilisateur existe déjà avec ce login.")
|
||||||
|
*/
|
||||||
|
class Datasource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="integer")
|
||||||
|
* @ORM\Id
|
||||||
|
* @ORM\GeneratedValue(strategy="AUTO")
|
||||||
|
*/
|
||||||
|
private $id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="string", length=50, unique=true)
|
||||||
|
*/
|
||||||
|
private $username;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="string", length=256, nullable=true)
|
||||||
|
*/
|
||||||
|
private $profil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="string", length=512, nullable=true)
|
||||||
|
*/
|
||||||
|
private $groupes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="text", nullable=true)
|
||||||
|
*/
|
||||||
|
private $ssoitems;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="string", length=256, nullable=true)
|
||||||
|
*/
|
||||||
|
private $token;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="string", length=256, nullable=true)
|
||||||
|
*/
|
||||||
|
private $iddatasource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="string", length=12, nullable=true)
|
||||||
|
*/
|
||||||
|
private $horodatage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get UserName
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getUserName()
|
||||||
|
{
|
||||||
|
return $this->username;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Profil
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getProfil()
|
||||||
|
{
|
||||||
|
return $this->profil;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Groupes
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getGroupes()
|
||||||
|
{
|
||||||
|
return $this->groupes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Ssoitems
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getSsoitems()
|
||||||
|
{
|
||||||
|
return $this->ssoitems;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Token
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getToken()
|
||||||
|
{
|
||||||
|
return $this->token;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Iddatasource
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getIddatasource()
|
||||||
|
{
|
||||||
|
return $this->iddatasource;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Horodatage
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getHorodatage()
|
||||||
|
{
|
||||||
|
return $this->horodatage;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get id
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getId()
|
||||||
|
{
|
||||||
|
return $this->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set username
|
||||||
|
*
|
||||||
|
* @param string $username
|
||||||
|
*
|
||||||
|
* @return Datasource
|
||||||
|
*/
|
||||||
|
public function setUsername($username)
|
||||||
|
{
|
||||||
|
$this->username = $username;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set profil
|
||||||
|
*
|
||||||
|
* @param string $profil
|
||||||
|
*
|
||||||
|
* @return Datasource
|
||||||
|
*/
|
||||||
|
public function setProfil($profil)
|
||||||
|
{
|
||||||
|
$this->profil = $profil;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set groupes
|
||||||
|
*
|
||||||
|
* @param string $groupes
|
||||||
|
*
|
||||||
|
* @return Datasource
|
||||||
|
*/
|
||||||
|
public function setGroupes($groupes)
|
||||||
|
{
|
||||||
|
$this->groupes = $groupes;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set ssoitems
|
||||||
|
*
|
||||||
|
* @param string $ssoitems
|
||||||
|
*
|
||||||
|
* @return Datasource
|
||||||
|
*/
|
||||||
|
public function setSsoitems($ssoitems)
|
||||||
|
{
|
||||||
|
$this->ssoitems = $ssoitems;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set token
|
||||||
|
*
|
||||||
|
* @param string $token
|
||||||
|
*
|
||||||
|
* @return Datasource
|
||||||
|
*/
|
||||||
|
public function setToken($token)
|
||||||
|
{
|
||||||
|
$this->token = $token;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set iddatasource
|
||||||
|
*
|
||||||
|
* @param string $iddatasource
|
||||||
|
*
|
||||||
|
* @return Datasource
|
||||||
|
*/
|
||||||
|
public function setIddatasource($iddatasource)
|
||||||
|
{
|
||||||
|
$this->iddatasource = $iddatasource;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set horodatage
|
||||||
|
*
|
||||||
|
* @param string $horodatage
|
||||||
|
*
|
||||||
|
* @return Datasource
|
||||||
|
*/
|
||||||
|
public function setHorodatage($horodatage)
|
||||||
|
{
|
||||||
|
$this->horodatage = $horodatage;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,147 @@
|
||||||
|
![Logo NineGateEdispatcherBundle](https://gitlab.forge.education.gouv.fr/uploads/-/system/project/avatar/2613/ninegate.jpg?width=64)
|
||||||
|
|
||||||
|
# eole Ninegate : eDispatcherBundle
|
||||||
|
|
||||||
|
eDispatcherBundle est un bundle symfony 3 recréant les apis *xDesktop* permettant de récupérer les *items de bureau* et les *messages* d'annonce déclarés par l'administrateur du portail `NineGate` et d'exploiter ces données lors de la construction du Bureau fédéré de l'ENT académique via `eDispatcher`.
|
||||||
|
|
||||||
|
# CHANGELOG
|
||||||
|
|
||||||
|
Nouveautés :
|
||||||
|
- prise en compte du *flag* des catégories d'annonces héritées : `mail, rappel, attention`
|
||||||
|
- token de mise en correspondance user ninegate / edispatcher persisté pour une durée de 24h plutôt que réinit à chaque appel de /edispatcher/api/session
|
||||||
|
- mise en conformité des annonces : mémo et messages applicatifs, mise en forme, catégories par défaut
|
||||||
|
- prise en compte d'un attribut SSO permettant le profilage d'items (attribut contenant une liste de mots clés, mot clé indiqué lors de la création d'un item)
|
||||||
|
- autocreate du user lors de l'appel en session SSO de la route /edispatcher/session
|
||||||
|
|
||||||
|
# PREAMBULE : calcul d'attribut SSO => obtenir les groupes
|
||||||
|
|
||||||
|
Sur le serveur eole-sso, éditer le fichier `/usr/share/sso/app_filters/ninegate.ini` pour préciser le calcul des attributs `user_groups`, `displayName` et `ENTPersonProfils` dans la rubrique `[attributes]` ainsi qu'un attribut permettant d'associer des items automatiquement, décrit plus bas :
|
||||||
|
|
||||||
|
```
|
||||||
|
(...)
|
||||||
|
[attributes]
|
||||||
|
(...)
|
||||||
|
user_groups=user_groups
|
||||||
|
displayName=displayName
|
||||||
|
ENTPersonProfils=ENTPersonProfils
|
||||||
|
ssoitems=applications
|
||||||
|
```
|
||||||
|
/!\ l'attribut attendu dans le code du bundle pour fournir la valeur du profil national ENT est *ENTPersonProfils* (ex. National_1)
|
||||||
|
|
||||||
|
/!\ prise en compte d'un attribut facultatif *Associer automatiquement les items en fonction d'un attribut SSO*
|
||||||
|
L'attribut *ssoitems* indiqué dans l'exemple est un libellé libre à indiquer dans le gen_config si l'on choisit d'activer le profilage d'items via un attribut SSO :
|
||||||
|
La valeur de cet attribut SSO est calculé par un script python (ici applications.py qui se charge de parser un fichier YAML applications.yml)
|
||||||
|
|
||||||
|
Cet attribut est facultatif, il est utilisé sur un ninegate dit "académique" permettant le profilage de ressources communes : les items sont créés dans ninegate sans réglages de permissions, mais en indiquant un "key name" dans le champ obligatoire *Visible si attribut SSO "NOMattributSSO" égale à*.
|
||||||
|
|
||||||
|
# INSTALLATION
|
||||||
|
|
||||||
|
cloner le projet dans un dossier, ex `/ninegate/src/Acreunion/EdispatcherBundle/`
|
||||||
|
|
||||||
|
# Routes
|
||||||
|
|
||||||
|
Editer le fichier `/ninegate/app/config/routing.yml` et rajouter le bloc :
|
||||||
|
|
||||||
|
```
|
||||||
|
edispatcher:
|
||||||
|
resource: "@AcreunionEdispatcherBundle/Resources/config/routing.yml"
|
||||||
|
prefix: /
|
||||||
|
```
|
||||||
|
|
||||||
|
# prise en compte du Bundle
|
||||||
|
|
||||||
|
Editer le fichier `/ninegate/app/AppKernel.php` et dans l'énumération de l`array $bundles` rajouter la ligne :
|
||||||
|
|
||||||
|
```
|
||||||
|
new Acreunion\EdispatcherBundle\AcreunionEdispatcherBundle(),
|
||||||
|
```
|
||||||
|
|
||||||
|
Editer le fichier `/ninegate/app/config/template.yml` et dans la section `doctrine: > orm: > entity_managers: > default: > mappings:`
|
||||||
|
|
||||||
|
```
|
||||||
|
AcreunionEdispatcherBundle: ~
|
||||||
|
```
|
||||||
|
|
||||||
|
=> un `bin/console doctrine:schema:update --force` sera donc nécessaire, déclenche la création d'une table "edispatcher" qui correspond à l'entité Datasource du bundle.
|
||||||
|
|
||||||
|
# Catégories d'annonces
|
||||||
|
|
||||||
|
Pour reproduire un modèle d'annonces isofonctionnelles avec ce qui était connu sur xdesktop, il convient de créer les catégories suivantes :
|
||||||
|
|
||||||
|
- "sans categorie" (sans accent), icone chercher "stop", couleur sans effet : n'affichera pas de catégorie sur le bureau edispatcher
|
||||||
|
- "Message", icone chercher "mail" & choisir l'enveloppe, couleur #00a996
|
||||||
|
- "RAPPEL", icone chercher "clock", couleur #004666
|
||||||
|
- "Attention/Important", icone chercher "caution", couleur #ff9375
|
||||||
|
|
||||||
|
ou bien importer le sql suivant :
|
||||||
|
|
||||||
|
```
|
||||||
|
INSERT INTO `alertcategory`
|
||||||
|
(`id`, `icon_id`, `label`, `color`)
|
||||||
|
VALUES
|
||||||
|
(-100, 205, 'sans categorie', NULL),
|
||||||
|
(1, 51, 'Message', '00a996'),
|
||||||
|
(2, 154, 'RAPPEL', '004666'),
|
||||||
|
(3, 217, 'Attention/Important', 'ff9375');
|
||||||
|
```
|
||||||
|
|
||||||
|
# Détail des routes implémentées par le bundle, en lien avec la cinématique des appels effectués par Edispatcher :WARNING: _Work in progress_
|
||||||
|
|
||||||
|
## API debug
|
||||||
|
|
||||||
|
`/edispatcher/test`
|
||||||
|
- affiche le contenu de la table edispatcher, entité "datasource" utilisée pour établir un lien entre un user ninegate, un token et un id fourni par *edispatcher*
|
||||||
|
- affiche les attributs SSO du user en cours de session
|
||||||
|
|
||||||
|
`/edispatcher/test?id={{ username }}`
|
||||||
|
- complète la réponse précédente en affichant les groupes de l'utilisateur désigné - non lié à la session
|
||||||
|
|
||||||
|
## API Hello
|
||||||
|
|
||||||
|
`/edispatcher/public/hello`
|
||||||
|
|
||||||
|
[ETAPE 1 CINEMATIQUE DES APPELS EDISPATCHER]
|
||||||
|
|
||||||
|
`/edispatcher/api/apps/all` pour compatibilité appels xdesktop
|
||||||
|
|
||||||
|
- route non authentifiée (anonyme) interrogée par *edispatcher* pour vérifier que le serveur réponds, en l'occurence la réponse contient le mot clé "ninegate" prise en compte par *edispatcher* pour adapter les apis qui seront interrogées pour construire le bureau à partir des ressources de ce serveur.
|
||||||
|
|
||||||
|
## API Session
|
||||||
|
|
||||||
|
[ETAPE 2 CINEMATIQUE DES APPELS EDISPATCHER]
|
||||||
|
|
||||||
|
`/ninegate/edispatcher/api/session` route interrogée par fédération, la réponse fournit une valeur de token (et l'enregistre dans l'entité datasource pour l'associer au user en cours de session *token persistant pour une durée de 24h*), et retourne un attribut `adminPostit` à `true|false`
|
||||||
|
|
||||||
|
[ETAPE 4 CINEMATIQUE DES APPELS EDISPATCHER]
|
||||||
|
|
||||||
|
`/ninegate/edispatcher/api/session?id=xxx-yyy-zzz&api=_CALLBACK.setToken` l'`id` définit par *edispatcher* en étape 3 est communiqué en `GET` sur cette route, la réponse est un snippet javascript executé dans *edispatcher* en retour, lequel permet d'associer le `token` éphémère à la source de donnée identifiée par *edispatcher* `id`
|
||||||
|
|
||||||
|
## API Me
|
||||||
|
|
||||||
|
[ETAPE 3 CINEMATIQUE DES APPELS EDISPATCHER]
|
||||||
|
|
||||||
|
`/edispatcher/api/me` appelée en passant un token en `POST` (celui obtenu à l'étape 2)
|
||||||
|
|
||||||
|
- la réponse JSON contient des informations sur l'utilisateur (`display_name`, `admin_postit`), *edispatcher* associe a ces informations un `id` de source de données
|
||||||
|
|
||||||
|
## API DesktopItems
|
||||||
|
|
||||||
|
[ETAPE 5 CINEMATIQUE DES APPELS EDISPATCHER]
|
||||||
|
|
||||||
|
`/edispatcher/api/items?js=1&id={{ id }}`
|
||||||
|
|
||||||
|
`/edispatcher/api/controllers/desktopitems.php?js=1&id={{ id }}` pour compatibilité appels xdesktop
|
||||||
|
|
||||||
|
- Route appelée avec le `token` en `POST`, la réponse au format javascript (js=1) contient un chaine xml qui décrit les items de bureau, ainsi qu'une liste json précisant les url des items favoris.
|
||||||
|
|
||||||
|
## API Messages
|
||||||
|
|
||||||
|
[ETAPE 6 CINEMATIQUE DES APPELS EDISPATCHER]
|
||||||
|
|
||||||
|
`/edispatcher/api/messages` Route appelée avec le `token` en `POST` ou l'`id` en `GET`, la réponse au format javascript est exécutée à réception par *edispatcher* et alimente le panneau des mémos avec les éventuels messages visibles par le user indiqué par la datasource désignée par le `token` ou l'`id`.
|
||||||
|
|
||||||
|
`/edispatcher/api/message/{idalert}/{action}` Route utilisée par *edispatcher* pour basculer l'état de visibilité des annonces "masquables".
|
||||||
|
|
||||||
|
## API Favoris
|
||||||
|
|
||||||
|
`/edispatcher/api/mxServices` Route utilisée par *edispatcher* pour basculer la mise en favori d'un item
|
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 7.9 KiB |
|
@ -0,0 +1,28 @@
|
||||||
|
{% set logo = "" %}
|
||||||
|
|
||||||
|
{% set fgheader = "" %}
|
||||||
|
{% set header = "" %}
|
||||||
|
{% set heightheader = "" %}
|
||||||
|
|
||||||
|
{% set colormain = "004d9a" %}
|
||||||
|
{% set fontcolorhover = "" %}
|
||||||
|
{% set colorbody = "" %}
|
||||||
|
|
||||||
|
{% set fontfacetitle = "" %}
|
||||||
|
{% set fontfacebody = "" %}
|
||||||
|
|
||||||
|
{{
|
||||||
|
render(url("cadoles_core_theme_setconfig",
|
||||||
|
{
|
||||||
|
'logo':logo,
|
||||||
|
'fgheader':fgheader,
|
||||||
|
'header': header,
|
||||||
|
'heightheader': heightheader,
|
||||||
|
'colormain': colormain,
|
||||||
|
'fontcolorhover': fontcolorhover,
|
||||||
|
'colorbody': colorbody,
|
||||||
|
'fontfacetitle': fontfacetitle,
|
||||||
|
'fontfacebody': fontfacebody
|
||||||
|
}
|
||||||
|
))
|
||||||
|
}}
|
|
@ -0,0 +1,3 @@
|
||||||
|
name: Métice
|
||||||
|
author: Pierre Cadéot
|
||||||
|
version: 1.0
|
After Width: | Height: | Size: 556 KiB |
|
@ -0,0 +1,8 @@
|
||||||
|
INSERT INTO `niveau01` (`id`, `label`, `siren`, `showsubappname`, `logo`, `header`, `colormain`, `fontcolorhover`, `colorbody`, `fontfacetitle`, `fontfacebody`, `ldapfilter`, `attributes`) VALUES
|
||||||
|
(-100, 'Eleve', 'Eleves', 1, NULL, 'uploads/niveau01/Eleve.jpg', '3b8211', 'ffffff', 'ecf8dd', NULL, NULL, '', '{\"ENTPersonProfils\":\"National_1\"}'),
|
||||||
|
(3, 'Responsable', 'Responsab', 1, NULL, 'uploads/niveau01/Responsable.jpg', '57248c', 'ffffff', 'faf3fc', NULL, NULL, '(&(uid=*)(objectclass=inetOrgPerson)(!(description=Computer)))', '{\"ENTPersonProfils\":\"National_2\"}'),
|
||||||
|
(4, 'Enseignant', 'Enseignan', 1, NULL, 'uploads/niveau01/Enseignant.jpg', '0e6586', 'ffffff', 'b1e3f6', NULL, NULL, '(&(uid=*)(objectclass=inetOrgPerson)(!(description=Computer)))', '{\"ENTPersonProfils\":\"National_3\"}'),
|
||||||
|
(5, 'Perdir', 'Perdir', 1, NULL, 'uploads/niveau01/Perdir.jpg', '0e6586', 'ffffff', 'edecf3', NULL, NULL, '(&(uid=*)(objectclass=inetOrgPerson)(!(description=Computer)))\r\n', '{\"ENTPersonProfils\":\"National_4\"}'),
|
||||||
|
(6, 'Viescolaire', 'VieScolai', 1, NULL, 'uploads/niveau01/Viescolaire.jpg', 'a77e25', 'ffffff', 'f4e5d2', NULL, NULL, '(&(uid=*)(objectclass=inetOrgPerson)(!(description=Computer)))\r\n', '{\"ENTPersonProfils\":\"National_5\"}'),
|
||||||
|
(7, 'Rectorat', 'rectorat', 1, NULL, 'uploads/niveau01/Rectorat.jpg', '004d9a', 'ffffff', 'e5eeff', NULL, NULL, '(&(uid=*)(objectclass=inetOrgPerson)(!(description=Computer)))\r\n', '{\"ENTPersonProfils\":\"National_7\"}'),
|
||||||
|
(8, 'Administratif', 'Administr', 1, NULL, 'uploads/niveau01/Administratif.jpg', 'a77e25', NULL, 'f4e5d2', NULL, NULL, NULL, '{\"ENTPersonProfils\":\"National_6\"}');
|
|
@ -0,0 +1,53 @@
|
||||||
|
div.header {
|
||||||
|
background-image: linear-gradient(90deg,rgba(255,255,255,1) 0%, rgba(255,255,255,1) 15%, rgba(255,255,255,0.1) 50%, rgba(255,255,255,0) 100%),var(--header, url()) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.avatar { background-color: var(--main, #004d9a) !important; }
|
||||||
|
|
||||||
|
#logo {
|
||||||
|
height: 79px !important;
|
||||||
|
float: left !important;
|
||||||
|
top: -8px !important;
|
||||||
|
left: -10px !important;
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.header > a > span {
|
||||||
|
color: black !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav#appmenu > ul > li.active > a.active, .nav>li>a:hover {
|
||||||
|
background-color: white !important;
|
||||||
|
color: var(--main, #004d9a);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-default, .grid-item, .widgetheader {
|
||||||
|
background-color: var(--main, #004d9a) !important;
|
||||||
|
}
|
||||||
|
.grid-item-content {
|
||||||
|
background-color: var(--dark, #004d9a) !important;
|
||||||
|
}
|
||||||
|
.widget-mini > .widgetheader {
|
||||||
|
background-color: var(--light, white) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.navbar-default { border-color: var(--light, white) !important }
|
||||||
|
|
||||||
|
.nav > li > a:hover {
|
||||||
|
background:none !important;
|
||||||
|
}
|
||||||
|
.nav.navbar-top-links.navbar-left>li>a:hover {
|
||||||
|
text-shadow: var(--light, white) 0px 0px 20px;
|
||||||
|
color: var(--main, #004d9a) !important;
|
||||||
|
background-color: var(--light, white) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav.navbar-top-links.navbar-right>li>a:hover {
|
||||||
|
text-shadow: white 0px 0px 20px;
|
||||||
|
color: var(--main, #004d9a) !important;
|
||||||
|
background: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav#appmenu { zoom: 0.68; font-weight: bold; }
|
|
@ -0,0 +1,42 @@
|
||||||
|
|
||||||
|
#== API EDISPATCHER ============================================================================================================
|
||||||
|
|
||||||
|
cadoles_edispatcher_test:
|
||||||
|
path: /edispatcher/test
|
||||||
|
defaults: { _controller: CadolesEdispatcherBundle:Api:test }
|
||||||
|
|
||||||
|
cadoles_edispatcher_api_js_item:
|
||||||
|
path: /edispatcher/api/items
|
||||||
|
defaults: { _controller: CadolesEdispatcherBundle:Api:desktopitem }
|
||||||
|
|
||||||
|
cadoles_edispatcher_api_controllers_desktopitems:
|
||||||
|
path: /edispatcher/api/controllers/desktopitems.php
|
||||||
|
defaults: { _controller: CadolesEdispatcherBundle:Api:desktopitem }
|
||||||
|
|
||||||
|
cadoles_edispatcher_api_js_alert:
|
||||||
|
path: /edispatcher/api/messages
|
||||||
|
defaults: { _controller: CadolesEdispatcherBundle:Api:message }
|
||||||
|
|
||||||
|
cadoles_edispatcher_api_js_alert_action:
|
||||||
|
path: /edispatcher/api/message/{idalert}/{action}
|
||||||
|
defaults: { _controller: CadolesEdispatcherBundle:Api:message }
|
||||||
|
|
||||||
|
cadoles_edispatcher_api_public_hello:
|
||||||
|
path: /edispatcher/api/public/hello
|
||||||
|
defaults: { _controller: CadolesEdispatcherBundle:Api:hello }
|
||||||
|
|
||||||
|
cadoles_edispatcher_api_apps_all:
|
||||||
|
path: /edispatcher/api/apps/all
|
||||||
|
defaults: { _controller: CadolesEdispatcherBundle:Api:hello }
|
||||||
|
|
||||||
|
cadoles_edispatcher_api_me:
|
||||||
|
path: /edispatcher/api/me
|
||||||
|
defaults: { _controller: CadolesEdispatcherBundle:Api:me }
|
||||||
|
|
||||||
|
cadoles_edispatcher_api_session:
|
||||||
|
path: /edispatcher/api/session
|
||||||
|
defaults: { _controller: CadolesEdispatcherBundle:Api:session, access: user }
|
||||||
|
|
||||||
|
cadoles_edispatcher_fav_manage:
|
||||||
|
path: /edispatcher/api/mxServices
|
||||||
|
defaults: { _controller: CadolesEdispatcherBundle:Api:mxServices }
|
|
@ -0,0 +1,33 @@
|
||||||
|
{% extends '@CadolesCore/base.html.twig' %}
|
||||||
|
|
||||||
|
{% block pagewrapper %}
|
||||||
|
<h1>TEST EDISPATCHER</h1>
|
||||||
|
|
||||||
|
<h2>Datasources</h2>
|
||||||
|
{% for source in datasource %}
|
||||||
|
<h3><strong>id</strong> = {{ source.id }}</h3>
|
||||||
|
<strong>username</strong> = {{ source.username }}<br>
|
||||||
|
<strong>profil</strong> = {{ source.profil }}<br>
|
||||||
|
<strong>groupes</strong> = {{ source.groupes }}<br>
|
||||||
|
<strong>ssoitems</strong> = {{ source.ssoitems }}<br>
|
||||||
|
<strong>token</strong> = {{ source.token }}<br>
|
||||||
|
<strong>horodatage</strong> = {{ source.horodatage }}<br>
|
||||||
|
<strong>iddatasource</strong> = {{ source.iddatasource }}<br>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<h2>Appartient aux Groupes</h2>
|
||||||
|
<strong>Groupes :</strong> = {{ groups }}<br>
|
||||||
|
|
||||||
|
<h2>Atttribut SSO</h2>
|
||||||
|
{% for key, attribute in attributes %}
|
||||||
|
{% if attribute is iterable %}
|
||||||
|
{% for value in attribute %}
|
||||||
|
<strong>{{ key }}</strong> = {{ value }}<br>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<strong>{{ key }}</strong> = {{ attribute }}<br>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<br><br><br><br><br><br><br>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/* DATA_FOR_MXDESKTOP: Ne pas supprimer cette ligne */
|
||||||
|
var username='{{ username }}';
|
||||||
|
var source=MX.getSource('{{ id }}');
|
||||||
|
if (!source) {
|
||||||
|
console.log("Source {{ id }} introuvable");
|
||||||
|
} else {
|
||||||
|
source.setData('{"xml":"<main><buttondatas>{% set mycategs = [] %}
|
||||||
|
{% for itemcategory in itemcategorys %}
|
||||||
|
{% set haveitem=false %}
|
||||||
|
{% for item in items if item.itemcategory==itemcategory %}
|
||||||
|
{% if loop.index ==1 %}
|
||||||
|
{% set mycategs = mycategs|merge({ (loop.index) : itemcategory}) %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfor %}
|
||||||
|
{% set firstcat=true %}
|
||||||
|
{% for itemcategory in mycategs %}
|
||||||
|
{% set haveitem=false %}
|
||||||
|
{% for item in items if item.itemcategory==itemcategory %}
|
||||||
|
{% if loop.index ==1 %}
|
||||||
|
{% set haveitem=true %}
|
||||||
|
{% if (bookmarks is not empty) %}
|
||||||
|
{% set toview=true %}
|
||||||
|
{% if menu and not menuall%}
|
||||||
|
{% set toview=false %}
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{% if menu and not menuall%}
|
||||||
|
{% if firstcat %}
|
||||||
|
{% set toview=true %}
|
||||||
|
{% else %}
|
||||||
|
{% set toview=false %}
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{% set toview=true %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% set firstcat=false %}
|
||||||
|
{% endif %}<buttondata><nom>{{ item.title|lower }}<\/nom><icon>{% if item.icon %}{{ app.request.getSchemeAndHttpHost() }}/{{ alias }}/{{ item.icon.label }}{% else %}{{ app.request.getSchemeAndHttpHost() }}/{{ alias }}/uploads/icon/icon_pin.png{% endif %}<\/icon><libelle>{{ item.subtitle | e('js') }}<\/libelle><url>{{ item.url }}<\/url><categoriename>{{ item.itemcategory.label|lower }}<\/categoriename><categorieid>{{ item.itemcategory.id }}<\/categorieid><infos_url><\/infos_url><infos_type><\/infos_type><infos_message><\/infos_message><\/buttondata>{% endfor %}{% endfor %}{% if (bookmarks is not empty) %}
|
||||||
|
{% for bookmark in bookmarks %}
|
||||||
|
{% if bookmark.item %}<buttondata><nom>{{ bookmark.item.title|lower }}<\/nom><icon>{% if bookmark.item.icon %}{{ app.request.getSchemeAndHttpHost() }}/{{ alias }}/{{ bookmark.item.icon.label }}{% else %}{{ app.request.getSchemeAndHttpHost() }}/{{ alias }}/uploads/icon/icon_pin.png{% endif %}<libelle>{{ bookmark.item.subtitle|lower|e('js') }}<\/libelle>;<url>{{ bookmark.item.url }}<\/url><categoriename>{{ bookmark.item.itemcategory.label|lower }}<\/categoriename><categorieid>{{ bookmark.item.itemcategory.id }}<\/categorieid><infos_url><\/infos_url><infos_type><\/infos_type><infos_message><\/infos_message><\/buttondata>{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
<\/buttondatas><description><services_url>undefined<\/services_url><\/description><categories>{% for itemcategory in mycategs %}<categorie><nom>{{ itemcategory.label }}<\/nom><couleur>{% if itemcategory.color is null %}#A0A0A0{% else %}{{ itemcategory.color }}{% endif %}<\/couleur><indice>{{ itemcategory.rowOrder }}<\/indice><icone>{% if itemcategory.icon is null %}fa-square{% else %}{{ itemcategory.icon }}{% endif %}<\/icone><\/categorie>{% endfor %}<\/categories><\/main>","favoris":"{% if (bookmarks is not empty) %}[
|
||||||
|
{% for bookmark in bookmarks %}
|
||||||
|
{% if bookmark.item %}
|
||||||
|
{"url":"{{ bookmark.item.url }}","libelle":"{{ bookmark.item.title|lower }}","icon":"{% if bookmark.item.icon %}{{ app.request.getSchemeAndHttpHost() }}/{{ alias }}/{{ bookmark.item.icon.label }}{% else %}{{ app.request.getSchemeAndHttpHost() }}/{{ alias }}/uploads/icon/icon_pin.png{% endif %}"},
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
"userinfos":{"profil":"{{ profil }}","rne":"{{ rne }}","groupes":"{{ groupe }}"}","id":{{ id }}}');
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
{% import "@CadolesPortal/Pagewidget/constants.twig" as constants %}
|
||||||
|
{% set colormain = constants.mycolormain() %}
|
||||||
|
{#
|
||||||
|
{% set stylewidget = constants.mystylewidget(entity) %}
|
||||||
|
{% set stylewidgetmenu = constants.mystylewidgetmenu(entity) %}
|
||||||
|
{% set stylewidgetheader = constants.mystylewidgetheader(entity) %}
|
||||||
|
{% set stylewidgetbody = constants.mystylewidgetbody(entity) %}
|
||||||
|
<p>TEST ALERT</p>
|
||||||
|
#}
|
||||||
|
{
|
||||||
|
"messages": [
|
||||||
|
{% for alert in alerts %}
|
||||||
|
{
|
||||||
|
"id": "{{ alert.id }}",
|
||||||
|
"message": "{{ alert.content | e("js") }}",
|
||||||
|
"filtre": "aucun",
|
||||||
|
"valeur": "[]",
|
||||||
|
"flag": "",
|
||||||
|
"closeable": "{{ alert.fghideable }}",
|
||||||
|
"requestable": "false",
|
||||||
|
"display_mode": "postit",
|
||||||
|
"responses": "[]",
|
||||||
|
"url": "",
|
||||||
|
"start": "2020-09-02 00:00:00",
|
||||||
|
"stop": "2020-10-01 23:59:59",
|
||||||
|
"updated": "2020-09-03 10:45:21",
|
||||||
|
"user_responses": []
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
],
|
||||||
|
"admin": true
|
||||||
|
},
|
||||||
|
{#
|
||||||
|
id = {{ alert.id }}
|
||||||
|
background = {{ alert.alertcategory.color ? '#'~alert.alertcategory.color : '#'~colormain }};
|
||||||
|
{% if alert.alertcategory.icon %}
|
||||||
|
icon ="/{{ alias }}/{{ alert.alertcategory.icon.label }}"
|
||||||
|
{% else %}
|
||||||
|
icon = "/{{ alias }}/uploads/icon/icon_megaphone.png"
|
||||||
|
{% endif %}
|
||||||
|
title = {{ alert.title }}
|
||||||
|
hideable = {{ alert.fghideable }}
|
||||||
|
contenu = {{ alert.content }}
|
||||||
|
#}
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"name" : "acreunion/edispatcherbundle",
|
||||||
|
"description" : "",
|
||||||
|
"type" : "symfony-bundle",
|
||||||
|
"minimum-stability" : "dev",
|
||||||
|
"autoload" : {
|
||||||
|
"psr-0" : {
|
||||||
|
"Acreunion\\EdispatcherBundle" : ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"target-dir" : "Acreunion/EdispatcherBundle"
|
||||||
|
}
|
|
@ -542,6 +542,7 @@ doctrine:
|
||||||
CadolesCronBundle: ~
|
CadolesCronBundle: ~
|
||||||
CadolesPortalBundle: ~
|
CadolesPortalBundle: ~
|
||||||
CadolesWebsocketBundle: ~
|
CadolesWebsocketBundle: ~
|
||||||
|
CadolesEdispatcherBundle: ~
|
||||||
|
|
||||||
|
|
||||||
|
|