Pages enfant
  • Retailler automatiquement les canaux iFrame pour éviter les doubles ascenceurs

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...

Pour des raisons de confort pour l'utilisateur, on retaille les canaux de façon à supprimer les doubles assenceurs. Cette page présente une méthode possible pour les applications PHP.

Pour d'autres solutions (expliquées pour uportal 3.2), voir Retaillage d'iframe.

Version concernée :

uPortal-esup et esupdev 2.6 versions ALM et DLM

Patcher la classe  CInlineFrame

Patcher la class CInlineFrame de façon à rajouter un nom à la frame (c'est plus simple si on en a plusieurs sur la même page),

Bloc de code

--- CInlineFrame.java    2008-12-09 10:14:52.000000000 +0100
+++ CInlineFrame.java.new    2008-12-09 10:15:12.000000000 +0100
@@ -51,6 +51,7 @@
     // Obtain url and height, both static parameters
     String srcUrl = staticData.getParameter("url"); // the url for the IFrame content
     String frameHeight = staticData.getParameter("height"); // the height of the IFrame in pixels
+    String iFrameName = staticData.getParameter("iFrameName"); // the name of the IFrame in pixels

     Document doc = null;
     try {
@@ -62,12 +63,19 @@

     // Create XML doc
     Element iframeE = doc.createElement("iframe");
+
     Element urlE = doc.createElement("url");
     urlE.appendChild(doc.createTextNode(srcUrl));
     iframeE.appendChild(urlE);
+
     Element heightE = doc.createElement("height");
     heightE.appendChild(doc.createTextNode(frameHeight));
     iframeE.appendChild(heightE);
+
+    Element iFrameNameE = doc.createElement("iFrameName");
+    iFrameNameE.appendChild(doc.createTextNode(iFrameName));
+    iframeE.appendChild(iFrameNameE);
+
     doc.appendChild(iframeE);

     XSLT xslt = XSLT.getTransformer(this, runtimeData.getLocales());
@@ -105,4 +113,4 @@
     sbKey.append("locales:").append(LocaleManager.stringValueOf(runtimeData.getLocales()));
     return sbKey.toString();
   }
-}
\ Pas de fin de ligne à la fin du fichier.
+}

...

On définit le nom de la frame qui sera utilisé dans la feuille de randu

Bloc de code

     <parameter>

            <name>iFrameName</name>

            <value>nomdeliframe</value> ==> nom de la frame qui sera utilisé dans les applications pour la retailler

            <description></description>

            <ovrd>N</ovrd>

        </parameter>

Modifier la feuille Iframe.xsl de façon a ajouter le nom du canal

Bloc de code

<?xml version='1.0'?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:param name="locale">en_US</xsl:param>

<xsl:template match="iframe" >
    <iframe src="{url}" height="{height}" name="{iFrameName}" id="{iFrameName}" frameborder="0" width="100%">
        This browser does not support inline frames.<br/>
        <a href="{url}" target="_blank">Click here to view content</a> in a separate window.
    </iframe>
</xsl:template>
</xsl:stylesheet>

...

2 - ajouter dans l'entete  de page :

Bloc de code

<script type="text/javascript">
    document.domain="domaine.univ.fr";
    function resizeIframe(maframe){
        if (navigator.userAgent.indexOf('Safari') == -1) {
            var height = document.body.scrollHeight + 35;   // (on ajoute  + 35 car le calcul de la page peut varier, sur le meme navigateur ca peut se jouer et quelques px)
        }
        else{
            var height = document.body.offsetHeight + 35;
        }
         <? if (isset($iFrameHeight) && $iFrameHeight != "") echo "\nheight=$iFrameHeight;\n"; ?>
         maframe.style.height = height +"px";
        };
</script>

3 - ajouter dans le pied de page :

Bloc de code

<script type="text/javascript">
    document.domain="domaine.univ.fr";
    try{
        maframe = parent.document.getElementById('<?=$iFrameName?>');
        maframe.onload = resizeIframe(maframe);
        window.onresize = resizeIframe(maframe);
    }
    catch(e){}
</script>

...

Preciser votre nom de domaine dans le fichier de constantes : editor/_source/fckconstants.js

Bloc de code

var FCK_RUNTIME_DOMAIN = "domaine.univ.fr";

...

Ajouter dans theme/votre-themes/header.html (ligne 9)

Bloc de code

<script type="text/javascript">
    if (navigator.appName != "Microsoft Internet Explorer"){ document.domain="domaine.univ.fr"; }
</script>

...

Ajouter dans theme/votre-themes/footer.html  (ligne 30)

Bloc de code

<script type="text/javascript">if (navigator.appName != "Microsoft Internet Explorer"){
    document.domain="domaine.univ.fr";
        maframe = parent.document.getElementById('CMoodle');  // nom de la frame déclaré dans le pubchan (ici : CMoodle)
        function resizeIframe() {
            if (navigator.userAgent.indexOf('Safari') == -1) {
                var height = document.body.scrollHeight + 35;   // (on ajoute  + 35 car le calcul de la page peut varier, sur le meme navigateur ca peut se jouer et quelques px)
            }
            else{
                var height = document.body.offsetHeight + 35;
            }
            maframe.style.height = height +"px";
        };
        maframe.onload = resizeIframe;
        window.onresize = resizeIframe;
}</script>

...

  • lib/editor/htmlarea/popups/popup.js (ligne 15)
  • lib/editor/htmlarea/coursefiles.php (ligne 54)
  • lib/editor/htmlarea/popups/fullscreen.php (ligne 24)

la ligne à ajouter est :

Bloc de code

if (navigator.appName != "Microsoft Internet Explorer"){ document.domain="domaine.univ.fr"; }

 

Une autre correction est nécessaire pour l'ouverture en plein écran (popup) de l'éditeur. Il s'agit d'ajouter "parent" devant "opener.HTMLArea._object" dans le fichier :

  • lib/editor/htmlarea/popups/fullscreen.php (ligne 120)
Bloc de code

Remplacer

 parent_object      = opener.HTMLArea._object;

par

  parent_object      = parent.opener.HTMLArea._object;

...