Jump to content

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


Recommended Posts

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

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

 

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

 
Link to post
Share on other sites

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

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

Link to post
Share on other sites

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

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

 

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

Link to post
Share on other sites

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

Link to post
Share on other sites

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

 

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

Link to post
Share on other sites

менять ее нужно там если тема одна для пользователей. не понятно каким образом сделано у ТС. если делать возможность смены тем для пользователей, менять ее в $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 больше года никак не мог понять, что предлагавшееся решение совсем неверное...

Link to post
Share on other sites

Менять тему для пользователей через 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'];
Edited by Andrey Terkin
Link to post
Share on other sites

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

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

 

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

Edited by Kors
Link to post
Share on other sites
  • 1 year later...

 

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

 

В 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'];

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

Link to post
Share on other sites

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

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

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

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

Link to post
Share on other sites

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

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

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

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

Link to post
Share on other sites

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

 

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

Link to post
Share on other sites

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

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

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

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

 

if (isset($_GET['theme']))
{
    setcookie(ставите свою куку);
    // переадресовываем на текущий адрес без параметра theme
    header('Location:' . $view->request->url(array('theme'=>null)));
    exit;
}
Link to post
Share on other sites

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

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

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

действия.

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

Link to post
Share on other sites

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

Link to post
Share on other sites

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

 

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

Link to post
Share on other sites

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

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

if (isset($_GET['theme'])) {
	$_SESSION['theme'] = $_GET['theme'];
	header('Location:' . $view->request->url(array('theme'=>null)));
    	exit;
	}
Link to post
Share on other sites

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

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

Edited by Andrey Terkin
Link to post
Share on other sites

Для перключения мобильный/стандартный шаблон я делал так.
В классе 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');
Edited by Andrey Terkin
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...