Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реорганизация кода, чтобы Header("Location работал, ... чтобы отказаться от JS редиректа 
V
    Опции темы
linuxoid
Дата 7.6.2010, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 17.4.2005

Репутация: нет
Всего: нет



Здравствуйте друзья. У меня такой вопрос:


Сейчас я делаю так (Вы поймете о чем я, из кода):

index.php


Код

<!DOCTYPE...
...
<body>
    <?php
        if($item == 100)
        {
            echo displayProducts();
        }
    ?>
</body>
...



functions.php

Код

function displayProducts()
{
    $logged_in = checkIfLoggedIn();
    
    if(!$logged_in)
    {
        // redirekt... no toljko s pomowju JavaScript (t.k. eta funkcija vizivaetsa v index.php i Header("Location:... dast error, t.k. uze vivedena castj HTML'a)
    }
    
    // funkcional ... napolnaem $content
  return $content
}



В данном случае, если $logged_in === true, то все ОК, но если нужно перебросить пользователя на login.php, то нужно делать редирект. Так вот мой вопрос такой: как организовать код таким образом, чтобы было удобно и грамотно, т.е. чтобы я смог использовать Header("Location:...

Еще одна сомнительная схема, которую я использую (из за удобства - все в 1й функции), но из за этого не могу применять (точнее могу с помощью ob_start(), ob_end_flush(), но это уже другая история) Header("Location:... . 

Код

function displayForm()
{
    if(!empty($_POST["process_form"])
    {
        // obrabotka polzovatelskih dannih
        // vstavka v bazu
        // redirekt na druguju stranicu, esli vsjo prowlo uspewno.. toze toljko JS redirect, t.k. uze viveli castj HTML
    }
    
    // funkcional ... napolnaem $content
    $content = '';
    $content .=
    '<table cellpadding="0" cellspacing="0" border="0">
        <form name="test" action="" method="post">
        <input type="hidden" name="process_form" value="1" />
        <tr>
            <td></td>
        </tr>
        </form>
    </table>';
  return $content;
}



Я так понимаю, что ответ заключается в изменении action="" на выделенный файл, который обрабатывает форму? К примеру action="process_from.php". Тогда оттуда уже можно будет сделать Header("Location.... А если возникли ошибки и мне надо снова вывести форму с уже введенными значениями и как бы снова запустить этот круг?

Это сообщение отредактировал(а) linuxoid - 7.6.2010, 22:44
PM MAIL   Вверх
bars80080
Дата 7.6.2010, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



вопросы с редиректом решаются всегда очень просто. код, который отвечает за редирект выносится до первого вывода (до всяких <!DOCTYPE...)
PM MAIL WWW   Вверх
linuxoid
Дата 7.6.2010, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 17.4.2005

Репутация: нет
Всего: нет



В том то вся и проблема. У меня сама концепция кода такая, что идет главный index.php. В нем в зависимости от $item'a вызываются различные функции. В любой из этих функций (если есть форма или проверки какие-то) есть условие, при выполнении которого (к примеру $_POST["process_form"]) происходит проверка формы, затем вставка в базу, затем редирект. Вот тут и происходит неизбежное. Т.к. изначально функция была вызвана из index.php, то часть HTML'a всегда выводится вне зависимости от того, что там идет дальше (т.е. форма хочет сделать редирект к примеру). Поэтому я и спрашиваю, как бы по грамотнее все это реорганизовать, чтобы мухи отдельно, котлеты отдельно.
PM MAIL   Вверх
нуп
Дата 7.6.2010, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: нет
Всего: 33



Разбей хтмл на функции. Одна выводит верхнюю часть, вторая нижнюю, или как там тебе надо. А проверка на редирект будет первой, до вызова функций по отрисовке 
PM MAIL   Вверх
ksnk
Дата 7.6.2010, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



linuxoid, есть грязное решение этой проблемы. В начале файла нужно поставить 
Код

<?php 
  ob_start();
?>

тем самым весь текст, который выводится сервером будет задержан до окончания вывода.
Так что вызов header('location...' попадет именно в свою очередь.

А почему это решение грязное - будет ясно, когда все это хозяйство будет разростаться и отлаживаться...  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
linuxoid
Дата 8.6.2010, 00:12 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 17.4.2005

Репутация: нет
Всего: нет



Я уже думал о ob_start();, но чувствую, что это просто маскировка глобальной проблемы, которая как раз скрыта в самой организации кода. Хотя, честно говоря, различные разбиения на функции или вынос в отдельные файлы - тоже очень большая жертва в пользу работы header'a. Очень уж удобна моя схема, когда все дела в самой функции - и вывод, и обработка.

Может быть сделать как в паттерне MVC? По моему там как раз то решение, которое медленно, но верно назревает у меня. 

В общем сомнения такие 

- сейчас все супер удобно. Все функции находятся в functions.php и являются полностью самодостаточными. Проблема - нельзя использовать header("Location... как полагается. 
- Другой вариант - переделать всю работу (на что уйдет много времени) и действительно распределить либо как предложил нуп (что по моему не очень удачно, т.к. для одной задачи нужно будет использовать как минимум 2 функции - одна над HTML, другая выводит HTML - хотя в целом это тоже простой вариант) 
- или сделать обработку вообще в других файлах (как MVC шаблон).


PM MAIL   Вверх
MoLeX
Дата 8.6.2010, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



ksnk, ну не совсем грязное. если есть еще и кэширование то способ себя оправдывает на все 100


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
IgorIV
Дата 8.6.2010, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 7.9.2009

Репутация: 2
Всего: 8



Код

<?php
        if($item == 100)
        {
             $ds = displayProducts();
        }
?>
<!DOCTYPE...
...
<body>
             <?=$ds;?>
</body>

До первого вывода определяем что надо делать.
Все супер удобно, но есть проблема smile Проблема из-за неправильной организации.
PM MAIL   Вверх
linuxoid
Дата 8.6.2010, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 17.4.2005

Репутация: нет
Всего: нет



IgorIV thx, думаю это самое удачное решение в моем случае + не так много переделывать.

В общем вывод такой:

- либо использовать ob_start(), ob_end_flush() и оставить все на своих местах
- либо более предпочтительный вариант (что я и сделаю), тоже с минимальными потерями.

Код

<?php
        if($item == 100)
        {
             $ds = displayProducts();
        }
?>
<!DOCTYPE...
...
<body>
             <?php echo $ds;?>
</body>

PM MAIL   Вверх
bars80080
Дата 8.6.2010, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(linuxoid @  8.6.2010,  08:56 Найти цитируемый пост)
это самое удачное решение в моем случае + не так много переделывать.

это и есть вообще-то вынос кода наверх
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0846 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.