Проблема Switchstyle в Joomla / Php / Jquery / Css - PullRequest
0 голосов
/ 24 августа 2009

Я занимаюсь разработкой сайта (сейчас здесь в качестве примера: http://neurotoxine.mine.nu/gloom),, и я получаю странное поведение из кода переключателя стилей. Он большой, поэтому, пожалуйста, наберитесь терпения.

Сначала вы можете зайти на сайт, который я назначил первым, и посмотреть его. То, что у вас есть, это страница Joomla, с Jquery, использующим

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, в данном случае мрачный. Второй, echo $ style, запишет загруженное cookie-значение или значение, назначенное из опций, в случае, если вы попадете туда в первый раз, тогда вы получите КРАСНОЕ значение, тогда template_red.css будет CSS для весь сайт.

Есть JS, который работает, выполняя некоторые трюки с jquery:

 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) и проверил, будет ли работать там, и я получаю пустую страницу. Я нажал кнопку возврата и затем WOW, сработал стайл-чейнджер, но потом что-то не говорит, куда вернуться, я думаю, что это может быть заголовок ("Location:". $ _ SERVER ["HTTP_REFERER"]); инструкция, но я не знаю, что там изменить, чтобы заставить его работать.

Joomla дает объявление в шапке для своих шаблонов:

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

Не знаю, работает ли это как-то так, как работает http_referer, но я отключил это, и сайт по-прежнему делает то же самое, нажимает стиль, страницу пустую, нажимает кнопку возврата и вуаля, стиль изменился но не удалось найти страницу, на которой я находился.

Есть идеи? Любая помощь может быть полезна.

Ответы [ 2 ]

1 голос
/ 24 августа 2009

Referer устанавливается только при нажатии на ссылку (а не при ее непосредственном вводе в адресной строке). Фактически, браузер сообщает сайту, где пользователь находился до перехода по этой ссылке, поэтому вы не можете доверять ему до 100% (см. Руководство по PHP ). Я бы сохранил последнюю посещенную страницу в $ _SESSION и перенаправил на нее; и если он пуст, перенаправьте на $ this-> baseurl. «/index.php'.

Базовый тег необходим только для относительных ссылок, например,

<a href="index.php">

или даже:

<a>

Еще один совет: прежде чем брать стиль из куки, проверьте, существует ли он (либо жестко закодируйте все доступные шаблоны, либо file_exists ()). Если нет, возьмите значение по умолчанию (красный).

0 голосов
/ 27 августа 2009

Я решил эту проблему ... в решениях было исправлено от трех до четырех ошибок:

во-первых, средство проверки файлов cookie в html должно было спросить, не был ли куки пустым, нет, если он был 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 запрашивал идентификатор в заголовке для изменения. Я не понял, что у меня нет идентификатора в объявлении таблицы стилей ссылки

<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 я допустил фатальную ошибку. Я не изменил идентификатор контейнера тега, который собирался перехватить плагин. Это было частично из-за путаницы между идентификатором в заголовке таблицы стилей и идентификатором в контейнере тегов. Поэтому я использовал "#tselect" для ID DIV, и это решило работу 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, я использовал совет, который кто-то сказал мне о куки:

<?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']);
?>

Вы заметили? простой / слэш.

Теперь все работает нормально. Changer меняет стили и работает с эффектами JQuery. Вы можете увидеть это здесь: текст ссылки

Если кому-то нужны файлы и объяснения, отправьте мне сообщение.

...