Перейти к содержанию
Официальный форум поддержки Simpla

Ошибка 500 - автосмена шаблона


Рекомендуемые сообщения

Собственно нужна помощь в решении (платная) следующей ситуации.

1. Сайт www.petxp.ru (с исходным "говношаблоном" - но переделанным

2. 2а месяца все работало нормально.

3. Два дня  назад - начала возникать ошибка 500

4. Причина - автоматическая смена шаблона на "шаблон "domstore" - которого не было в папке.

5. Технический - создание шаблона с таким названием - решаем проблему - но был случай смены шаблона на шаблон вообще без названия

 

в логах - есть вот такие строки Line 74: [b.b][11/Jul/2015:00:04:11 +0300] 4.312 13.678 500 157.55.39.125 www.petxp.ru GET /brands/Royal_Canin/page_11/?page=11&sort=position&theme=DomStore HTTP/1.1 "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" "-" 400

 

Кто может помочь разобраться с причиной и ее устранить. Или какие тут могут быть варианты

 
Ссылка на сообщение
Поделиться на другие сайты

ну это не автоматическая замена. кто-то делает запрос на смену шаблона через get параметр theme=DomStore

У вас пользователи имеют возможность менять темы?

Ссылка на сообщение
Поделиться на другие сайты

Вообще не должны. Но судя по всему надо править

 

прикрепите файл view/View.php, посмотрю

Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

Я вчера смотрел файлы, следов смены шаблона не нашел.

Мишаня, посмотри еще ты, может, найдешь ошибку

Ссылка на сообщение
Поделиться на другие сайты

А почему он должен меняться во View.php ?

Логичнее его менять в Settings.php

 

поясните чем логичнее менять в апи настройках чем в вью контролере? даже если вы пропишите ф-ю в апи, ее всеровно нужно вызывать из контролера

Ссылка на сообщение
Поделиться на другие сайты

Ну наверное потому что обращаетесь вы к теме в как $this->settings->theme , соответственно и менять нужно ее там, что бы в дальнейшем не возникало недоразумений если кому то понадобится получить название темы из другого места

Ссылка на сообщение
Поделиться на другие сайты

Ну наверное потому что обращаетесь вы к теме в как $this->settings->theme , соответственно и менять нужно ее там, что бы в дальнейшем не возникало недоразумений если кому то понадобится получить название темы из другого места

 

менять ее нужно там если тема одна для пользователей. не понятно каким образом сделано у ТС. если делать возможность смены тем для пользователей, менять ее в $this->settings->theme не очень хорошо будет

Ссылка на сообщение
Поделиться на другие сайты

менять ее нужно там если тема одна для пользователей. не понятно каким образом сделано у ТС. если делать возможность смены тем для пользователей, менять ее в $this->settings->theme не очень хорошо будет

 

Менять тему для пользователей через Settings - не только "не очень хорошо", то даже "очень не хорошо" и принципиально невозможно. Но и менять просто так  через view/View.php  вряд ли выйдет.

Вообще вопрос совсем не так прост, как кажется. Осуждался довольно долго в теме

http://forum.simplacms.ru/topic/2368-%D1%81%D0%BC%D0%B5%D0%BD%D0%B0-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%BC-%D0%B4%D0%BB%D1%8F-%D0%BC%D0%B0%D0%B3%D0%B0%D0%B7%D0%B8%D0%BD%D0%BE%D0%B2-%D1%88%D0%B0%D0%B1/

Там даже Noxter больше года никак не мог понять, что предлагавшееся решение совсем неверное...

Ссылка на сообщение
Поделиться на другие сайты

Менять тему для пользователей через Settings - не только "не очень хорошо", то даже "очень не хорошо" и принципиально невозможно. Но и менять просто так  через view/View.php  вряд ли выйдет.

Вообще вопрос совсем не так прост, как кажется. Осуждался довольно долго в теме

http://forum.simplacms.ru/topic/2368-%D1%81%D0%BC%D0%B5%D0%BD%D0%B0-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%BC-%D0%B4%D0%BB%D1%8F-%D0%BC%D0%B0%D0%B3%D0%B0%D0%B7%D0%B8%D0%BD%D0%BE%D0%B2-%D1%88%D0%B0%D0%B1/

Там даже Noxter больше года никак не мог понять, что предлагавшееся решение совсем неверное...

А в чем для вас заключается невозможность? И почему , по вашему это очень не хорошо?

 

В index.php ловим гет запрос и помещаем его в сессию

if (isset($_GET['theme']))
    $_SESSION['theme'] = $_GET['theme'];

А в api/Settings.php в конструкторе подменяем значение темы в массиве

if (isset($_SESSION['theme']) && file_exists($this->config->root_dir . '/design/' . $_SESSION['theme']))
            $this->vars['theme'] = $_SESSION['theme'];
Изменено пользователем Andrey Terkin
Ссылка на сообщение
Поделиться на другие сайты

Вы правы, спасибо за замечание.
Я хотел сказать, что принципиально невозможно это сделать через simpla/SettingsAdmin.php. Моя неточность и невнимательность..

Решение Ваше - простое и удобное, в теме, указанной #10, к подобному большие специалисты шли более года, и то, что там в конце концов получили, все равно хуже Вашего, как следует до конца не отработано, длинное и заумное...

 

А мнение, что это надо делать во view/View.php - это повторение старых ошибок той темы...

Изменено пользователем Kors
Ссылка на сообщение
Поделиться на другие сайты
  • 1 год спустя...

 

А в чем для вас заключается невозможность? И почему , по вашему это очень не хорошо?

 

В index.php ловим гет запрос и помещаем его в сессию

if (isset($_GET['theme']))
    $_SESSION['theme'] = $_GET['theme'];

А в api/Settings.php в конструкторе подменяем значение темы в массиве

if (isset($_SESSION['theme']) && file_exists($this->config->root_dir . '/design/' . $_SESSION['theme']))
            $this->vars['theme'] = $_SESSION['theme'];

 Все работает, но шаблон переключается не сразу, а только после следующего обновления страницы. Как сделать,чтобы шаблон переключался сразу?

Ссылка на сообщение
Поделиться на другие сайты

Все работает, но шаблон переключается не сразу, а только после следующего обновления страницы. Как сделать,чтобы шаблон переключался сразу?

Работает нормально и изменение шаблона проявляется сразу.

Скорее всего, Вы делаете что-то по-иному.

Иногда такая ошибка возникает, когда работают с $_COOKIE и немного не учитывают специфику...

Ссылка на сообщение
Поделиться на другие сайты

Работает нормально и изменение шаблона проявляется сразу.

Скорее всего, Вы делаете что-то по-иному.

Иногда такая ошибка возникает, когда работают с $_COOKIE и немного не учитывают специфику...

Да, это и было в моем случае. Я работал через куки, но для сохранения значения использовал только setcookie, чего оказалось недостаточно, а надо было еще сохранить их через $_COOKIE['.....'] = ....

Ссылка на сообщение
Поделиться на другие сайты

Да, это и было в моем случае. Я работал через куки, но для сохранения значения использовал только setcookie, чего оказалось недостаточно, а надо было еще сохранить их через $_COOKIE['.....'] = ....

 

По правильному нужно делать редирект а не переписывать системный массив.

Ссылка на сообщение
Поделиться на другие сайты

По правильному нужно делать редирект а не переписывать системный массив.

 

Каким образом редирект сменяет шаблон, объясните пожалуйста.

Ссылка на сообщение
Поделиться на другие сайты

Каким образом редирект сменяет шаблон, объясните пожалуйста.

Редирект не шаблон  меняет, менять его нужно так как сделали, а куки становятся доступны после обновления страницы.

Когда вы пишете setcookie  в браузер отправляется заголовок с куками, а возврашается этот заголовок только при следующей загрузке страницы, то есть после установки кук нужно делать редирект.

Сделать это лучше после инициализации обьекта $view в index.php следующим образом

 

if (isset($_GET['theme']))
{
    setcookie(ставите свою куку);
    // переадресовываем на текущий адрес без параметра theme
    header('Location:' . $view->request->url(array('theme'=>null)));
    exit;
}
Ссылка на сообщение
Поделиться на другие сайты

Cookie станут видимыми только после перезагрузки страницы, для которой

они должны быть видны. Для проверки, правильно ли cookie установились,

проверьте их при следующей загрузке страницы до истечения срока их

действия.

Источник http://php.net/manual/ru/function.setcookie.php

Ссылка на сообщение
Поделиться на другие сайты

Спасибо за подсказку. У меня еще стоит задача сменить автоматически на шаблон при заходе с мобильных устройств. Функция определения устройства есть, но где будет ее правильно разместить? В index.php не хочется ее пихать

Ссылка на сообщение
Поделиться на другие сайты

Спасибо за подсказку. У меня еще стоит задача сменить автоматически на шаблон при заходе с мобильных устройств. Функция определения устройства есть, но где будет ее правильно разместить? В index.php не хочется ее пихать

 

ф-я определения моб. устройств уже есть в симпла. смотрите файл api/Design.php is_mobile_browser() только нужно ее публичной сделать. чтобы вызывать в view или где нужно

Ссылка на сообщение
Поделиться на другие сайты

С куками все понятно. А что если использовать сессии?

В этом коде надо добавлять редирект вот так? Без него у меня меняется шаблон только после перезагрузки страницы. В мануале $_SESSION ничего не нашел по этому поводу.

if (isset($_GET['theme'])) {
	$_SESSION['theme'] = $_GET['theme'];
	header('Location:' . $view->request->url(array('theme'=>null)));
    	exit;
	}
Ссылка на сообщение
Поделиться на другие сайты

Для сессий редиректа не нужно, достаточно кода из этого сообщения http://forum.simplacms.ru/topic/10047-ошибка-500-автосмена-шаблона/?p=75867

Но размешать его нужно до создания обьекта класса View , так как после этой строки класс Settings уже создает массив с настройками и тема берется из него
Но при помощи редиректа можно убрать гет переменную темы из адресной строки
 

Изменено пользователем Andrey Terkin
Ссылка на сообщение
Поделиться на другие сайты

Для перключения мобильный/стандартный шаблон я делал так.
В классе Settings я добавил новый метод is_mobile , так как тот который есть в классе Design по умолчанию уже устарел и много устройств не определяет, а так же этот класс инициализируется после Settings.
Мой новый метод выглядел так


    public function is_mobile()
    {
        $useragent=$_SERVER['HTTP_USER_AGENT'];
        if(preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i',$useragent)||preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i',substr($useragent,0,4)))
        return true;

    }

Так же добавил в этот класс два поля

    private $mobile_theme = 'name_mobile_theme';
    private $desktop_theme = 'name_standart_theme';

И в конструкторе этого класса в конце подменял переменную с шаблоном
 

        if (isset($_SESSION['template']) && $_SESSION['template'] == 'mobile')
            $this->vars['theme'] = $this->mobile_theme;
        elseif (empty($_SESSION['template']) && $this->is_mobile())
            $this->vars['theme'] = $this->mobile_theme;
        else
            $this->vars['theme'] = $this->desktop_theme;

А в index.php сделал следуюшим образом

$view = new IndexView();

if (isset($_GET['template'])) {
    $_SESSION['template'] = $_GET['template'] == 'mobile' ? 'mobile' : 'desktop';
    header('Location:' . $view->request->url(array('template'=>null)));
    exit;
}


И таким образом получается, что если пользователь первый раз заходит на сайт, то проверяется зашел он с моб устройства или нет, в зависимости от этого выбирается нужная тема и записывается в сессию, так же на страницах есть ссылка для перехода мобильная/стандартная версии сайта.

 


Также при таком методе нужно прописать еще мета теги, для того что бы поисковики корректно обрабатывали обе версии сайта. Какие именно метатеги посмотрите в гугле

 

Не метатеги а я отправляю заголовок тоже в index.php после заголовка Content-type
Статья на гугле с описанием
https://developers.google.com/webmasters/mobile-sites/mobile-seo/dynamic-serving

header('Vary: Accept-Encoding, User-Agent');
Изменено пользователем Andrey Terkin
Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...