Yii框架,将jquery参数传递到Yii::app()->createUrl('controller/a

Yii framework, pass jquery parameters into Yii::app()->createUrl('controller/action',array('param'=>'value')

本文关键字:Yii createUrl 框架 controller gt jquery app 参数传递      更新时间:2023-09-26

我是yii的新手,我的一个视图中有这个脚本:

$('#div_exams').on('click', 'a[id^="download"]', function(e) {
    e.preventDefault();
    var fileName = e.target.id;
    $.ajax({
        type: "POST",
        url: "<?php echo Yii::app()->createUrl("exams/downloadExam",array('fileName'=>'HERE I NEED TO PASS FILENAME')); ?>",
        success: function(jsonResponse) {

        },
        error: function() {
        }
    });
});

所以我的问题是,如何在javascript中传递var fileName来在yii中创建url?

非常感谢:)

选项1:在Yii中构建一个URL模板,并将每个需要的文件名插入其中:

var baseUrl = <?php echo json_encode(Yii::app()->createUrl("exams/downloadExam",array('fileName'=>'__PLACEHOLDER__'))); ?>; 
$('#div_exams').on('click', 'a[id^="download"]', function(e) {
  ...
  var url = baseUrl.replace('__PLACEHOLDER__', encodeURIComponent(filename));
  ...
}

选项2,可能更干净:在Yii中构建每个URL,将其作为数据属性附加到链接上,使用JS:读取

// when building each download link:
<?php echo CHtml::link('Download link, 'some url', array(
  'id' => 'download_1234',
  'data-download' => Yii::app()->createUrl("exams/downloadExam",array('fileName'=>'the file')),
));
// in the script
$('#div_exams').on('click', 'a[id^="download"]', function(e) {
  ...
  var url = $(this).data('download');
  ...
}

请注意,这两个解决方案都没有像您现在所做的那样滥用id属性。

如果我正确理解您的问题,您需要创建一个URL来下载Javascript吗?

这是不可能的。JS在服务器端不起作用,所以一旦JS函数加载到客户端(浏览器)中,就不能在JS函数内使用PHP代码创建URL。

然而,您可以在Yii中执行一个操作,您传递一个值,它会返回一个URL,您可以使用Jquery(我认为是responseText)获得该URL,并随时使用它。

如果在jQuery.ajax():中使用data选项,也可以将文件名作为POST数据传递

$('#div_exams').on('click', 'a[id^="download"]', function(e) {
    e.preventDefault();
    var fileName = e.target.id;
    $.ajax({
        type: "POST",
        url: "<?php echo Yii::app()->createUrl("exams/downloadExam"); ?>",
        data: {fileName: fileName},
        success: function(jsonResponse) {

        },
        error: function() {
        }
    });
});