CakePHP AJAX Layout

Я работаю с приложением CakePHP и jQuery Mobile. В приложении CakePHP включен RequestHandler, теперь jQuery Mobile делает все его запросы как ajax-запросы, но требует полной страницы, а не только того, что на мой взгляд, но полного макета.

Мне нужен обработчик запросов, и я попытался установить макет, заставить рендер, отключить автозапуск, ничего не работает, торт возвращает только содержимое моего представления.

Мне очень хотелось бы знать, что здесь происходит.

Если кому-то интересно, я нашел решение этого, я узнал, что когда вы включили RequestHandler и сделаете запрос Ajax, неважно, что вы делаете, RequestHandler затем решает, что ваш макет «ajax» через обратные вызовы, это вероятно, применяется для всех типов запросов, отличных от html, таких как json и text.

Мне пришлось установить

$this->RequestHandler->enabled = false; 

Его также нужно установить в beforeFilter (), а затем в цепочке вызовов и, похоже, не работает.

Таким образом, мой код оказался следующим:

 class AppController extends Controller { var $components = array('RequestHandler'); function beforeFilter() { if ($this->RequestHandler->isMobile()) { $this->RequestHandler->enabled = false //set special mobile rules here } } } 

У меня была та же проблема с приложением CakePHP 1.3, которое использует jQueryMobile для создания мобильных представлений. Я постараюсь выложить его для будущих поисков.

Когда я включил $.mobile.ajaxEnabled = true; для хорошей навигации на основе Ajax для jQM все связанные страницы отображались как undefined а не для содержимого страницы. Ajax nav требует, чтобы связанная страница имела правильную структуру, например:

 <div data-role="page"> <div data-role="header"> <h1>Page Title</h1> </div><!-- /header --> <div data-role="content"> <p>Page content goes here.</p> </div><!-- /content --> <div data-role="footer"> <h4>Page Footer</h4> </div><!-- /footer --> </div><!-- /page --> 

Тем не менее эта разметка приходила из двух мест для моего приложения: мой мобильный план по умолчанию имел <html> , <body> и divs page и нижнего footer . У каждого представления был header и content div.

Проблема возникла из-за того, что RequestHandler Cake хотел установить макет для ajax для всех запросов Ajax. Он делает это где-то после beforeFilter() , что заставило его игнорировать объявленный макет там (о чем упоминает Лука).

Макет ajax пуст, в отличие от моего макета по умолчанию – у него нет <html> и другой разметки, потому что он предполагает (правильно), что вы хотите только частичную разметку, которая будет вставлена ​​на страницу Ajax. Навигация на основе jQuery Ajax действительно хочет увидеть полную разметку, и когда он не получил хорошо сформированную страницу при выполнении запроса Ajax, у нее не было страницы для отображения.

Таким образом, вопрос стал следующим: «Как заставить RequestHandler использовать мой мобильный план по умолчанию для запросов на мобильные страницы?» Я был недоволен решением Люка выше, чтобы полностью отключить RequestHandler для мобильных устройств. К счастью, я нашел сообщение с мая '11 с той же проблемой и лучшим решением:

Наконец отсортировал его! Я проверял, запрашивает ли мобильное устройство страницу с помощью $ this-> RequestHandler-> isMobile (), но поместил ее в функцию beforeFilter (). Исправлена ​​проблема с переносом этого параметра в функцию beforeRender () в файле app_controller.php. http://cakephp.1045679.n5.nabble.com/Jquery-Mobile-and-CakePHP-1-3-td4422871.html

Таким образом, мой код оказался в AppController:

 function beforeRender() { if ($this->RequestHandler->isMobile()) { $this->layout = 'm_default'; } } 

Надеюсь, что это поможет кому-то.

Просто установите $this->layout = 'default'; в вашем контроллере, и он будет использовать макет по умолчанию.

Или, может быть, вы могли бы создать элемент заголовка и нижнего колонтитула, чтобы разместить свои макеты ajax и по умолчанию.

Я был новичком в CakePHP и начал с версии 2 несколько недель назад.

Пока я также сохраняю beforeFilter незатронутым для идентификатора isMobile() и, наконец, использую мобильные представления в Themed-Folder. Поэтому я не использую подпапки для мобильных просмотров в стандартном представлении рабочего стола. После добавления this-> layout в состояние кажется, что я избавился от undefined который появился только через некоторые ссылки на действия.

 public function beforeRender() { if($this->RequestHandler->isMobile()) { $this->theme = 'Mobile'; $this->layout = 'default'; } } 

Лучше всего решить, как настроить обработчик запроса перед фильтром после обнаружения мобильного браузера в вашем контроллере приложения:

 public function beforeRender() { if($this->RequestHandler->isMobile()) { $this->theme = 'Mobile';//set your theme $this->RequestHandler->ajaxLayout = 'public';//this does the trick, set your mobile layout, $this->layout is simply ignored or overwritten by the component } }