dead eye Posted July 11, 2015 Report Share Posted July 11, 2015 Собственно нужна помощь в решении (платная) следующей ситуации.1. Сайт www.petxp.ru (с исходным "говношаблоном" - но переделанным2. 2а месяца все работало нормально.3. Два дня назад - начала возникать ошибка 5004. Причина - автоматическая смена шаблона на "шаблон "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 Кто может помочь разобраться с причиной и ее устранить. Или какие тут могут быть варианты Quote Link to post Share on other sites
mishanya Posted July 12, 2015 Report Share Posted July 12, 2015 ну это не автоматическая замена. кто-то делает запрос на смену шаблона через get параметр theme=DomStoreУ вас пользователи имеют возможность менять темы? Quote Link to post Share on other sites
dead eye Posted July 12, 2015 Author Report Share Posted July 12, 2015 Вообще не должны. Но судя по всему надо править Quote Link to post Share on other sites
mishanya Posted July 12, 2015 Report Share Posted July 12, 2015 (edited) Вообще не должны. Но судя по всему надо править прикрепите файл view/View.php, посмотрю Edited July 12, 2015 by mishanya Quote Link to post Share on other sites
Kosjak76 Posted July 12, 2015 Report Share Posted July 12, 2015 Я вчера смотрел файлы, следов смены шаблона не нашел.Мишаня, посмотри еще ты, может, найдешь ошибку Quote Link to post Share on other sites
Andrey Terkin Posted July 13, 2015 Report Share Posted July 13, 2015 А почему он должен меняться во View.php ?Логичнее его менять в Settings.php Quote Link to post Share on other sites
mishanya Posted July 13, 2015 Report Share Posted July 13, 2015 А почему он должен меняться во View.php ?Логичнее его менять в Settings.php поясните чем логичнее менять в апи настройках чем в вью контролере? даже если вы пропишите ф-ю в апи, ее всеровно нужно вызывать из контролера Quote Link to post Share on other sites
Andrey Terkin Posted July 13, 2015 Report Share Posted July 13, 2015 Ну наверное потому что обращаетесь вы к теме в как $this->settings->theme , соответственно и менять нужно ее там, что бы в дальнейшем не возникало недоразумений если кому то понадобится получить название темы из другого места Quote Link to post Share on other sites
mishanya Posted July 13, 2015 Report Share Posted July 13, 2015 Ну наверное потому что обращаетесь вы к теме в как $this->settings->theme , соответственно и менять нужно ее там, что бы в дальнейшем не возникало недоразумений если кому то понадобится получить название темы из другого места менять ее нужно там если тема одна для пользователей. не понятно каким образом сделано у ТС. если делать возможность смены тем для пользователей, менять ее в $this->settings->theme не очень хорошо будет Quote Link to post Share on other sites
Kors Posted July 13, 2015 Report Share Posted July 13, 2015 менять ее нужно там если тема одна для пользователей. не понятно каким образом сделано у ТС. если делать возможность смены тем для пользователей, менять ее в $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 больше года никак не мог понять, что предлагавшееся решение совсем неверное... Quote Link to post Share on other sites
Andrey Terkin Posted July 15, 2015 Report Share Posted July 15, 2015 (edited) Менять тему для пользователей через 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 July 15, 2015 by Andrey Terkin Quote Link to post Share on other sites
Kors Posted July 15, 2015 Report Share Posted July 15, 2015 (edited) Вы правы, спасибо за замечание.Я хотел сказать, что принципиально невозможно это сделать через simpla/SettingsAdmin.php. Моя неточность и невнимательность..Решение Ваше - простое и удобное, в теме, указанной #10, к подобному большие специалисты шли более года, и то, что там в конце концов получили, все равно хуже Вашего, как следует до конца не отработано, длинное и заумное... А мнение, что это надо делать во view/View.php - это повторение старых ошибок той темы... Edited July 15, 2015 by Kors Quote Link to post Share on other sites
makki Posted September 20, 2016 Report Share Posted September 20, 2016 А в чем для вас заключается невозможность? И почему , по вашему это очень не хорошо? В 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']; Все работает, но шаблон переключается не сразу, а только после следующего обновления страницы. Как сделать,чтобы шаблон переключался сразу? Quote Link to post Share on other sites
Kors Posted September 21, 2016 Report Share Posted September 21, 2016 Все работает, но шаблон переключается не сразу, а только после следующего обновления страницы. Как сделать,чтобы шаблон переключался сразу?Работает нормально и изменение шаблона проявляется сразу. Скорее всего, Вы делаете что-то по-иному. Иногда такая ошибка возникает, когда работают с $_COOKIE и немного не учитывают специфику... Quote Link to post Share on other sites
makki Posted September 21, 2016 Report Share Posted September 21, 2016 Работает нормально и изменение шаблона проявляется сразу.Скорее всего, Вы делаете что-то по-иному.Иногда такая ошибка возникает, когда работают с $_COOKIE и немного не учитывают специфику...Да, это и было в моем случае. Я работал через куки, но для сохранения значения использовал только setcookie, чего оказалось недостаточно, а надо было еще сохранить их через $_COOKIE['.....'] = .... Quote Link to post Share on other sites
Andrey Terkin Posted September 21, 2016 Report Share Posted September 21, 2016 Да, это и было в моем случае. Я работал через куки, но для сохранения значения использовал только setcookie, чего оказалось недостаточно, а надо было еще сохранить их через $_COOKIE['.....'] = .... По правильному нужно делать редирект а не переписывать системный массив. Quote Link to post Share on other sites
makki Posted September 21, 2016 Report Share Posted September 21, 2016 По правильному нужно делать редирект а не переписывать системный массив. Каким образом редирект сменяет шаблон, объясните пожалуйста. Quote Link to post Share on other sites
Andrey Terkin Posted September 21, 2016 Report Share Posted September 21, 2016 Каким образом редирект сменяет шаблон, объясните пожалуйста.Редирект не шаблон меняет, менять его нужно так как сделали, а куки становятся доступны после обновления страницы.Когда вы пишете setcookie в браузер отправляется заголовок с куками, а возврашается этот заголовок только при следующей загрузке страницы, то есть после установки кук нужно делать редирект.Сделать это лучше после инициализации обьекта $view в index.php следующим образом if (isset($_GET['theme'])) { setcookie(ставите свою куку); // переадресовываем на текущий адрес без параметра theme header('Location:' . $view->request->url(array('theme'=>null))); exit; } Quote Link to post Share on other sites
Andrey Terkin Posted September 21, 2016 Report Share Posted September 21, 2016 Cookie станут видимыми только после перезагрузки страницы, для которойони должны быть видны. Для проверки, правильно ли cookie установились,проверьте их при следующей загрузке страницы до истечения срока ихдействия. Источник http://php.net/manual/ru/function.setcookie.php Quote Link to post Share on other sites
makki Posted September 21, 2016 Report Share Posted September 21, 2016 Спасибо за подсказку. У меня еще стоит задача сменить автоматически на шаблон при заходе с мобильных устройств. Функция определения устройства есть, но где будет ее правильно разместить? В index.php не хочется ее пихать Quote Link to post Share on other sites
mishanya Posted September 21, 2016 Report Share Posted September 21, 2016 Спасибо за подсказку. У меня еще стоит задача сменить автоматически на шаблон при заходе с мобильных устройств. Функция определения устройства есть, но где будет ее правильно разместить? В index.php не хочется ее пихать ф-я определения моб. устройств уже есть в симпла. смотрите файл api/Design.php is_mobile_browser() только нужно ее публичной сделать. чтобы вызывать в view или где нужно Quote Link to post Share on other sites
makki Posted September 21, 2016 Report Share Posted September 21, 2016 Источник http://php.net/manual/ru/function.setcookie.phpС куками все понятно. А что если использовать сессии?В этом коде надо добавлять редирект вот так? Без него у меня меняется шаблон только после перезагрузки страницы. В мануале $_SESSION ничего не нашел по этому поводу. if (isset($_GET['theme'])) { $_SESSION['theme'] = $_GET['theme']; header('Location:' . $view->request->url(array('theme'=>null))); exit; } Quote Link to post Share on other sites
Andrey Terkin Posted September 21, 2016 Report Share Posted September 21, 2016 (edited) Для сессий редиректа не нужно, достаточно кода из этого сообщения http://forum.simplacms.ru/topic/10047-ошибка-500-автосмена-шаблона/?p=75867Но размешать его нужно до создания обьекта класса View , так как после этой строки класс Settings уже создает массив с настройками и тема берется из негоНо при помощи редиректа можно убрать гет переменную темы из адресной строки Edited September 21, 2016 by Andrey Terkin Quote Link to post Share on other sites
Andrey Terkin Posted September 21, 2016 Report Share Posted September 21, 2016 (edited) Для перключения мобильный/стандартный шаблон я делал так.В классе 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 September 22, 2016 by Andrey Terkin Quote Link to post Share on other sites
Andrey Terkin Posted September 21, 2016 Report Share Posted September 21, 2016 PS. Модераторам: Думаю эту тему можно перенести в готовые решения Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.