0

私はサイトを開発してきました (今のところ例としてここにあります: http://neurotoxine.mine.nu/gloom )、styleswitcher コードから奇妙な動作を取得しています。大きいので我慢してください。

まず、私が最初に指定したサイトに行って見てください。そこにあるのは、Jqueryを使用したjoomlaページです

var $j = jQuery.noConflict();

mootools の衝突を避けるためです。次に、これらを使用しました:

<?  // Checks for, and assigns cookie to local variable:
if(isset($_COOKIE['style']))
{   $style = $_COOKIE['style'];
}
// If no cookie is present then set style as "red" (default):
else {    $style = 'red';
}
?>

これは Cookie 設定のためだけのものです。Cookie が設定されていない場合は $style=red となり、この変数は CSS に追加されます。このような:

<link rel="stylesheet" type="text/css" href="<?php echo $this->baseurl ?>/templates/wh1/css/template_<?php echo $style ?>.css" media="screen" />

最初のコード、$this->baseurl=joomla インストール用のディレクトリ、この場合は gloom. 2 番目の echo $style は、Cookie が読み込まれた値またはオプションから割り当てられた値を書き込みます。最初にそこに到達した場合、値として RED が取得され、template_red.css がその CSS になります。サイト全体。

いくつかのjqueryトリックを実行するJSがあります:

 jQuery.fn.styleSwitcher = function(){
  $j(this).click(function(){
      // We're passing this element object through to the loadStyleSheet function.
      loadStyleSheet(this);
      // And then we're returning false.
      return false;
  });
  function loadStyleSheet(obj) {
    $j('#preloader')
    // Now fade in the div (#preloader):
    .fadeIn(500,function(){
      // The following will happen when the div has finished fading in:
      // Request PHP script (obj.href) with appended "js" query string item:
      $j.get( obj.href+'&js',function(data){
        // Select link element in HEAD of document (#stylesheet) and change href attribute:
        $j('#stylesheet').attr('href','css/' + data + '.css');
        // Check if new CSS StyleSheet has loaded:
        cssDummy.check(function(){
          // When StyleSheet has loaded, fade out and remove the #overlay div:
          $j('#preloader').fadeOut(500);
        });
      });
    });
  }
  // CSS DUMMY SECTION
  var cssDummy = {
    init: function(){
      // Appends "dummy-element" div to body:
      $j('<div id="dummy-element" style="display:none" />').appendTo('body');
    },
    check: function(callback) {
      // Checks if computed width equals that which is defined in the StyleSheets (2px):
      if ($j('#dummy-element').width()==2) callback();
      // If it has not loaded yet then simple re-initiate this function every 200 milliseconds until it had loaded:
      else setTimeout(function(){cssDummy.check(callback)}, 200);
    }
  }
  cssDummy.init(); }

次に、自分のページで関数を開始します。

$j(document).ready(function(){
$j('#style-switcher a').styleSwitcher();
});

そして、私は次のようなリンクからそれを呼び出します:

<a href="<?php echo $this->baseurl ?>/templates/wh1/style-switcher.php?style=fire">img</a>

最後に、styleswitcher.php コードは次のとおりです。

<?php
$style = $_GET['style'];
setcookie("style", $style, time()+604800*24); // 604800 = amount of seconds in one week *4=1 month *24=1/2 year *48=1 year
if(isset($_GET['js']))
echo $style;
else header("Location: ".$_SERVER["HTTP_REFERER"]); ?>

さて、問題は、サイトでこれをテストしたところ、すべてが正常に機能したことです ( http://neurotoxine.mine.nu/wht/index-test.php - スタイルチェンジャーへのリンクはそれらの上部と左側にありますテーマは言います)。しかし、コード全体を joomla テンプレートに挿入すると、システム全体が失敗しました。あちこちでいくつかの修正 (主に $j 宣言) を行った後、それがテンプレートのパスに関連している可能性があることに気付き、さまざまな種類の宣言、絶対パス、相対パスなどをテストしましたが、何も起こりませんでした。

次に、styleswitcher.php を joomla のルート (neurotoxine.mine.nu/gloom) にコピーし、そこで ti が機能するかどうかを確認したところ、空白のページが表示されました。go-back をクリックすると、すごいスタイルチェンジャーが機能しましたが、戻る場所がわかりません。header("Location: ".$_SERVER["HTTP_REFERER"]); 命令ですが、それを機能させるために何を変更すればよいかわかりません。

Joomla は、そのテンプレートのヘッダーで宣言を行います。

<base href="http://neurotoxine.mine.nu/gloom/" />

これが http_referer の動作に影響を与えているかどうかはわかりませんが、これを無効にしてもサイトは同じように動作し、スタイルをクリックし、ページを空白にし、戻るをクリックしてほら、スタイルは変更されましたが失敗しました私がいたページを取得します。

いくつかのアイデア?どんな助けでも役に立ちます。

4

2 に答える 2

1

リファラーは、リンクをクリックしたときにのみ設定されます (アドレスバーに直接入力したときではありません)。実際、ブラウザはユーザーがこのリンクをクリックする前にどこにいたかをサイトに伝えるため、100% 信頼することはできません ( PHP マニュアルを参照)。最後にアクセスしたページを $_SESSION に保存し、このページにリダイレクトします。空の場合は、 $this->baseurl にリダイレクトします。「/index.php」。

base-Tag は相対リンクにのみ必要です。

<a href="index.php">

あるいは:

<a>

別のヒント: Cookie からスタイルを取得する前に、それが存在するかどうかを確認します (使用可能なすべてのテンプレートをハードコードするか、file_exists())。そうでない場合は、デフォルトのもの (赤) を使用します。

于 2009-08-24T07:43:00.507 に答える
0

私はこれを解決しました...解決策は3つから4つのエラーを修正していました:

まず第一に、HTML の Cookie チェッカーは、Cookie が空でないか、SET であるかどうかを確認する必要があります。そう:

<?php  // Checks for, and assigns cookie to local variable:
if(!empty($_COOKIE['style'])) $style = $_COOKIE['style'];
// If no cookie is present then set style as "red" (default):
else $style = 'red';
?>

それが最初に修正することでした。次に、JQuery プラグインがヘッダーの ID を変更するよう要求したため、この行は修正されました。リンクのスタイルシート宣言で ID がないことに気付きませんでした

<link id="stylesheet" rel="stylesheet" type="text/css" href="<?php echo $this->baseurl ?>/templates/wh1/css/template_<?php echo $style ?>.css" media="screen" />

この行で、私もそれを発見しました

<?php echo $this->baseurl ?>

ベースアドレスに置き換える必要がありますが、ドメインがないため、次のようにする必要があります

/gloom/templates/wh1/css/template_<?php echo $style ?>.css

また、JQuery プラグインの初期化で、致命的なミスを犯してしまいました。プラグインによってキャプチャされるタグのコンテナーの ID は変更しませんでした。これは、スタイルシートのヘッダーの ID とタグ コンテナーの ID が混同される原因の 1 つです。そこで、DIV の ID に「#tselect」を使用して、Jquery の作業を解決しました。さらに、プラグインのすべてのステートメントで $j を広告することが必須です。

$j(document).ready(function(){
    $j.preloadCssImages({statusTextEl: '#textStatus', statusBarEl: '#status'});
        $j("img#hhead").toggle(
        function () { 
            $j("#headtop").slideDown();
        },
        function () {
            $j("#headtop").slideUp();
        });
    $j("#tselect a").styleSwitcher(); // here is the "ID TAG".plugin() call.
});

さて、styleswitcher.php で、Cookie について誰かが教えてくれたヒントを使用しました。

<?php $style = $_GET['style'];
setcookie("style", $style, time()+604800,"/"); // 604800 = amount of seconds in one week
if(isset($_GET['js'])) echo $style;
else header("Location: ".$_SERVER['HTTP_REFERER']);
?>

気づいた?単純な / スラッシュです。

今、すべてが正常に動作します。stylechanger はスタイルを変更し、JQuery 効果が機能します。ここで見ることができます:リンクテキスト

ファイルと説明が必要な人は、私にメッセージを送ってください。

于 2009-08-27T03:46:18.607 に答える