Как настроить CakePHP 2.5.x для работы с Ajax?

Я работаю на локальном хосте с xampp. Я установил приложение cakePHP в папку C:\xampp\htdocs\mynewapp\, чтобы получить доступ к моему веб-сайту CakePHP через

http://localhost/mynewapp

Я могу получить доступ ко всем своим страницам. Он работает отлично, но я сталкиваюсь с некоторыми проблемами, делая некоторые вызовы Ajax.

Это мои конфигурации .htaccess: C:\xampp\htdocs\mynewapp.htaccess

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase    /linagal/app/
RewriteRule    ^$ app/webroot/    [L]
RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>

C:\xampp\htdocs\mynewapp\app.htaccess

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule    ^$ webroot/    [L]
RewriteRule    (.*) webroot/$1 [L]
</IfModule>

C:\xampp\htdocs\mynewapp\app\webroot.htaccess

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /mynewapp/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>

Я создал представление C:\xampp\htdocs\mynewapp\app\View\Photos\manage.ctp. В этом файле я делаю вызов Ajax

$this->Js->sortable(array(
    'complete' => '$.post("/mynewapp/photos/reorder",
        $("#sortableitems").sortable("serialize"))'));

Моя проблема в том, что мне нужно поместить mynewapp в путь, указанный для $.post, чтобы он работал. Я хотел бы написать $.post("/photos/reorder"; ...

Есть идеи, как я могу это решить?


person quokka-web    schedule 17.08.2014    source источник


Ответы (1)


Моя проблема в том, что я должен поместить mynewapp в путь, указанный в $.post

Это не имеет ничего общего с настройкой CakePHP (или веб-сервера) для работы с AJAX — это простая логическая задача. Есть два очевидных способа справиться с тем, что описывается.

Используйте маршрутизатор

Взятый из вопроса, это PHP-код из файла представления:

$this->Js->sortable(array(
    'complete' => '$.post("/mynewapp/photos/reorder",
        $("#sortableitems").sortable("serialize"))'));

Таким образом, вместо этого просто сначала передайте URL-адрес через маршрутизатор:

$url = $this->url('/photos/reorder');

$this->Js->sortable(array(
    'complete' => '$.post("' . $url . '",
        $("#sortableitems").sortable("serialize"))'));

Это согласуется с написанием Js с использованием помощника Js, но для всего, что выходит за рамки тривиального js, вы вполне можете обнаружить, что этот помощник не помогает (в этом случае - не используйте его).

Используйте js-переменную

В качестве альтернативы создайте переменную, которую можно использовать в качестве базового URL-адреса, и добавьте к ней префикс для всех URL-адресов. Есть много способов сделать это, один из них:

<?php
// default layout file
$app = array(
    'root' => $this->url('/'),
    // add anything else the app's js might need here
);
?>
<html>
    <head>
        ...
        <script>
            var APP = <?= json_encode($app); ?>;
        </script>
    </head>
<body>
    ...

Затем измените вспомогательный вызов js следующим образом:

$this->Js->sortable(array(
'complete' => '$.post(APP.root + "photos/reorder",
    $("#sortableitems").sortable("serialize"))'));

Или похожие.

person AD7six    schedule 17.08.2014
comment
Я изучаю CakePHP, и я не очень хорошо знаком с некоторыми командами, но это приближается :-) На самом деле, я использовал первое решение (маршрутизатор). Я немного изменил решение: $url = $this-›Html-›url(array(controller=›photos, action=›reorder)); и работает отлично! Спасибо за вашу помощь! - person quokka-web; 17.08.2014