С потолка Из чего состоит строка запроса: ключ1=значение1&ключ2=значение2. На сервере, по определенному ключу, получаем его значение из глобальной переменной $_GET, $_POST. Так и тут - можно передать объект, а можно сразу строку data: 'some_key_1=some_val_1&some_key_2=some_val_2'. Я предпочитаю объект, т.к. подставлять переменные удобней. А имена ключей берете какие хотите. Замечтательно... Разве кто-то запрещает вызвать нужные функции? Ответ на Ajax-запрос отдаётся любым способом вывода: echo, print, exit(), var_dump() и т.д. или return, если функция/метод класса. Ну, в метод eventCalendar передается объект с различными опциями. Смысл мне копипастить их все, когда речь шла только про один параметр. Вот, весь код: Спойлер: function initCalendar Код (Javascript): function initCalendar(data) { $('#eventCalendar').eventCalendar({ jsonData: data, startWeekOnMonday: true, /*если труе будет правильно дни недели*/ openEventInNewWindow: true, dateFormat: 'dddd DD-MM-YYYY', showDescription: false, locales: { locale: "ru", txt_noEvents: "Нет запланированных событий", txt_SpecificEvents_prev: "", txt_SpecificEvents_after: "события:", txt_NextEvents: "Следующие события:", txt_GoToEventUrl: "", /*url адрес*/ moment: { "months": ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" ], "monthsShort": ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек" ], "weekdays": ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота" ], "weekdaysShort": ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб" ], "weekdaysMin": ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб" ] } } }); }
На счет этого я уже и сам догадался) а вот по поводу ajax обратится к файлу а потом нужно как то обратится к определенной функции, какие есть варианты?
Чисто схематически PHP: <?php function Multiplication($n) { return $n * 2; } function Addition($n, $m){ return $n + $m; } // Ждем какие-то числовые данные $number = filter_input(INPUT_GET, 'some_key_1', FILTER_VALIDATE_INT); if($number) { // вызвали одну функию $mult = Multiplication($number); // вызвали вторую $result = Addition($mult, 10); // ... если нужно - еще десяток функций вызываем } else { $result = false; } exit(json_encode($result)); // отдаем результат
Походу мы друг друга не поняли) это ты пишешь сейчас за php? А я спрашивал за js ajax как обратится к фалу к определенной функции)
Повторю свою изъезженную фразу: к Ajax-запросам, нужно относиться так же, как и к обычным ибо они принципиально ничем не отличаются. При обычном запросе, например, по ссылке или при отправке формы, как бы вы вызывали нужную функцию? Вот всё так же делаете и при Ajax-запросе. --- Добавлено --- Ок, давайте еще проще. Предположим, что была стандартная форма и обработчик на сервере, который принимал данные этой формы, записывал их в БД и генерировал страницу с сообщением об успешно выполненной операции. Если бы меня попросили перевести это на Ajax, то мне бы пришлось изменить только последнее действие, т.к. формировать страницу не нужно, а нужно только вернуть само сообщение о том, что операция выполнена. Всё остальное, если оно конечно по уму написано, мне даже трогать не пришлось бы.
ну например я бы вызвал бы так: PHP: function test1($p){ return $p = 3; } function test2($c){ return $c = 1; } $p = test1($i); $c = test2($o); echo $a = $p + $c; Как то так, но синтаксис разный же, не зная его не напишешь запрос.
Такой код отлично бы выполнил свою задачу. А синтаксис чего? Что-то я не понял. И прочтите, я дополнил предыдущий свой ответ.
Честное слово - я не телепат Вот тут у вас должен быть JS-код. В Ajax url: 'путь/к/файлу/function.php'. Тут у вас было три функции (теперь вроде бы две осталось), вызываете первую функцию $predmet = get_predmet();, потом вторую $events = get_events($predmet);, в $events, как я понимаю, сейчас уже JSON-строка. Возвращаем её: PHP: # вытягиваем наш предмет для определенного пользователя function get_predmet() { // код функции } # функция для календаря function get_events($predmet) { // код функции } $predmet = get_predmet(); $events = get_events($predmet); exit($events); // или, если $events - это еще массив, то exit(json_encode($events));
Допустим у меня так все сделано примерно кроме exit() да и путь я прописал к файлу верный и указал что это будет отправка POST запроса, но страница все ровно обновляется после нажатия на кнопку отправить.
P.S. Не забудьте в файл function.php перенести подключение файла 'config/db.php' --- Добавлено --- Это уже правильный вопрос. Необходимо отменять обычное действие события. Например, если у вас форма с ID = "my_form" и нужно отправить из неё данные Ajax-ом, то код может быть таким: Код (Javascript): $('#my_form').on('submit', function(e){ e.preventDefault(); // дальше код Ajax-запроса }); Если бы это была ссылка, например, с классом = "my_class" Код (Javascript): $('.my_class').on('click', function(e){ e.preventDefault(); // дальше код Ajax-запроса });
В итоге файл стал такого вида: Спойлер: calendar.php PHP: <?php session_start(); require_once 'functions.php'; # подключаем функции для календаря $predmet = get_predmet(); # Выводим список предметов $events = get_events($predmet); # Вывод календаря // exit(json_encode($events)); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Календарь событий</title> <link rel="stylesheet" href="css/eventCalendar.css"> <link rel="stylesheet" href="css/eventCalendar_theme_responsive.css"> <script src="http://code.jquery.com/jquery.min.js"></script> <script src="js/moment.js"></script> <script src="js/jquery.eventCalendar.js"></script> </head> <body> <div id="eventCalendar" style="width: 300px; margin: 100px auto;"></div> <script> $(function(){ var data = <?php echo $events; ?>; // console.log(JSON.parse(data)); $('#eventCalendar').eventCalendar({ jsonData: data, startWeekOnMonday: true, /*если труе будет правильно дни недели*/ openEventInNewWindow: true, dateFormat: 'dddd DD-MM-YYYY', showDescription: false, locales: { locale: "ru", txt_noEvents: "Нет запланированных событий", txt_SpecificEvents_prev: "", txt_SpecificEvents_after: "события:", txt_NextEvents: "Следующие события:", txt_GoToEventUrl: "", /*url адрес*/ moment: { "months" : [ "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" ], "monthsShort" : [ "Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек" ], "weekdays" : [ "Воскресенье", "Понедельник","Вторник", "Среда","Четверг","Пятница","Суббота" ], "weekdaysShort" : [ "Вс","Пн","Вт", "Ср","Чт","Пт","Сб" ], "weekdaysMin" : [ "Вс","Пн","Вт", "Ср","Чт","Пт","Сб" ] } } }); }); </script> <script> $.ajax({ // путь к обработчику на стороне сервера url: 'function.php', // метод передачи: GET, POST, etc type: 'POST', // важно указать тип, чтобы JSON-строка не преобразовывалась в объект dataType: 'text', // или html // если нужно в запросе передавать какие-то данные data: { some_key_1: <?php echo $predmet; ?>, // some_key_2: 'some_value_2', }, // в случае успешного завершения запроса, вызываем функцию инициализации календаря success: initCalendar; }); function initCalendar (data) { $('#eventCalendar').eventCalendar({ jsonData: data, startWeekOnMonday: true, /*стоит в true для правильного отображения дня недели*/ openEventInNewWindow: true, dateFormat: 'dddd DD-MM-YYYY', showDescription: false, locales: { locale: "ru", txt_noEvents: "Нет запланированных событий", txt_SpecificEvents_prev: "", txt_SpecificEvents_after: "события:", txt_NextEvents: "Следующие события:", txt_GoToEventUrl: "", /*url адрес*/ moment: { "months" : [ "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" ], "monthsShort" : [ "Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек" ], "weekdays" : [ "Воскресенье", "Понедельник","Вторник", "Среда","Четверг","Пятница","Суббота" ], "weekdaysShort" : [ "Вс","Пн","Вт", "Ср","Чт","Пт","Сб" ], "weekdaysMin" : [ "Вс","Пн","Вт", "Ср","Чт","Пт","Сб" ] } } }); } </script> </body> </html> Но суть не поменялась) Еще раз попробовал сделать с отменой действий тоже самое перезагружается страница: Спойлер: вариант 2 PHP: <?php session_start(); require_once 'functions.php'; # подключаем функции для календаря $predmet = get_predmet(); # Выводим список предметов $events = get_events($predmet); # Вывод календаря // exit(json_encode($events)); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Календарь событий</title> <link rel="stylesheet" href="css/eventCalendar.css"> <link rel="stylesheet" href="css/eventCalendar_theme_responsive.css"> <script src="http://code.jquery.com/jquery.min.js"></script> <script src="js/moment.js"></script> <script src="js/jquery.eventCalendar.js"></script> </head> <body> <div id="eventCalendar" style="width: 300px; margin: 100px auto;"></div> <script> $(function(){ var data = <?php echo $events; ?>; // console.log(JSON.parse(data)); $('#eventCalendar').eventCalendar({ jsonData: data, startWeekOnMonday: true, /*если труе будет правильно дни недели*/ openEventInNewWindow: true, dateFormat: 'dddd DD-MM-YYYY', showDescription: false, locales: { locale: "ru", txt_noEvents: "Нет запланированных событий", txt_SpecificEvents_prev: "", txt_SpecificEvents_after: "события:", txt_NextEvents: "Следующие события:", txt_GoToEventUrl: "", /*url адрес*/ moment: { "months" : [ "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" ], "monthsShort" : [ "Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек" ], "weekdays" : [ "Воскресенье", "Понедельник","Вторник", "Среда","Четверг","Пятница","Суббота" ], "weekdaysShort" : [ "Вс","Пн","Вт", "Ср","Чт","Пт","Сб" ], "weekdaysMin" : [ "Вс","Пн","Вт", "Ср","Чт","Пт","Сб" ] } } }); }); </script> <script> $('.my_class').on('click', function(e){ e.preventDefault(); // дальше код Ajax-запроса $.ajax({ // путь к обработчику на стороне сервера url: 'function.php', // метод передачи: GET, POST, etc type: 'POST', // важно указать тип, чтобы JSON-строка не преобразовывалась в объект dataType: 'text', // или html // если нужно в запросе передавать какие-то данные data: { some_key_1: <?php echo $predmet; ?>, // some_key_2: 'some_value_2', }, // в случае успешного завершения запроса, вызываем функцию инициализации календаря success: initCalendar; }); }); function initCalendar (data) { $('#eventCalendar').eventCalendar({ jsonData: data, startWeekOnMonday: true, /*стоит в true для правильного отображения дня недели*/ openEventInNewWindow: true, dateFormat: 'dddd DD-MM-YYYY', showDescription: false, locales: { locale: "ru", txt_noEvents: "Нет запланированных событий", txt_SpecificEvents_prev: "", txt_SpecificEvents_after: "события:", txt_NextEvents: "Следующие события:", txt_GoToEventUrl: "", /*url адрес*/ moment: { "months" : [ "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" ], "monthsShort" : [ "Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек" ], "weekdays" : [ "Воскресенье", "Понедельник","Вторник", "Среда","Четверг","Пятница","Суббота" ], "weekdaysShort" : [ "Вс","Пн","Вт", "Ср","Чт","Пт","Сб" ], "weekdaysMin" : [ "Вс","Пн","Вт", "Ср","Чт","Пт","Сб" ] } } }); } </script> </body> </html> Может я не правильно передаю что-то в ключ? Код (Javascript): data: { some_key_1: <?php echo $predmet; ?>, // some_key_2: 'some_value_2', }, Я подумал раз отправляется форма значит у меня какие-то значения передаются, и в итоге у меня передается предмет, может опять я не так логику поставил)
success: initCalendar; вот тут точки с запятой быть не должно. Откуда вы её взяли, если в моём примере её не было Во-вторых, у вас код Ajax выполняется после загрузки страницы, а не по клику на какую-то кнопку или что-то еще. В-третьих, зачем дублировать код плагина, если он у вас уже есть в функции? Можно же просто передать туда данные: Код (Javascript): initCalendar (<?php echo $events; ?>); И в-четвертых, наверно пора поспать, а то я сам уж тормозить начинаю
@Deonis Привет, можно приступить дальше) Убрал, говорю синтаксиса не знаю Каким способом я должен исправить чтобы страница загружалась, а потом после клика использовался ajax? Думал думал куда передать данные например: Код (Javascript): var a = initCalendar (<?php echo $events; ?>); как понимаешь я не понял куда передать данные) Четвертого пункта не будет сейчас он вчера был
Можно, только сегодня у меня уже не выходной, поэтому отвечать буду набегами. Какой элемент будет отвечать за динамическую структуру, это данные формы, кнопка или еще что-то? Покажите HTML-код этого фрагмента. Пример: Код (Javascript): // функция вывода данных function foo(data) { // какой-то код } // вызов функции при загрузке страницы foo(<?= $data; ?>); // Устанавливаем обработчик события на форму $('form').on('submit', function(e) { e.preventDefault(); $.ajax({ /* .... */ success: foo // вызов функции после успешного завершения запроса }); }); Как видите, за вывод данных отвечает одна функция, которую мы можем вызвать при разных обстоятельствах. В вашем же коде, вы продублировали код инициализации плагина: один раз этот код вне функции, где вы подставляете данные из PHP, а второй раз уже внутри функции. Вот я и говорил, что дублировать код - это совсем лишнее.
Фрагмент html сделан в php файле. PHP: echo '<form action="" method="POST" class="my_class">'; echo '<select name="predmet" id="event_start">'; echo '<option>Выберие предмет</option>'; # через массив перебираем наши предметы которые приходят из базы foreach ($result as $key => $value) { $s = ($value['id'] == $key) ? 'selected': ''; printf('<option value="%s" %s>%s</option>', $value['id'], $s, $value['naimenovanie']); } echo '</select>'; echo '<input type="submit" value="Выбрать"/>'; echo '</form>';
Не имеет значения где, главное, что он выводится на страницу. Код (Javascript): $('.my_class').on('submit', function(e) { e.preventDefault(); $.ajax({ url: 'function.php', type: 'POST', dataType: 'text', data: $(this).serialize(), success: initCalendar, error: function(xhr, ajaxOptions, thrownError) { console.log(thrownError + '; ' + xhr.statusText + '; ' + xhr.responseText); } }); }); На сервере встречаете данные $_POST['predmet'];
Если честно то все ровно при нажатии кнопки отправить не чего не происходит) Давай так я покажу что у меня сейчас в файле находится дальше отталкиваться будет от этого: PHP: <?php session_start(); require_once 'functions.php'; # подключаем функции для календаря $predmet = get_predmet(); # Выводим список предметов и передаем выбранный предмет в функцию которая ниже $events = get_events($predmet); # Вывод календаря // exit(json_encode($events)); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Календарь событий</title> <link rel="stylesheet" href="css/eventCalendar.css"> <link rel="stylesheet" href="css/eventCalendar_theme_responsive.css"> <script src="http://code.jquery.com/jquery.min.js"></script> <script src="js/moment.js"></script> <script src="js/jquery.eventCalendar.js"></script> </head> <body> <div id="eventCalendar" style="width: 300px; margin: 100px auto;"></div> <!-- Думал этот кусок кода инициализации сделать функцией--> <script> $(function(){ var data = <?php echo $events; ?>; // console.log(JSON.parse(data)); $('#eventCalendar').eventCalendar({ jsonData: data, startWeekOnMonday: true, /*если труе будет правильно дни недели*/ openEventInNewWindow: true, dateFormat: 'dddd DD-MM-YYYY', showDescription: false, locales: { locale: "ru", txt_noEvents: "Нет запланированных событий", txt_SpecificEvents_prev: "", txt_SpecificEvents_after: "события:", txt_NextEvents: "Следующие события:", txt_GoToEventUrl: "", /*url адрес*/ moment: { "months" : [ "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" ], "monthsShort" : [ "Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек" ], "weekdays" : [ "Воскресенье", "Понедельник","Вторник", "Среда","Четверг","Пятница","Суббота" ], "weekdaysShort" : [ "Вс","Пн","Вт", "Ср","Чт","Пт","Сб" ], "weekdaysMin" : [ "Вс","Пн","Вт", "Ср","Чт","Пт","Сб" ] } } }); }); </script> <script> $('.my_class').on('submit', function(e) { e.preventDefault(); $.ajax({ url: 'function.php', type: 'POST', dataType: 'text', data: $(this).serialize(), success: initCalendar, error: function(xhr, ajaxOptions, thrownError) { console.log(thrownError + '; ' + xhr.statusText + '; ' + xhr.responseText); } }); }); <!-- с этой функцией я чет запутался если честно я не понял иногда доходит туго--> function initCalendar (data) { $('#eventCalendar').eventCalendar({ jsonData: data, }); } </script> </body> </html> Вот и весь код этой страницы. Может из-за того что я передаю ранее эту переменную в функцию? PHP: $predmet = get_predmet(); # Выводим список предметов и передаем выбранный предмет в функцию которая ниже $events = get_events($predmet); # Вывод календаря
Во-первых: Спойлер: Page HTML: <?php session_start(); require_once 'functions.php'; # подключаем функции для календаря $predmet = get_predmet(); # Выводим список предметов $events = get_events($predmet); # Вывод календаря // exit(json_encode($events)); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title> Календарь событий </title> <link rel="stylesheet" href="css/eventCalendar.css"> <link rel="stylesheet" href="css/eventCalendar_theme_responsive.css"> <script src="http://code.jquery.com/jquery.min.js"></script> <script src="js/moment.js"></script> <script src="js/jquery.eventCalendar.js"></script> </head> <body> <div id="eventCalendar" style="width: 300px; margin: 100px auto;"> </div> <script> $('.my_class').on('submit', function(e) { e.preventDefault(); $.ajax({ url: 'function.php', type: 'POST', dataType: 'text', data: $(this).serialize(), success: initCalendar, error: function(xhr, ajaxOptions, thrownError) { console.log(thrownError + '; ' + xhr.statusText + '; ' + xhr.responseText); } }); }); function initCalendar(data) { $('#eventCalendar').eventCalendar({ jsonData: data, startWeekOnMonday: true, /*если труе будет правильно дни недели*/ openEventInNewWindow: true, dateFormat: 'dddd DD-MM-YYYY', showDescription: false, locales: { locale: "ru", txt_noEvents: "Нет запланированных событий", txt_SpecificEvents_prev: "", txt_SpecificEvents_after: "события:", txt_NextEvents: "Следующие события:", txt_GoToEventUrl: "", /*url адрес*/ moment: { "months": ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" ], "monthsShort": ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек" ], "weekdays": ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота" ], "weekdaysShort": ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб" ], "weekdaysMin": ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб" ] } } }); } initCalendar(<?php echo $events; ?>); </script> <?php //require_once 'add_events.php'; # Добавление записи ?> <?php //require_once 'delete_event.php'; # Удаление записи ?> <?php //require_once 'update_events.php'; # Обновление записи ?> </body> </html> Во-вторых, самой формы и даже где она выводиться должна - я тут не вижу
Примерно сделал так: Код (Javascript): <script> $('.my_class').on('submit', function(e) { e.preventDefault(); $.ajax({ url: 'function.php', type: 'POST', dataType: 'text', data: $(this).serialize(), success: initCalendar, error: function(xhr, ajaxOptions, thrownError) { console.log(thrownError + '; ' + xhr.statusText + '; ' + xhr.responseText); } }); }); function initCalendar (data) { var data = <?php echo $events; ?>; // console.log(JSON.parse(data)); $('#eventCalendar').eventCalendar({ jsonData: data, startWeekOnMonday: true, /*если труе будет правильно дни недели*/ openEventInNewWindow: true, dateFormat: 'dddd DD-MM-YYYY', showDescription: false, locales: { locale: "ru", txt_noEvents: "Нет запланированных событий", txt_SpecificEvents_prev: "", txt_SpecificEvents_after: "события:", txt_NextEvents: "Следующие события:", txt_GoToEventUrl: "", /*url адрес*/ moment: { "months" : [ "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" ], "monthsShort" : [ "Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек" ], "weekdays" : [ "Воскресенье", "Понедельник","Вторник", "Среда","Четверг","Пятница","Суббота" ], "weekdaysShort" : [ "Вс","Пн","Вт", "Ср","Чт","Пт","Сб" ], "weekdaysMin" : [ "Вс","Пн","Вт", "Ср","Чт","Пт","Сб" ] } } }); } // Вызываю функцию с параметром initCalendar(<?= $events; ?>); </script> Но если прерывать действие по умолчанию то форма не отправляется если закоментировать preventDefaul то форма отправляется но с перезагрузкой страницы.
Упс не успел, ты быстрее меня это показал, считай я не подсмотрел) только увидел) Ах да заметил что у меня в примере не так, я 2 раза передаю значение в функцию при вызове ее и при инициализации) --- Добавлено --- Тыкал в кнопку отправить, не чего не происходило закоментил действие по умолчанию и сразу форма отправилась.
Когда идёт отладка JS, то консоль вообще не должна закрываться. Открываем её. Например, для Chrome - Ctrl+Shift+J и переходим на закладку Network. Для Firefox - Ctrl+Shift+K и закладка "Сеть". После того, как открыли, кликаем на форму и смотрим, что в консоли. --- Добавлено --- А также смотрим возможные ошибки на закладке Console (Chrome), Консоль (FF)
Можно поправить вас? вы вызвали функцию раньше не много чем требуется. HTML: }); initCalendar(<?php echo $events; ?>); } или вы уже исправили? Просто у меня не выводился календарь, я за закрывающей вызвал и лишь тогда у меня календарь вывелся. --- Добавлено --- Ах нажатие срабатывает но выдает такое смотрим на скриншоте: --- Добавлено --- Не понял, что этим хотели сказать?