За последние 24 часа нас посетили 25457 программистов и 1730 роботов. Сейчас ищут 824 программиста ...

Форма входа - обработка в class() + Json ответ

Тема в разделе "PHP для новичков", создана пользователем q0b3rMAN, 6 ноя 2017.

  1. q0b3rMAN

    q0b3rMAN Активный пользователь

    С нами с:
    11 июн 2011
    Сообщения:
    142
    Симпатии:
    0
    Здрасте.
    Есть MVC приложение. Есть форма входа, скажем по адресу localhost/app/login.
    Выглядит она так:
    HTML:
    1. <form method="post">
    2. <input type="text" name="login">
    3. <input type="text" name="password">
    4. <input type="submit" value="authme"/>
    5. </form>
    Есть класс , выглядит так
    Код (Text):
    1. <?php
    2. // контроллер приложения
    3. class AppController extends Controller {
    4.     // авторизация
    5.     public function login() {
    6.         if (isset ($_POST['login'])  && isset ($_POST['password'])) {
    7.  
    8.         }
    9.     }  
    10.  
    11.     public function __construct ($data = array()) {
    12.         parent::__construct($data);
    13.         $this->model = new User(); // создать модель пользователя
    14.     }          
    15. }
    16. ?>
    Соответственно отправляя $_POST, я могу обрабатывать данные и давать любой ответ через echo.
    Меня интересует ответ в JSON формате, чтобы я мог отправлять форму и обрабатывать ее "на лету" без обновления страницы, получать ответ в формате JSON. Например интересует чтобы я мог давать ответ в PHP через ( echo json_encode(array('result' => 'error'));) и выводить его на экран пользователю.
    Надеюсь понятно объяснил, подскажите, пожалуйста. Лучше дайте рабочий пример, или скажите что читать/изучать.
    У меня есть пример с отправкой формы из вне, на обработчик
    Код (Text):
    1.  $.ajax({
    2.             type: 'POST',
    3.             cache: false,
    4.             dataType: 'json',
    5.             url: '<?php echo $gl['dir']; ?>public/login.php',
    6.             data: jQuery("#"+form).serialize(),
    7.             success: function(data) {
    это мне не подходит, так как я хочу передать данные в класс, а не на внешний файл.
    Заранее спасибо за помощь.
     
  2. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    В url после двоеточия напиши свой URN, на который будет отправляться JSON данные.
    В функции принимаем данные, распарсиваем (json_decode), делаем что требуется, и делаем echo json_encode('result' => 'error').
    В ajax-е в success: function(data) { var data = JSON.parse(data); alert(data) }

    Что значит не на внешний файл, а в класс? Ведь класс находится в файле.
     
    #2 виталий032, 6 ноя 2017
    Последнее редактирование: 6 ноя 2017
  3. q0b3rMAN

    q0b3rMAN Активный пользователь

    С нами с:
    11 июн 2011
    Сообщения:
    142
    Симпатии:
    0
    Я заменил кнопку в форме на:
    Код (Text):
    1.  <a onclick="login('login');" class="c-btn c-btn--info c-btn--fullwidth">Войти</a>
    Вставил внизу JS такого плана:
    Код (Text):
    1.         <script type="text/javascript">
    2.         function login(form) {
    3.             $.ajax({
    4.             type: 'POST',
    5.             cache: false,
    6.             dataType: 'json',
    7.             url: '/app/login',
    8.             data: jQuery("#"+form).serialize(),
    9.             success: function(data) {
    10.                 if(data.result == "err") {
    11.                     alert ('ok post error');
    12.                 }                                                                                                
    13.             }
    14.             });
    15.         }
    16.         </script>
    В классе, я соответственно добавил:
    Код (Text):
    1.     // авторизация
    2.     public function login() {
    3.         echo json_encode(array('result' => 'err'));
    4.     }    
    При открытии страницы сразу выводит в body:
    {"result":"err"}

    * не на внешний файл имеется ввиду, что на прямую к классу обращаться не имеется возможным, я имею ввиду к файлу класса, где он у меня лежит url: '/classes/app.controllers.php',
    =) тяжело объяснить
     
  4. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Так вопрос какой?
     
  5. q0b3rMAN

    q0b3rMAN Активный пользователь

    С нами с:
    11 июн 2011
    Сообщения:
    142
    Симпатии:
    0
    Ответ не приходит я же объясняю.
    При открытии страницы сразу выводит в body (на страницу):
    {"result":"err"}
    Причем выводит даже не после нажатия кнопки, а просто при открытии страницы

    А должен обработать JS, речь идет об этом куске когда
    Код (Text):
    1.  success: function(data) {
    2.                 if(data.result == "err") {
    3.                     alert ('ok post error');
    4.                 }                                                                                          
    5.             }
    Необходимо так: Я нажал кнопку => форма ушла => в function login обработалось, отправился ответ (в формате json_encode), js принял и выдал ответ например в alert()

    Почему сразу выводит {"result":"err"}, я прекрасно понимаю, вот и заключается вопрос в том, как реализовать отправку формы и обработку.
     
  6. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    При открытии страницы первоначально у вас cрабатывает функция login() из php. так?
     
  7. q0b3rMAN

    q0b3rMAN Активный пользователь

    С нами с:
    11 июн 2011
    Сообщения:
    142
    Симпатии:
    0
    Да
     
  8. q0b3rMAN

    q0b3rMAN Активный пользователь

    С нами с:
    11 июн 2011
    Сообщения:
    142
    Симпатии:
    0
    Что никто не знает? :) помогите!
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Тебе просто надо в твоём методе login поставить условие - пришёл post запрос. пытаемся логиниться, пришёл get-запрос выводим форму. Очевидно же, что если ты сразу выводишь json, то там будет сразу выводиться json. Машина делает ровно то, что её просят
     
  10. q0b3rMAN

    q0b3rMAN Активный пользователь

    С нами с:
    11 июн 2011
    Сообщения:
    142
    Симпатии:
    0
    [​IMG]
    --- Добавлено ---
    Код (Text):
    1.     // авторизация
    2.     public function login() {
    3.         if (isset($_POST['login'])) {
    4.                echo json_encode(array('result' => 'err'));
    5.         }
    6.     }  
    --- Добавлено ---
    Код (Text):
    1.         <script type="text/javascript">
    2.         function login(form) {
    3.             $.ajax({
    4.             type: 'POST',
    5.             cache: false,
    6.             dataType: 'json',
    7.             url: '/app/login',
    8.             data: jQuery("#"+form).serialize(),
    9.             success: function(data) {
    10.                 if(data.result == "err") {
    11.                     alert ('ok post error');
    12.                 }                                                                                                
    13.             }
    14.             });
    15.         }
    16.         </script>
    --- Добавлено ---
    Код (Text):
    1.         <div class="c-login">
    2.             <header class="c-login__head">
    3.                 <a class="c-login__brand" href="/<?=__('language')?>/app/login">
    4.                     <img src="<?=DS?>img/logo-login.svg" alt="Dashboard's Logo">
    5.                 </a>
    6.                 <h1 class="c-login__title"><?=__('login_form_title')?></h1>
    7.             </header>
    8.            
    9.             <form method="post" id="login" class="c-login__content">
    10.                 <div class="c-field u-mb-small">
    11.                     <label class="c-field__label" for="login"><?=__('login_form_input_login')?></label>
    12.                     <input class="c-input" type="text" name="login" id="login">
    13.                 </div>
    14.  
    15.                 <div class="c-field u-mb-small">
    16.                     <label class="c-field__label" for="password"><?=__('login_form_input_password')?></label>
    17.                     <input class="c-input" type="password" name="password" id="password">
    18.                 </div>
    19.  
    20.                 <a onclick="login('login');" class="c-btn c-btn--info c-btn--fullwidth"><?=__('login_form_input_submit')?></a>          
    21.  
    22.                 <span class="c-divider has-text c-divider--small u-mv-medium"><?=__('login_form_text_social')?></span>
    23.  
    24.                 <div class="c-login__social">
    25.                     <a class="c-login__social-icon u-bg-twitter" href="#!">
    26.                         <i class="fa fa-twitter"></i>
    27.                     </a>
    28.  
    29.                     <a class="c-login__social-icon u-bg-facebook" href="#!">
    30.                         <i class="fa fa-facebook"></i>
    31.                     </a>
    32.  
    33.                     <a class="c-login__social-icon u-bg-pinterest" href="#!">
    34.                         <i class="fa fa-pinterest"></i>
    35.                     </a>
    36.  
    37.                     <a class="c-login__social-icon u-bg-dribbble" href="#!">
    38.                         <i class="fa fa-dribbble"></i>
    39.                     </a>
    40.                 </div>
    41.                 <br/>
    42.                  
    43.             </form>
    44.             <footer class="c-login__footer">
    45.             <center>
    46.                 <a class="c-login__footer-link" href="/ru/app/login">Русский</a>
    47.                 <span class="c-login__footer-link">/</span>
    48.                 <a class="c-login__footer-link" href="/en/app/login">English</a>                          
    49.             </footer>
    50.         </div>
     
  11. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Пример:
    HTML:
    1. <!-- index.php -->
    2. <!DOCTYPE html>
    3. <html lang="en">
    4.     <meta charset="UTF-8">
    5.     <title>Your site</title>
    6.     <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    7. </head>
    8.     <form id="loginForm" action="index.php" >
    9.         <label for="username">Username</label>
    10.         <input type="text" name="username"><br>
    11.  
    12.         <label for="pwd">Password</label>
    13.         <input type="text" name="pwd">
    14.     </form>
    15.  
    16.     <a href="#" onclick="login('loginForm')">Send</a>
    17.  
    18.     <script type="text/javascript">
    19.         function login(form) {
    20.             $.ajax({
    21.                 type: 'POST',
    22.                 cache: false,
    23.                 dataType: 'json',
    24.                 url: 'do.php',
    25.                 data: jQuery("#"+form).serialize(),
    26.                 success: function(data)
    27.                 {
    28.                     if(data.result)
    29.                     {
    30.                         alert ('ok post error');
    31.                     }
    32.  
    33.                     if(data.user)
    34.                     {
    35.                         alert(data.user + ' - ' + data.password);
    36.                     }                                                                                            
    37.                 }
    38.             });
    39.         }
    40.     </script>
    41. </body>
    42. </html>
    PHP:
    1. <?php
    2.     // do.php
    3.     function login($username, $pwd)
    4.     {
    5.         echo json_encode(array('user' => $username, 'password' => $pwd));
    6.         exit();
    7.     }
    8.  
    9.     if($_SERVER['REQUEST_METHOD'] == 'POST')
    10.     {
    11.         login($_POST['username'], $_POST['pwd']);
    12.     }
    13.  
    14.     echo json_encode(array('result' => 'err'));
    15. ?>
    Если ввести имя пользователя и пароль, то выведется логин и пароль. Если перейти на do.php через адресную строку, то будет вывод json данных.
     
  12. q0b3rMAN

    q0b3rMAN Активный пользователь

    С нами с:
    11 июн 2011
    Сообщения:
    142
    Симпатии:
    0
    Вы опять меня не слышите :)
    у меня нету никакого do.php и не будет, я уже пытался объяснить что "внешние" файлы / обработчики мне не подходят
    у меня есть контроллер под названием app
    в нем есть метод login
    мне надо дать ответ в этом методе в мою форму входа которая расположена по адресу app/login

    [​IMG]
     
  13. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Мой пример, просто пример, который можно доработать под ваши нужды. Вместо do.php впишите ссылку. Куда-то запрос всё равно нужно послать, чтобы передать значения полей формы.

    PHP:
    1. function login()
    2.     {
    3.         if($_SERVER['REQUEST_METHOD'] == 'POST')
    4.         {
    5.             echo json_encode(array('user' => '', 'password' => ''));
    6.         }
    7.         else
    8.         {
    9.             // отображение вида с формой ввода и пароля
    10.         }
    11.     }
     
    #13 виталий032, 6 ноя 2017
    Последнее редактирование: 6 ноя 2017
  14. q0b3rMAN

    q0b3rMAN Активный пользователь

    С нами с:
    11 июн 2011
    Сообщения:
    142
    Симпатии:
    0
    json_encode выводится в html
    Ваш пример мне не подходит, или я просто не понимаю как лучше организовать.
    У меня шаблонизация (представления и тд) - MVC все-же.
    выводить в методе форму, точно не предоставляется возможным.
    единственное, я могу в методе обрабатывать обычные post запросы, но мне интересен исключительно ajax (json)
    этот вопрос, json в ооп достаточно известен, но ответов пояснительных почти нет, по крайне мере это мои результаты поисков
     
  15. q0b3rMAN

    q0b3rMAN Активный пользователь

    С нами с:
    11 июн 2011
    Сообщения:
    142
    Симпатии:
    0
    Help me please, уже вынес JS код в отдельный файл, безполезно​
     
  16. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Сформулируйте вопрос.
     
  17. q0b3rMAN

    q0b3rMAN Активный пользователь

    С нами с:
    11 июн 2011
    Сообщения:
    142
    Симпатии:
    0
    Хорошо. Еще раз.

    1. Есть MVC приложение, соответственно с роутером, шаблонизатором и тд

    2. Есть форма авторизации расположенная по адресу /app/login (шаблон в формате .tpl)

    3. Есть соответственно контроллер и метод для данной формы

    Задача:
    Необходимо отправить данные с формы с помощью AJAX (JSON), обработать в PHP и дать ответ клиенту

    Проблема:
    Обработать данные предоставляется возможным только в методе function public login ()
    Никаких отдельных страниц по типу do.php и т.д. быть не может

    Соответственно, есть скрипт ajax (json) который отправляет форму на app/login и при попытке дать ответ в методе login таким способом
    Код (Text):
    1. if (isset($_POST['login'])) {
    2.             echo json_encode(array('result' => 'err'));
    3. }
    ничего не происходит
    либо если убрать проверку на наличие переменной $_POST
    и просто вывести json_encode
    он выводится на страницу обычным текстом
    тоесть json его не слушает
    --- Добавлено ---
    Вообщем вопрос снят.
    json не работает по неизвестным мне причинам.
    json_encode(); в php не работает. точнее, работает, но не отправляет как положено.

    использую dataType: 'html'

    спасибо за содействие.