2015-06-03 5 views
-1

У меня есть фреймворк, и я думаю, что выполняю что-то вроде шаблона MVC: структура (модель) - индексная страница, которая управляет вводом (контроллером) и страницами представлений (которые включен внутри main.php/main html)перенаправление без перезагрузки всей страницы

Я много читал о структуре и логике, чтобы написать хорошее приложение. Я прочитал много комментариев, например: «Почему вы выводите что-либо, если все, что вы собираетесь делать, это попробовать и перенаправить пользователя на другую страницу?». Ну, ответ, самый распространенный случай: перенаправить после успешного входа пользователя в систему. Нужно ли мне что-то печатать? Конечно, вся главная страница с формой входа/сообщением. Как я должен сделать это перенаправление?

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

Я думал об использовании javascript для перенаправления, но также читал комментарии; «если вы пишете хороший код (следуя хорошей логике/structre), вам не нужно будет использовать хаки, такие как перенаправление javascript». Как это вообще возможно?

Поскольку php output_buffering не должен быть включен.

У меня есть output_buffering enabled, и я могу использовать заголовок (после вывода) без каких-либо проблем. Если я использую перенаправление javascript, вся страница перезагружается, но с использованием заголовка он просто загружает контент (содержимое представлений, которое включено в main.php).

Итак, как вы это делаете без output_buffering?

+0

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

ответ

2

Если вы хотите перенаправить на страницу успеха И передать сообщения - скажем, после успешного входа в систему - простое решение - использовать сеансы «flash», где вы храните сообщение в SESSION, а затем, используется, вы отбрасываете его. Для этого вам не нужно ничего болеть в выходном буфере.

Это очень простой пример, но должен дать вам суть этого.

login.php

if($login_successful) { 

    // put your message in the session 
    $_SESSION['message'] = 'Login Successful'; 

    // redirect to the success page 
    header('location: success.php'); 
} 

Success.php

<?php 
session_start(); 

// check if $_SESSION['message'] exists 
if(isset($_SESSION['message'])) { 

    // print the message 
    echo $_SESSION['message']; 

    // clear the session 
    $_SESSION['message'] = null; 
} 
+0

Но этот заголовок() даст ошибку: «Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлено ", не так ли? –

+0

Только если вы неправильно его закодировали. Я обрабатываю все формы в верхней части файла до выхода любого HTML. Таким образом, я могу делать свои переадресации и не иметь никаких выходных ошибок, например, то, что вы описываете. – timgavin

+0

Вы имеете в виду, прежде чем включать main.php, включить php, где должны быть все сообщения в форме? –

2

Похоже, вы путаете некоторые вещи здесь. То, о чем вы говорите, на самом деле два разных запроса. Либо пользователь хочет просмотреть главную страницу, либо он хочет войти в систему, используя эту форму на главной странице. В вашем index.php вы бы что-то вроде этого (псевдокод):

if (isLoginRequest) { 
    // user wants to log in 
    if(validateLogin($loginFormData)) { 
     redirect('successful'); 
    } else { 
     displayLoginError(); 
    } 
} else { 
    // user wants to view main page 
    echo main.html 
} 

Update, чтобы ответить на вопрос в комментариях: Лучшей альтернативой было бы оставить свой материал проверки формы в login.php и обратитесь к этому в вашей форме входа <form action="login.php" .... Затем в login.php вы бы что-то вроде этого:

if (loginSuccessful) { 
    redirect('success.php'); 
    // no need to call die() or whatever 
} else { 
    setFlashMessage('Login failed'); // set a flash message like timgavin described 
    redirect('index.php') 
    // also no die() or whatever 
} 

index.php затем отвечает для отображения главной страницы и, если оно установлено, что делает флэш-сообщение от неудачной попытки входа в систему.

+0

Конечно! Я переведу логин с login.php на index.php. И не нужно ли выходить() или die() после заголовка() правильно? –

+1

См. Мой обновленный ответ, надеюсь, что это поможет. – Roman

+0

Да, спасибо! Настройка моего почтового скрипта помогла мне найти мое желаемое решение. –

0

Простое решение: переместите скрипт входа в систему из login.php в другой файл (login_post.php). То же самое для других скриптов с использованием header() после вывода dom.(Нет необходимости менять вид действия = «»)

В index.php:

$url = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); 
//some more security checks like esc_url() (non-php function) 
if ($url == '/login') { 
    include('header_pages/login_post.php'); 
} 
// all these includes before including main.php 
// where views pages are included and the DOM output starts 

Поскольку заголовок() находится внутри почтового скрипта, не более заголовки уже отправлены ошибки (и output_buffering прочь, из курс).

же для выхода из системы страницы, которая в настоящее время включена в main.php

Благодаря другим ответы, они помогли мне найти это решение.

Смежные вопросы