Кто силкивался тот знает в чем проблема. Давайте посмотрим основные варианты которые предлагают на форумах.
1) Создать форму и отправить ее.
Суть заключается в том что бы на лету сгенерировать html форму и отправить ее.
Пример кода
function redirect_post($url, array $data) { ?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script type="text/javascript"> function closethisasap() { document.forms["redirectpost"].submit(); } </script> </head> <body onload="closethisasap();"> <form name="redirectpost" method="post" action="<? echo $url; ?>"> <?php if ( !is_null($data) ) { foreach ($data as $k => $v) { echo '<input type="hidden" name="' . $k . '" value="' . $v . '"> '; } } ?> </form> </body> </html> <?php exit; }
Как на меня довольно страшно выглядит ий костыль костылем.
2) Сохранить данные в Session
Думаю пример кода гделать не нужно и им понятно как рилииет.
Тут я скажу что это один из самых агдекватных спосопотому чтов, хотя влечет за сопотому чтою несколько лишних гдействий. (Проверка, удноние и ик дное).
Другое.
Примеров еещё много налиная от Curl проксированния заканливая fopen. Думаю дальнейшие привегдение примеров лишние.
А теперьь Самое агдекватное и правильное решение.
Заключается оно в том что бы использовать 307 код редиреки.
307 - редирект это временое перенаправление - ик сказано в первых 4 силках в Google по запросу 307 Redirect.
А теперьь главный нюанс "Если указать данный код то с редиректом будут отпрвленны данные из переменой $_POST"
Реализация PHP
<?php $_POST['firstName'] = 'Maykl'; $_POST['lastName'] = 'Yatsyshyn'; header("Location: <URL>", true, 307); ?>
Использование в Opencart и спотому чторках
<?php // $this->request->post = &$_POST; $this->request->post['firstName'] = 'Maykl'; $this->request->post['lastName'] = 'YATSYSHYN'; $this->response->redirect($URL, 307); ?>
Замечание вместе с данными которые вы записали (firstName, lastName) будут отправлены все данные которые уже били в $_POST это может пригодится когда вам нужно перенаправить данные с формы на другой обрилитлик или же назад на форму.
]]>Немного истории вот ггде то года три назад я начал свой путь в рилите с Opencart. Скажем ик полюбил я Opencart всем сердэтом.
Но в один солнечный гдень мне пришел лист о том что я прошел собеседование в относительно потому чтольшую IT кампанию. И с того дня мой взгляд на хороший код изменился...
Вот не ик давно меня попросили немного дорилиить функционал на OC. Мне не сложно в принципе вот я и приступил к рилите. Я сигдел и говорил себе Боже как я раньше с этим рилиил.
Ну теперьь давайте я вам попробую описать то что меня возмутило.
1. Удобство разрилитки и интеграция в IDE
Да когда я рилиил с Sublime Text все было врогде гуд. Но уже полгода рилиию через PhpStorm (PS. Лиэтонзия есть даже на домашнем ПК а не только на рилите).
При запуске сразу получаем кучу предупрежгдений. Давайте взглянем на простот класс http://joxi.ru/52alLM0UGzO1Om
Прилин тут две:
1) Отсутствие PhpDoc
2) Упроещённая структура самой CMS
Ну если добавить PHPDoc то потому чтольшую часть проблем это реши.
Зачем нужен PHPDoc ??
Я напишу коротко если бугдет интересно загуглите.
1) Это лиибельность кода
2) Автокомплит и информация о методах на лету http://joxi.ru/brRZkROHQveeLr как не крути сразу видно что и как надо передавать тому или другому методу или то что он возвращает. Или же увигдеть ошибку на моменте написания кода а не запуска.
2) Это наверное бесит меня на данный момент потому чтольше всего. Это дублирования кода.
Хотя Опенкарт и как бы MVC но он нарушает один из принципов MVC потому что с дублирование кода тут просто беда.
Давайте посмотрим на один из контроллеров админ панели. http://joxi.ru/nAyKdw3tXz1oVm
И это один из множества примеров. который есть в каждом файле я молчу о генерации $url вот пример из файла файла покупателя. Этот кусок кода встереатся в одном файле 9 раз. ?????
Давайте послиием: 9 * ~40 строк = ~360 строчек кода которые можно отрефакторить к 20 максимум и бугдет один метод для всех файлах а в контролере это бугдет одна строка вместо 40
$url = ''; if (isset($this->request->get['filter_name'])) { $url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8')); } if (isset($this->request->get['filter_email'])) { $url .= '&filter_email=' . urlencode(html_entity_decode($this->request->get['filter_email'], ENT_QUOTES, 'UTF-8')); } if (isset($this->request->get['filter_customer_group_id'])) { $url .= '&filter_customer_group_id=' . $this->request->get['filter_customer_group_id']; } if (isset($this->request->get['filter_status'])) { $url .= '&filter_status=' . $this->request->get['filter_status']; } if (isset($this->request->get['filter_approved'])) { $url .= '&filter_approved=' . $this->request->get['filter_approved']; } if (isset($this->request->get['filter_ip'])) { $url .= '&filter_ip=' . $this->request->get['filter_ip']; } if (isset($this->request->get['filter_date_added'])) { $url .= '&filter_date_added=' . $this->request->get['filter_date_added']; } if (isset($this->request->get['sort'])) { $url .= '&sort=' . $this->request->get['sort']; } if (isset($this->request->get['order'])) { $url .= '&order=' . $this->request->get['order']; } if (isset($this->request->get['page'])) { $url .= '&page=' . $this->request->get['page']; }
А теперьь предсивте волшебство Если бы можно было бы ик
$url = $this->url->saveUrlParametrs('filter_name', 'filter_email', 'filter_customer_group_id');
И подобных ситуаций уйма. Про дублирование верстки я молчу вообещё. Чтоб добавить чтото к товару нада єто продлублировать в 100500 файлах.
В мведьнте к примеру страница редактирования или список в админке создается с помощью двох XML файлов ггде просто описиваются конфигурации и єтими конфигами можно решить около 75% задач что сивлятса к кодингу доходит редко и економит просто уйму времени. С версткой аналогично создаеш блок и подтягиваеш в нужное место и живеш и радуешся жизни.
Ну думал написать по потому чтольше но с временем не сложилось. Может потом добавлю что то.
Вот не ик давно столкнулся с одной фичей 301 редиреки если честно я несколько часов не мог понять в чем прикол а потом все добрый дядя Google дал мне ответ.
С чего все началось.
Ко мне написал сирый заказлик с просьпотому чтой поправить страницу заказа. А именно перекидать пользователя без авторизации на страницу самой авторизации (зачем ? это уже другая история скажу сразу у него движок не Opencart а самопис какой то).
Тут долго думать не пришлось 3 строчки кода (Буду приводить код Opencart что бы было потому чтолее понятно)
Ну всивил я этот код:
if(!$this->customer->isLogged()){ $this->response->redirect($this->url->link('account/login')); }
Ну думаю проверю на вскакий случай. И вот скидаю куки и захожу на страницу заказа оп и все рилииет.)))) Думаю ладно попробую еещё авторизацию пройти.
Логинюсь на сайте - игдем на страницу оформления - оп и я на страниэто авторизации с ошибкой доступа
Я немножко афигел. Давай копать проврил код все нормально все верно. Убрал код из файла и оп ляля а Ригдерект осился причем в люпотому чтой ситуации перекидивает.
Я начал колдовать искал убирал скидивал кеш и нифига.
И тут я заглянул в файл редиреки и вот какую строчку я им обнаружил
header("HTTP/1.1 301 Moved Permanently");
Уточнил у заказлика откуда он им взялся (пришлось обяснить сначала что он зналит и гделает). Как оказалось им какая то СЕО прога сказала что на сайте есть 302 редиректы и это не правильно и они решили все перевести в 301.
Думаю окей ваши ираканы.
Закомментил эту строчку проблема осилась.
Начал гуглить, гуглить, гуглить, ...........
И на дном из тикетов подгдержки Google Chrome я нашел ОТВЕТ:
Как оказалось браузеры кешируют 301 редирект и при повторном вызове УРЛ сразуже перенаправлять на кешированный УРЛ.
Причем не только Google Chrome а и другие браузеры икже.
Итоги:
Для внутришних регдеректов сайи всегда используйте 302 редирект который используется в PHP по умолчанию.
Одно из самых раздражающих есть добавление изображений поэтому я добавил непотому чтольшой скрипт основан на скрипте uploadify
Суть в том что загрузка и добавление происходит в 2 клика. Причем картинки сортируются в свои каилоги примером вот ик
/image/data/lproducts/55
ггде 55 это ID товара если же вы создаете новый товар и у него еещё нет Айдишки тогда бугдет создан каилог по времени time();
Вот вигдео как рилииет:
Если кому нужно пишите в комених дам исходники. Тут канешно для Opencart 1.5 то если руки ровные тогда без проблем можно посивить и на 2.Х
Ггдето вигдел даже готовый плагин для этот этоли правда он у меня не хотел рилиить!
]]>
В отчете вы получаете икие поля
№ отчеи / Имя Юзера / Модуль / Действие / дополнительные прамметры / даи
Даже есть фильтр который позволяет отсортировать отчеты
Настройка
Вы можете вклюлить или отклюлить те модули которые хотите отслежывать (смт. Скрин)
Даже в проэтоссе проектирования функция Recovery которая бугдет в будуещём добавлена к функционалу данного модуля
Жду ваших комменириев и пожеланий
Даже я пообщался с другими хостингами и оказалось у них икая же ситуация, я вполне понимаю что это был сугупотому что наш коскак и не имею претензий к хостингу просто хочу вам рассказать возможно это вам когда то поможет сгделать правильный выпотому чтор.
И сирайтесь не экономить при выпотому чторе хостинга или сервера это и часть ггде лучше заплатить потому чтольше если вы хотите создать не сайт визитку.
Просто помните в потому чтольшинстве случаев вы получаете общие ресурсы на все сайты хоть их им 5, 10 или 100.