Динамически вызвать обратный вызов в PHP из кнопки?
Мне было интересно, смогу ли я подражать чему-то похожему на то, как ASPX работает с их системой форм. Когда я нажимаю кнопку, она вызывает ту же страницу, но вместо перезагрузки всей страницы она вызывает определенную функцию внутри страницы. Например, он может вызвать функцию внутри, которая проверит, что элементы формы заполнены. Это возможно в PHP? Я не уверен, как привести пример этого, и мне очень жаль, что я был расплывчатым...
6 ответов
Аякс твой метод здесь. PHP - это сторона сервера, поэтому по определению вы должны пойти на сервер, чтобы получить то, что вам нужно.
Если вы действительно Ajax- фобик, XAJAX позволит вам напрямую вызывать функции PHP без тонны Ajax-подобного JavaScript-кода. Хотя это не самая документированная система.
Это должен быть вызов PHP? Это можно сделать простым Javascript или AJAX-вызовом.
РЕДАКТИРОВАТЬ: Добавлен пример вызова функции PHP через AJAX. (использует jQuery)
Вот пример:
<?php
if(isset($_POST['functionToCall']))
{
$args = $_POST;
array_shift($args);
call_user_func($_POST['functionToCall'], $args);
} else {
?>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</head>
<body>
<form id="myForm">
<input id="mytext" type="text" value="some value"/>
<input type="submit"/>
</form>
<button id="callBTN">Call Validation</button>
<div id="result"></div>
<script>
$(document).ready(function()
{
$('#callBTN').click(function()
{
//Values to pass (validate)
var inputVal = $('#mytext').val();
// Function to call in the PHP Side
var functionName = 'myFunctionCall';
//Form validation with pure JS+jquery (without calling PHP)
/*
if( !inputVal)
{
alert('text is empty');
} else {
alert('text is not empty');
}
*/
//Form Validation by calling a PHP function through AJAX
var selfURL = document.URL; //An example of calling itself
$.post(selfURL, {"functionToCall": functionName, "mytext": inputVal}, function(data) {
$('#result').html(data);
});
});
});
</script>
</body>
</html>
<?php
}
function myFunctionCall($args)
{
if(!empty($_POST['mytext']))
{
print 'The text submited was -> ' . $_POST['mytext'];
} else {
print 'There was no text submitted';
}
}
В PHP нет обратных вызовов. Вам придется использовать передовые технологии для организации и обработки ваших мероприятий. Для общения с вашим бэкэндом вы используете AJAX. (пост / получить на разных страницах PHP)
Это может выглядеть так, если вы будете использовать jQuery
<script>
$('#form).submit(function(e){
e.preventDefault();
$.post($(this).attr('action'), $(this).serialize(), function(data){
// in data you'll have response from server, preferably JSON
}
});
</script>
<form action="form/handler.php" method="post" id="form">
<input type="text" name="name" value="" />
<input type="submit" />
</form>
form/handler.php
if(isset($_POST['name)){
// implement any logic you want and construct JSON response you need
$response = array('name' => $_POST['name']);
echo json_encode($response);
}
Это возможно только концептуально с PHP (т.е. вы можете эмулировать поведение с состоянием), используя шаблон проектирования "Модель, представление, контроллер" и AJAX на клиенте.
PHP работает "без сохранения состояния", это означает, что каждый раз, когда появляется веб-запрос, PHP делает свое дело и полностью "уходит", когда отправляет ответ. Если вы правильно спроектировали приложение MVC, вы можете сосредоточить веб-запросы только на определенном методе в вашем приложении, а затем использовать AJAX для вызова этого метода с содержимым формы, прежде чем фактически разрешить форме "отправлять".
Я говорю "концептуально", но учтите, что это распространенная и рекомендуемая практика в больших современных веб-приложениях. Причина, по которой я так говорю, заключается в том, что вы по-прежнему используете "полный" веб-запрос в том, что касается PHP (кнопка не "вызывает" функцию PHP больше, чем обычное обновление веб-страницы). Однако с такой архитектурой, как MVC, вы можете перевести каждую загрузку страницы в вызов метода.
Вы можете просто передать параметры через get
которые контролируют, какие блоки кода называются.
т.е. ссылка на себя:
siteurl/page.php?what_to_do=2
Затем некоторый управляющий код вверху:
if($_GET['what_to_do']==1)
{
showMain();
}
elseif($_GET['what_to_do']==2)
{
showSpecial();
}
Как-то так без выписывания целой программы за ответ.