【问题标题】:passing javascript variable to php in cakephp 2 view在 cakephp 2 视图中将 javascript 变量传递给 php
【发布时间】:2017-09-14 15:45:23
【问题描述】:

我正在尝试将 javascript 变量传递到 cakephp 2 的视图文件中的 php 代码中。

for (id in response) {

    var book = response[id];

    if (typeof(book.thumbnail_url) != "undefined") {
        var x= book.thumbnail_url; 

        <?php   
            $file11 = WWW_ROOT . 'img' . DS . 'book_images';
            define('DIRECTORY', $file11);

            $content = file_get_contents($abc);
            file_put_contents(DIRECTORY . '/'.$isbn.'.jpg', $content);
        ?>
    }
}

我正在尝试在file_get_contents 函数中传递x 的值来代替$abc,以便它可以相应地保存来自javascript URL 的图像。

编辑::

     for (id in response) {


                                   var book = response[id];

                                        if (typeof(book.thumbnail_url) != "undefined") {
                                        var x= book.thumbnail_url; 
                                         $.ajax({
                                           type: "POST",
                                           url: '/BookSearchs/test',
                                           data: {'yourX':x}
                                        }).done(function(result) {
                                            alert("yes");
                                        }).fail(function() {
                                            alert("no");
                                        });
                                      }



                                     }

这是我在实现我得到的答案后写的。但每次它弹出“不”。这里 BookSearchs 是我的控制器,而 test 是我在其中的函数。

编辑 2:

function handleResponse(response) {
    var target = '';

    for (id in response) {


        var book = response[id];

        if (typeof(book.thumbnail_url) != "undefined") {
            var x = book.thumbnail_url;



            $.ajax({
                    type: 'POST',
                    url: "BookSearchs/test",



                    data: {
                        myVal: x
                    },
                    success: function() {
                        alert('AjaX Success')
                    },
                    error: function() {
                        alert('AjaX Failed')
                    }
                })

                .done(function() {
                    alert('AjaX Done!');
                });
        }



    }

    return true;

}

目前这是我到目前为止所做的,表单方法没有成功。它把我重定向到另一个页面。无论如何,这是我当前的代码。 'test' 是我想要使用 POST 访问 myVal 值的控制器内部的函数。我也有这个问题,我是否需要创建一个物理文件进行测试以使 ajax 功能正常工作,因为如果我删除 test.ctp 文件,那么 ajax 就会开始给出失败消息。所以现在我已经在视图中的BookSearchs 文件夹中创建了一个物理 test.file,尽管它是空的以使 ajax 功能工作。我怀疑我在 Ajax 中的 Url 是否错误,或者我没有正确访问控制器中的值。

【问题讨论】:

  • 如果你愿意,我可以告诉你如何将它发送到控制器
  • ya .. 那也不错
  • 这实际上是我最初的计划。

标签: php html image cakephp web


【解决方案1】:

我认为这在理论上不是正确的方法。但是,有时我们可能需要这个。

在我们继续这种方式之前,您可能需要考虑其他技术,例如 NodeJs(例如 fs.readFileSync

基本上,您不能直接这样做。因为,JavaScript 运行在客户端,PHP 运行在服务器端。

无论如何,可能会有一些调整来做到这一点。但是,这种方法可能会很慢,这取决于您制作了多少个循环。

for (id in response) {
    var book = response[id];
    if (typeof(book.thumbnail_url) != "undefined") {
        var x= book.thumbnail_url; 
        $.ajax({
           type: "POST",
           url: '/yourcontroller/route',
           data: {'yourX':x}
        }).done(function(result) {
            //if success, execute other code
        }).fail(function() {
            //DO other if fail
        });
    }
 }

然后,在你的控制器中读取这个值

$xValue = $_POST['yourX'];

$file11 = WWW_ROOT . 'img' . DS . 'book_images';
define('DIRECTORY', $file11);
$content = file_get_contents($xValue);
file_put_contents(DIRECTORY . '/'.$isbn.'.jpg', $content);
//do some checking success or fail
//I will assume success
$status = 'success';
echo json_encode(['status'=>$status]);    

【讨论】:

  • 我认为在这种情况下 ajax 的问题在于它只与同一个视图交互,我的意思是如果我们不能将 Js 变量发送到控制器然后将其发送到另一种观点,这是ajax的问题​​,我们必须留在观点中;
  • @MehdiBouzidi 无需转到其他视图。可以在同一个视图中完成。
  • 所以这取决于你的需要^^
  • 虽然您对问题的看法是正确的,但 PHP 示例有点问题,安全性(它允许读取任意文件并将它们写入公共目录)和最佳实践(在 CakePHP 中您应该不直接访问超全局变量,控制器不应该回显数据)。
  • @ndm 我同意这一点。但是,我正在展示作为一个 sn-p 的方式。无论如何,感谢您的信息,并将在即将发布的答案中部署它。 :)
【解决方案2】:

通常我使用 Trick 将 JS 变量传递给 CakePhp 控制器(php 变量)。实际上,我创建了一个 form,其中包含一个隐藏的 input,我还将放置将接收 php 变量的页面的链接。

.ctp

 <?=
$this->Html->link('<i class="fa fa-file-pdf-o"></i>' .__('Export'),
'javascript:myFunction();',
array('escape' => false, 'class' => 'btn btn-app  dispatch',  'id' => 'dispatch_packages',
'style'=>'margin-right:0px;background: #f39c12;color:white;',
'disabled' => 'false'));
?>
<form id="sampleForm" name="sampleForm" style="display: none" method="post" action="<?= $this->Url->build([
                        'controller' => 'YourController',
                        'action' => 'youraction']) ?>">
    <input type="hidden" name="variable" id="variable" value="">
</form>

JS

var jsVar=0;
    function  myFunction()
    {

        document.sampleForm.variable.value = jsVar;

        document.forms["sampleForm"].submit();
    }

我将它与 CakePhp 3.x 框架一起使用,并且运行良好。您只需使用 CakePhp 2.x 语法编写 url。

如果您在应用它时遇到任何困难,请随时评论我的答案。 祝你好运!

【讨论】:

  • 我应该如何访问控制器中的值
  • @HarjeevSingh $phpVariable=$this-&gt;request-&gt;data('variable');
  • 还没有.. 无论如何我有一个问题,如果我在控制器中创建除了索引功能之外的功能,是否也需要制作物理文件。
  • @HarjeevSingh 你说的是与函数相关的视图文件?如果是,那么就没有必要!
猜你喜欢
  • 2016-06-18
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
相关资源
最近更新 更多