我对通过ajax调用模块操作有疑问。
我想通过ajax调用模块中的类。但对我来说,最好的解决方案是呼吁清理课堂。不扩展模块。
我不知道我能不能在不向数据库添加文章和向他添加模块的情况下创建url。
我使用JQuery代替mooTools,但js框架并不重要。最重要的是ajax对php类的调用。
我有ajax模块。但如果我调用ajax.php,则需要tl_module表中的模块id。我不想用这张桌子。(Ajax会经常调用,我宁愿不加载所有的contao机制。它应该很快)。
提前感谢您的回答。
我在GitHub issuse(德语)中找到了Contao>3.x的答案
首先在你的前端模板:
<script type="text/javascript">
var data = {};
data["REQUEST_TOKEN"] = "<?php echo REQUEST_TOKEN ?>";
$(document).ready(function(){
$("#trigger").click(function(event){
$.post(
'<?php echo 'Contao'Environment::get('requestUri')?>',
data,
function(responseText) {
alert(responseText);
}
).fail(function( jqXhr, textStatus, errorThrown ){ console.log( errorThrown )});
event.preventDefault();
});
});</script>
重要的是-data["REQUEST_TOKEN"]->如果您不添加它,POST请求将不会到达您的模块:
public function generate()
{
if ($_SERVER['REQUEST_METHOD']=="POST" && 'Environment::get('isAjaxRequest')) {
$this->myGenerateAjax();
exit;
}
return parent::generate();
}
//do in frontend
protected function compile()
{
...
}
public function myGenerateAjax()
{
// Ajax Requests verarbeiten
if('Environment::get('isAjaxRequest')) {
header('Content-Type: application/json; charset=UTF-8');
echo json_encode(array(1, 2, 3));
exit;
}
}
如果您想通过GET执行ajax,则不需要reqest令牌,而是需要jquery funktion$GET();
我建议您使用Simple_Ajax扩展。在这种情况下,您不需要使用数据库,而且您可以使用Jquery ajax调用执行任何正常情况下可以执行的操作。它与Contao 2.11配合使用,您可以使用它调用php类。我发现它比ajax.php.更容易使用
您可以从以下位置获取:https://contao.org/de/extension-list/view/simple_ajax.de.html
- 将SimpleAjax.php复制到Contao的根文件夹中
-
转到[CONTAO ROOT FOLDER]/system/modules并创建如下php文件:
class AjaxRequestClass extends System { public function AjaxRequestMethod() { if ($this->Input->post('type') == 'ajaxsimple' ) { // DO YOUR STUFF HERE exit; // YOU SHOULD exit; OTHERWISE YOU GET ERRORS } } }
-
使用如下php文件创建一个名为config的文件夹(您可以使用类名-class方法将类挂接到TL_HOOKS,simple_ajax将在进行ajax调用时执行您的方法):
$GLOBALS['TL_HOOKS']['simpleAjax'][] = array('AjaxRequestClass','AjaxRequestMethod'); // Klassenname - Methodenname
-
现在,只需将数据发布到SimpleAjax.php即可轻松地进行ajax调用:
$.ajax({ type: "POST", url: "SimpleAjax.php", data: { type: "ajaxsimple" }, success: function(result) { //DO YOUR STUFF HERE }