CakePHP - Как создать модальный макет - PullRequest
1 голос
/ 10 августа 2011

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

Итак, я хочу иметь возможность повторно использовать этот контроллер / действие и загрузить его в мой модальный режим, но, очевидно, контроллер уже использует макет. Поэтому, когда я загружаю страницу в мой модал, верхний и нижний колонтитулы моего сайта снова в модале, что мне не нужно.


Одно из решений, которое я подумал, может сработать, но выглядит как грязный обходной путь, - иметь в моем Appcontroller проверку для параметра URL, который говорит, что это модальный вызов для страницы (не обычный вызов). Затем он переопределяет макет специальным модальным.

//app_controller.php

public function beforeRender() {
    if (isset($this->params['passed']['_modal'])) {
        $this->layout = 'modal';
    }
}

// In my jQuery call to open the modal:

myModal.load('users/view/5/_modal').dialog('open');

Тогда в макет modal.ctp я бы включил таблицу стилей, которая выглядит примерно так:

// modal_layout.css

@import url("normal_layout.css");

.header, .footer {display:none;}

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

Это кажется немного глупым способом сделать это, и я не знаю, работает ли он вообще, но наверняка кто-то уже делал это раньше с CakePHP, так что вы, ребята, предложите?

Ответы [ 5 ]

2 голосов
/ 22 ноября 2012
if ($this->request->is('ajax')) {
     $this->layout = 'ajax';            
}

Теперь вы можете настроить свой Layout / ajax.ctp так, как хотите.

0 голосов
/ 11 августа 2011

Если вы хотите, чтобы содержимое вашего модального диалогового окна было просто содержимым представления действия, вам просто нужно добавить следующее в верхней части действия контроллера:

$this->layout = null;

Это отключит макет и все выведет содержимое {html} представления

0 голосов
/ 10 августа 2011

используйте RequestHandler для обнаружения ajax-запроса.Поместите эту строку в конце вашего действия:

if ($this->RequestHandler->isAjax())$this->render('view_name','ajax');
0 голосов
/ 11 августа 2011

Оказалось, мне не нужно ничего сложного.Я просто создал скрытый div в своем макете:

<div id="modal"></div>

И затем в существующий CSS моего макета я добавил определенные правила, чтобы скрыть элементы, которые не хочу видеть при загрузке страницы в модальном режиме:

#header, #footer {display:none;}

Таким образом, я могу загрузить страницу в модал, но она по-прежнему имеет все обычные стили, которые уже определены в CSS макета.Страницы загружаются в модальное пространство с использованием их обычного URL CakePHP:

$('#modal').load('controller/action/param:whatever').dialog('open');
0 голосов
/ 10 августа 2011

Вы можете создать элемент.

$('#myModal').load("<?=url('users/view/5/_modal')?>", {type:'post'}, function(){
            $('#myModal').dialog({title:'open',autoOpen:false, modal:false, height:600, width:700});
            $('#myModal').dialog('open');
        });

function view($my_customer_id, action) {
//do stuff here 
$this->render(DS.'elements'.DS.'users'.DS.'modal');
}
...