модальное окно

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
yintar
Сообщения: 106
Зарегистрирован: 2014.02.09, 11:27

модальное окно

Сообщение yintar »

Всем привет
В стандартном CGridView при нажатии кнопки просмотреть запись(view) мне нужно чтобы просмотр каждой записи открывался аяксом в модальном окне ......подскажите где и что мне надо дописать ,чтобы получить такой функционал. Вот мой код:
Вьюха:

Код: Выделить всё

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'books-grid',
    'dataProvider' => $model->search(),
    'filter' => $model,
    'columns' => array(
        'id',
        'name',
        'preview' => array(
            'name' => 'preview',
            'type' => 'raw',
            'value' => '     CHtml::link(CHtml::image(Yii::app()->request->baseUrl."/images/preview/".$data->preview))',
        ),
        'autor_id' => array('name' => 'autor_id', 'value' => '$data->autor->firstname."  ".$data->autor->lastname'),
        'date' => array(
            'name' => 'date',
            'value' => 'Yii::app()->dateFormatter->format("d MMMM yyyy", $data->date)',
        ),
        'date_create',
        array(
            'class' => 'CButtonColumn',
            'header' => 'Кнопки действий',
            'template' => '{delete}{update}{view-book}',
            'buttons' => array(
                'delete' => array(
                    'label' => '[удл]',
                    'options' => array(
                        'title' => 'Удалить запись',
                        'style' => 'padding-right:10px;border'
                    ),
                    'imageUrl' => false,
                ),
                'update' => array(
                    'label' => '[ред]',
                    'options' => array(
                        'title' => 'Редактировать запись',
                        'style' => 'padding-right:10px'
                    ),
                    'imageUrl' => false,
                ),
                'view-book' => array(
                    'label' => '[просм]',
                    'url' => 'Yii::app()->createUrl("books/view", array("id"=>$data->id,"ajax"=>"true"))',
                    'onclick' => 'function(){$("#view-book").dialog("open"); return false;}',
                    'options' => array(
                        'title' => 'Просмотреть запись',
                        'ajax' => array(
                            'type' => 'POST',
                            'url' => "js:$(this).attr('href')",
                            'success' => 'function(data) { $("#view-book .modal-body p").html(data); $("#view-book").modal(); }'
                        ),
                        'imageUrl' => false,
                    ),
                ),
            ),
        ),
)));
Контроллер:

Код: Выделить всё

 public function actionView($id) {
        if (Yii::app()->request->isAjaxRequest) {
            $this->renderPartial('view', array(
                'model' => $this->loadModel($id),
                    ), false, true);
        } else {
            $this->render('view', array(
                'model' => $this->loadModel($id),
            ));
        }
    }
Rodion_19
Сообщения: 12
Зарегистрирован: 2017.06.29, 21:26

Re: модальное окно

Сообщение Rodion_19 »

нужно это реализовать исключительно средствами фрэймворка или можно на js?
Аватара пользователя
Apache02
Сообщения: 50
Зарегистрирован: 2014.02.09, 01:14

Re: модальное окно

Сообщение Apache02 »

Первое
Немного упростит код при частом использовании ajax. В классе Controller добавить:

Код: Выделить всё

	public function render ( $view, $data = null, $return = false, $partialIfAjax = false )
	{
		if ( $partialIfAjax && Yii::app()->request->isAjaxRequest ) {
			return $this->renderPartial($view, $data, $return);
		}
		return parent::render($view, $data, $return);
	}
В контроллерах использовать примерно так:

Код: Выделить всё

	public function actionView($id) {
		$this->render('view', array(
			'model' => $this->loadModel($id),
		), false, true);
	}
Там, где на странице выводится CGridView тоже можно использовать - экономит на генерации layout.


Второе, по теме
Если не обязательно средствами фреймворка, то я делаю так:
- помечаю кнопку классами action и modal-view
- в конце представления код:

Код: Выделить всё

$script = <<<EOD
(function ($) {
 	$(document.body).on('click', '.action.modal-view', function (event) {
		event.preventDefault();
		$.modal($(this).attr('href'));
	});
})(jQuery);
EOD;
Yii::app()->getClientScript()->registerScript('view_in_modal', $script);
Реализация $.modal у меня своя. При частом использовании можно упростить до

Код: Выделить всё

$.modal_link('.action.modal-view');
Ответить