Я работаю с приложением 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 } }