2011-12-29 3 views
1

Ploneのポートレットは非常に便利ですが、ユーザーに一時的に表示/非表示できる方法を提供したいと考えていますポートレット列。つまり、ボタンをクリックすると、ポートレット列が折りたたまれ、コンテンツページが全幅で表示されます。もう一度クリックすると、左側のポートレットパネ​​ルが展開され、メインのコンテンツページの幅が収縮して調整されます。Plone4上のユーザーがポートレット列をオン/オフで表示/非表示にできるようにする

ポートレット列のHTML IDが "portal-column-one"であることを確認しました。この要素の可視性プロパティを "hidden"に設定するためのJavaScriptを実行するページにボタンを追加しようとしましたが、効果がない。私はFirebugに入り、スタイル= "visibility:hidden;を追加することができました。 「portal-column-one」要素に追加すると、ページのサイズを変更することなく領域を非表示にする効果がありました。

私はPlone 4.1を使用しています。 Navigation、Review List、Recent Changesがあるメインページ以外のすべてのページにナビゲーションポートレットを設定してサイトを作成しました。

これは、ページにJavaScriptを埋め込むことができるように思われる(私は既にカスタマイズしたplone.logoページにこれを追加することを考えていた)。しかし、私はそれを作った数少ないスタブよりも複雑だと思う。

アドバイスを事前にいただきありがとうございます。

ソリューション(ウルリッヒ・シュワルツとhvelardeからの入力のおかげで):私が到着したソリューションは、CSSを表示/ポートレットカラム(左側)非表示にする属性を設定するにはJavaScriptを使用しています

と記入する内容欄を拡大ポーレット柱が満たされた空間。

Ploneヘッダーテンプレートをカスタマイズして、ユーザーがPorlets列の表示を切り替えるためのリンクを追加することから始めました。私はまた、このヘッダーに必要なjavascript関数を配置します。

このページを作成するには: "plone.logo" オン "portal_view_customizations"

  • クリックして上のサイトのセットアップへ

    1. ゴー(管理者など)
    2. Go]をZopeの管理インターフェース
    3. にクリックします(または少なくともこれはナビゲーションポートレットのすぐ上に位置するようにボタンを置く場所です)

    <script> 
    function getById(id) { 
        return document.getElementById(id); 
    } 
    function TogglePortletsPanel() { 
        var dispVal = getById('portal-column-one').style.display 
        if(dispVal == "none") { // Normal display 
        SetPortletsPanelState("inline"); 
        } else { // Full Screen Content 
        SetPortletsPanelState("none"); 
        } 
    } 
    function SetPortletsPanelState(dispVal) { 
        var nav = getById('portal-column-one'); 
        var content = getById('portal-column-content'); 
        if(dispVal == "none") { // Normal display 
        nav.style.display='none'; 
        content.className='cell width-full position-0'; 
        // Set cookie to updated value 
        setCookie("portletDisplayState","none",365); 
        } else { // Full Screen Content 
        nav.style.display='inline'; 
        content.className='cell width-3:4 position-1:4'; 
        // Set cookie to updated value 
        setCookie("portletDisplayState","inline",365); 
        } 
    } 
    function InitializePortletsPanelState() { 
        var portletDisplayState=getCookie("portletDisplayState"); 
    //alert("portletDisplayState="+portletDisplayState) 
        if (portletDisplayState!=null) SetPortletsPanelState(portletDisplayState); 
    } 
    function setCookie(c_name,value,exdays) { 
    //alert(c_name+"="+value); 
    // cookie format: document.cookie = 'name=value; expires=Thu, 2 Aug 2001 20:47:11 UTC; path=/' 
        var exdate=new Date(); 
        exdate.setDate(exdate.getDate() + exdays); 
        var exp= ((exdays==null) ? "" : "; expires="+exdate.toUTCString()); 
        document.cookie=c_name + "=" + escape(value) + exp + "; path=/"; 
    } 
    function getCookie(c_name) { 
        var i,x,y,ARRcookies=document.cookie.split(";"); 
        for (i=0;i<ARRcookies.length;i++) { 
        x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("=")); 
        y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1); 
        x=x.replace(/^\s+|\s+$/g,""); 
        if (x==c_name) return unescape(y); 
        } 
    } 
    function addLoadEvent(func) { 
        var oldonload = window.onload; 
        if (typeof window.onload != 'function') { 
        window.onload = func; 
        } else { 
        window.onload = function() { 
         if (oldonload) {oldonload(); } 
         func(); 
        } 
        } 
    } 
    
    addLoadEvent(InitializePortletsPanelState); 
    
    </script> 
    <a style="font-size:50%;" href="javascript:TogglePortletsPanel();">Toggle Portlets Panel</a> 
    

    6。ページを保存し

    注:

    • 私はFirebugのを使用してのPloneのdiv要素の名前を得ました。
    • また、Firebugを使用してさまざまな設定を試して試作をスピードアップしました。たとえば、HTMLインラインを編集して、設定が期待どおりに行われているかどうかを確認します。
    • [左ポートレット]パネルが非表示になるまでわずかな遅延があります。これは私のためにSafari上でのみ明らかです(おそらくそれが速いためです)が、FirefoxやIEではそうではありません。
  • +0

    次の質問に対するDavid Glickの回答をご覧ください:http://stackoverflow.com/questions/5872306/how-can-i-remove-portlets-in-edit-mode-with-plone-4 – hvelarde

    +0

    David Glickの答えは、私が望むアプローチかもしれません。 この方法では、URL Paramsなどで左パネルを表示または非表示にする設定ができますか?私はその答えの中で「要求にいくつかの変数を設定する」ことが意味することにはほとんど従っていません。 目的は、ユーザーがナビゲーションパネルを削除し、ブラウズしてから復元できるようにすることです。 – Steve

    +0

    JavaScriptのコードを使用して、ユーザーの設定を保存するCookieを設定できると思います。 – hvelarde

    答えて

    1

    右のプロパティを設定するだけの理由があります。display:noneではなく、visibility:hiddenです。

    しかし、コンテンツ領域が自動的にリフローされない場合も、そのクラスを(動的に)変更する必要があります。 具体的には、width-1:2position-1:4ではなく、width-fullposition-0portal-column-contentに配置する必要があります。

    +0

    私はCSSソリューションを十分に考えていなかったと思います。私はUlrichの提案でこの作業をすることができましたが、新しいページに移動すると設定が失われ、navbarが戻ることに気付きました。 – Steve

    +0

    @Steve:これらの行に沿ってハッキングを続けたい場合は、javascriptを使用してクッキーのクライアント側にアクセスし、そこにフラグを格納することができます。 (これはフラグserversideを持つ以上のキャッシングの利点を持っています) –

    +0

    私はこれを動作させることができましたが、左側のポートレットパネ​​ルが表示され、次にonloadイベントがトリガーされると折りたたまれて見える時間があります。かなりkludgy。hvelardeが言及したDavid Glickの答えをもっと探求します。 – Steve

    0

    これは、javascript(jquery)によるクライアント側でなければなりません。

    plone:deco.gsで使用されているcssグリッドフレームワークに関するドキュメントを最初に読む必要があります。ウェブサイトがダウンしているので、このリポジトリを複製してください:https://github.com/limi/deco.gsとウェブブラウザでページを開く

    注:コンテナのCSSクラスを変更するだけです。

    +0

    これは私の学習曲線がやや高いかもしれないと思います。私が時間を費やした場合、このソリューションは手書きのJavascriptとCookieを使用して見つけることができますか?ページの読み込み後にポートレットパネ​​ルが目立つように折りたたまれていますか? – Steve

    0

    試してください。adi.fullscreenを試してください。それは、Ploneのcss構造を尊重しています(Ulrich Schwarzが慎重に述べたように)。

    +0

    adi.fullscreenは、Ulrichで提案されたソリューションと同じように動作します。設定は次のページに移動すると失われます。
    私は、ユーザーが通常のビューをリセットするまで、レイアウトの変更をページ間でスティックする方法を見つけることを望んでいます。 – Steve

    +0

    btw:この投稿を見るとこのPloneアドオンを書いていましたか?私はピピのページの日付があなたのポストの日付と同じであることに気づいた。 – Steve

    +0

    実際にはい;)私はしばしば、これはすばらしい機能であり、多くの人々がそれを要求したが、本当に時間がなかったと思った。冬の時間について肯定的な何か... –

    関連する問題