Здрасте. Есть MVC приложение. Есть форма входа, скажем по адресу localhost/app/login. Выглядит она так: HTML: <form method="post"> <input type="text" name="login"> <input type="text" name="password"> <input type="submit" value="authme"/> </form> Есть класс , выглядит так Код (Text): <?php // контроллер приложения class AppController extends Controller { // авторизация public function login() { if (isset ($_POST['login']) && isset ($_POST['password'])) { } } public function __construct ($data = array()) { parent::__construct($data); $this->model = new User(); // создать модель пользователя } } ?> Соответственно отправляя $_POST, я могу обрабатывать данные и давать любой ответ через echo. Меня интересует ответ в JSON формате, чтобы я мог отправлять форму и обрабатывать ее "на лету" без обновления страницы, получать ответ в формате JSON. Например интересует чтобы я мог давать ответ в PHP через ( echo json_encode(array('result' => 'error')) и выводить его на экран пользователю. Надеюсь понятно объяснил, подскажите, пожалуйста. Лучше дайте рабочий пример, или скажите что читать/изучать. У меня есть пример с отправкой формы из вне, на обработчик Код (Text): $.ajax({ type: 'POST', cache: false, dataType: 'json', url: '<?php echo $gl['dir']; ?>public/login.php', data: jQuery("#"+form).serialize(), success: function(data) { это мне не подходит, так как я хочу передать данные в класс, а не на внешний файл. Заранее спасибо за помощь.
В url после двоеточия напиши свой URN, на который будет отправляться JSON данные. В функции принимаем данные, распарсиваем (json_decode), делаем что требуется, и делаем echo json_encode('result' => 'error'). В ajax-е в success: function(data) { var data = JSON.parse(data); alert(data) } Что значит не на внешний файл, а в класс? Ведь класс находится в файле.
Я заменил кнопку в форме на: Код (Text): <a onclick="login('login');" class="c-btn c-btn--info c-btn--fullwidth">Войти</a> Вставил внизу JS такого плана: Код (Text): <script type="text/javascript"> function login(form) { $.ajax({ type: 'POST', cache: false, dataType: 'json', url: '/app/login', data: jQuery("#"+form).serialize(), success: function(data) { if(data.result == "err") { alert ('ok post error'); } } }); } </script> В классе, я соответственно добавил: Код (Text): // авторизация public function login() { echo json_encode(array('result' => 'err')); } При открытии страницы сразу выводит в body: {"result":"err"} * не на внешний файл имеется ввиду, что на прямую к классу обращаться не имеется возможным, я имею ввиду к файлу класса, где он у меня лежит url: '/classes/app.controllers.php', =) тяжело объяснить
Ответ не приходит я же объясняю. При открытии страницы сразу выводит в body (на страницу): {"result":"err"} Причем выводит даже не после нажатия кнопки, а просто при открытии страницы А должен обработать JS, речь идет об этом куске когда Код (Text): success: function(data) { if(data.result == "err") { alert ('ok post error'); } } Необходимо так: Я нажал кнопку => форма ушла => в function login обработалось, отправился ответ (в формате json_encode), js принял и выдал ответ например в alert() Почему сразу выводит {"result":"err"}, я прекрасно понимаю, вот и заключается вопрос в том, как реализовать отправку формы и обработку.
Тебе просто надо в твоём методе login поставить условие - пришёл post запрос. пытаемся логиниться, пришёл get-запрос выводим форму. Очевидно же, что если ты сразу выводишь json, то там будет сразу выводиться json. Машина делает ровно то, что её просят
--- Добавлено --- Код (Text): // авторизация public function login() { if (isset($_POST['login'])) { echo json_encode(array('result' => 'err')); } } --- Добавлено --- Код (Text): <script type="text/javascript"> function login(form) { $.ajax({ type: 'POST', cache: false, dataType: 'json', url: '/app/login', data: jQuery("#"+form).serialize(), success: function(data) { if(data.result == "err") { alert ('ok post error'); } } }); } </script> --- Добавлено --- Код (Text): <div class="c-login"> <header class="c-login__head"> <a class="c-login__brand" href="/<?=__('language')?>/app/login"> <img src="<?=DS?>img/logo-login.svg" alt="Dashboard's Logo"> </a> <h1 class="c-login__title"><?=__('login_form_title')?></h1> </header> <form method="post" id="login" class="c-login__content"> <div class="c-field u-mb-small"> <label class="c-field__label" for="login"><?=__('login_form_input_login')?></label> <input class="c-input" type="text" name="login" id="login"> </div> <div class="c-field u-mb-small"> <label class="c-field__label" for="password"><?=__('login_form_input_password')?></label> <input class="c-input" type="password" name="password" id="password"> </div> <a onclick="login('login');" class="c-btn c-btn--info c-btn--fullwidth"><?=__('login_form_input_submit')?></a> <span class="c-divider has-text c-divider--small u-mv-medium"><?=__('login_form_text_social')?></span> <div class="c-login__social"> <a class="c-login__social-icon u-bg-twitter" href="#!"> <i class="fa fa-twitter"></i> </a> <a class="c-login__social-icon u-bg-facebook" href="#!"> <i class="fa fa-facebook"></i> </a> <a class="c-login__social-icon u-bg-pinterest" href="#!"> <i class="fa fa-pinterest"></i> </a> <a class="c-login__social-icon u-bg-dribbble" href="#!"> <i class="fa fa-dribbble"></i> </a> </div> <br/> </form> <footer class="c-login__footer"> <center> <a class="c-login__footer-link" href="/ru/app/login">Русский</a> <span class="c-login__footer-link">/</span> <a class="c-login__footer-link" href="/en/app/login">English</a> </footer> </div>
Пример: HTML: <!-- index.php --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Your site</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> </head> <body> <form id="loginForm" action="index.php" > <label for="username">Username</label> <input type="text" name="username"><br> <label for="pwd">Password</label> <input type="text" name="pwd"> </form> <a href="#" onclick="login('loginForm')">Send</a> <script type="text/javascript"> function login(form) { $.ajax({ type: 'POST', cache: false, dataType: 'json', url: 'do.php', data: jQuery("#"+form).serialize(), success: function(data) { if(data.result) { alert ('ok post error'); } if(data.user) { alert(data.user + ' - ' + data.password); } } }); } </script> </body> </html> PHP: <?php // do.php function login($username, $pwd) { echo json_encode(array('user' => $username, 'password' => $pwd)); exit(); } if($_SERVER['REQUEST_METHOD'] == 'POST') { login($_POST['username'], $_POST['pwd']); } echo json_encode(array('result' => 'err')); ?> Если ввести имя пользователя и пароль, то выведется логин и пароль. Если перейти на do.php через адресную строку, то будет вывод json данных.
Вы опять меня не слышите у меня нету никакого do.php и не будет, я уже пытался объяснить что "внешние" файлы / обработчики мне не подходят у меня есть контроллер под названием app в нем есть метод login мне надо дать ответ в этом методе в мою форму входа которая расположена по адресу app/login
Мой пример, просто пример, который можно доработать под ваши нужды. Вместо do.php впишите ссылку. Куда-то запрос всё равно нужно послать, чтобы передать значения полей формы. PHP: function login() { if($_SERVER['REQUEST_METHOD'] == 'POST') { echo json_encode(array('user' => '', 'password' => '')); } else { // отображение вида с формой ввода и пароля } }
json_encode выводится в html Ваш пример мне не подходит, или я просто не понимаю как лучше организовать. У меня шаблонизация (представления и тд) - MVC все-же. выводить в методе форму, точно не предоставляется возможным. единственное, я могу в методе обрабатывать обычные post запросы, но мне интересен исключительно ajax (json) этот вопрос, json в ооп достаточно известен, но ответов пояснительных почти нет, по крайне мере это мои результаты поисков
Хорошо. Еще раз. 1. Есть MVC приложение, соответственно с роутером, шаблонизатором и тд 2. Есть форма авторизации расположенная по адресу /app/login (шаблон в формате .tpl) 3. Есть соответственно контроллер и метод для данной формы Задача: Необходимо отправить данные с формы с помощью AJAX (JSON), обработать в PHP и дать ответ клиенту Проблема: Обработать данные предоставляется возможным только в методе function public login () Никаких отдельных страниц по типу do.php и т.д. быть не может Соответственно, есть скрипт ajax (json) который отправляет форму на app/login и при попытке дать ответ в методе login таким способом Код (Text): if (isset($_POST['login'])) { echo json_encode(array('result' => 'err')); } ничего не происходит либо если убрать проверку на наличие переменной $_POST и просто вывести json_encode он выводится на страницу обычным текстом тоесть json его не слушает --- Добавлено --- Вообщем вопрос снят. json не работает по неизвестным мне причинам. json_encode(); в php не работает. точнее, работает, но не отправляет как положено. использую dataType: 'html' спасибо за содействие.