Yii - вопрос разработки - выделение диалоговых окон отдельно от файла основного вида и доступ к ним - PullRequest
1 голос
/ 23 августа 2011

У меня есть случай, когда в моем файле просмотра есть 6 ссылок, и при нажатии на них открывается окно CJuiDialog.Я сохраняю все 6 кодов диалоговых окон в одном и том же файле представления вместе со ссылками, и это приводит к тому, что файл становится большим и загружает их все вместе один раз. Идеальный сценарий - диалоговые окна должны загружаться только тогда, когда пользователь нажимает наlinks.

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

Я имею в виду

index.php ( view containing only links)
_dialog1 ( containing code for first dialog )
_dialog2 ( containing code for second dialog )
_dialog3 ( containing code for third dialog )
_dialog4 ( containing code for fourth dialog )
_dialog5 ( containing code for fifth dialog )
_dialog6 ( containing code for sixth dialog )

Пример кода

//First Dialog code

     $this->beginWidget('zii.widgets.jui.CJuiDialog', array(
            'id'=>'mydialog1',
            'options'=>array(
                'title'=>'Dialog box 1',
                'autoOpen'=>false,
                'modal'=>true,      
            ),
        ));

        echo 'First dialog content here';

        $this->endWidget('zii.widgets.jui.CJuiDialog');

        echo CHtml::link('open dialog', '#', array(
            'onclick'=>'$("#mydialog1").dialog("open"); return false;',
        ));

//2nd dialog code 

$this->beginWidget('zii.widgets.jui.CJuiDialog', array(
            'id'=>'mydialog2',
            'options'=>array(
                'title'=>'Dialog box 1',
                'autoOpen'=>false,
                'modal'=>true,      
            ),
        ));

        echo 'dialog2 content here';

        $this->endWidget('zii.widgets.jui.CJuiDialog');

        echo CHtml::link('open dialog', '#', array(
            'onclick'=>'$("#mydialog2").dialog("open"); return false;',
        ));

Решение, которое я получил с

//In controller

       public function actionOpenDialog1()
    {
        $data = array();
        $this->renderPartial('_dialogContent1', $data, false, true);
    }
       public function actionOpenDialog2()
    {
        $data = array();
        $this->renderPartial('_dialogContent2', $data, false, true);
    }

//In index.view

<div id="data">
</div>

<?php
echo CHtml::ajaxButton ("Open first dialog", CController::createUrl('dialogTesting/openDialog1'),array('update' => '#data'));

echo CHtml::ajaxButton ("Open second dialog", CController::createUrl('dialogTesting/openDialog2'),array('update' => '#data'));
?>

//_dialogContent1.php

<?php

 $this->beginWidget('zii.widgets.jui.CJuiDialog', array(
            'id'=>'mydialog1',
            'options'=>array(
                'title'=>'Dialog box 1',
                'autoOpen'=>true,
                'modal'=>true,
            ),
        ));

        echo 'first dialog content here';

        $this->endWidget('zii.widgets.jui.CJuiDialog');
?>


//_dialogContent2.php

<?php

 $this->beginWidget('zii.widgets.jui.CJuiDialog', array(
            'id'=>'mydialog1',
            'options'=>array(
                'title'=>'Dialog box 1',
                'autoOpen'=>true,
                'modal'=>true,
            ),
        ));

        echo 'first dialog content here';

        $this->endWidget('zii.widgets.jui.CJuiDialog');
?>

Спасибомного за вашу помощь

С уважением

Киран

Ответы [ 3 ]

1 голос
/ 23 августа 2011

Именование файлов
В Yii принято называть файлы представлений:

  • index.php: полный просмотр
  • _dialog1.php: частичный вид (включен из другого вида)

Подвиды
Затем вы можете включить частичные представления с CController::renderPartial():

$this->beginWidget(...);
$this->renderPartial('_dialog1', array('var1' => 23, 'var2' => "var"));
$this->endWidget(...);

Код факторинга
Это должно сделать ваш исходный узел намного легче. Но я предлагаю вам пойти дальше и избегать дублирования всех этих вызовов виджетов. Чтобы сделать это, вы должны определить структуру для ваших параметров диалога и зациклить ее. Что-то вроде:

$dialogs = array(
    'mydialog1' => array(
        'file' => '_dialog1',
        'options' => array('title' => "My title 1",),
    ),
    'mydialog2' => array(
        'file' => '_dialog12,
        'options' => array('title' => "My title 2",),
    ),
);
$defaultOptions = array(
    'autoOpen' => false,
    'modal' => true,      
);
foreach ($dialogs as $id => $dialog) {
    $this->beginWidget(
        'zii.widgets.jui.CJuiDialog',
        array(
            'id' => $id,
            'options' => CMap::mergeArray($defaultOptions, $dialog['options']),
        )
    );
    // ... include partial view ...

Эта факторизация сделает ваш код более компактным, но выше он упростит будущие изменения. Использование структур данных во избежание дублирования кода является общепринятой практикой.

AJAX
Наконец, если вы действительно хотите, чтобы частичные представления загружались динамически, это означает, что вы должны использовать AJAX. Будьте осторожны, потому что ваша страница может быть менее активной с точки зрения пользователя. Если все ваши формы составляют несколько килобайт HTML, то для AJAX нет nedd. Но если вы пойдете этим путем, то вам нужно будет:

  • Добавить CJuiDialog, содержащий всего <div id="dialog-ajax"></div>.
  • Создайте еще одно действие, которое будет применяться renderPartial() к диалоговым окнам.
  • Заменить содержимое предыдущего цикла foreach кодом, который записывает JS, как function dialog1() {jQuery("#dialog-ajax").load(...);}. Вам нужно будет взломать, если вы хотите динамически изменить заголовок виджета.
  • Привязать некоторые события (клики) к этим функциям JS.

Другим способом было бы заставить ваше действие aJAX визуализировать полный CJuiDialog, это может быть проще и избежать взломов JS. В любом случае, я не уверен, что тебе действительно нужен AJAX.

1 голос
/ 16 сентября 2011

Мой ответ

// В контроллере

   public function actionOpenDialog1()
{
    $data = array();
    $this->renderPartial('_dialogContent1', $data, false, true);
}
   public function actionOpenDialog2()
{
    $data = array();
    $this->renderPartial('_dialogContent2', $data, false, true);
}

// В index.view

'#data'));

echo CHtml :: ajaxButton («Открыть второй диалог», CController :: createUrl ('dialogTesting / openDialog2'), массив ('update' => '#data'));?>

// _ dialogContent1.php

$ this-> beginWidget ('zii.widgets.jui.CJuiDialog', массив ('id' => 'mydialog1', ''options '=> array (' title '=>' Диалоговое окно 1 ',' autoOpen '=> true,' modal '=> true,),));

    echo 'first dialog content here';

    $this->endWidget('zii.widgets.jui.CJuiDialog');

?>

// _ dialogContent2.php

$ this-> beginWidget ('zii.widgets.jui.CJuiDialog', массив ('id' => 'mydialog1', 'options' => array('title' => 'Диалоговое окно 1', 'autoOpen' => true, 'modal' => true,),));

    echo 'first dialog content here';

    $this->endWidget('zii.widgets.jui.CJuiDialog');

?>

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

Вы можете просто включить одну пустую CJuiDialog на своей странице, и, когда ее нужно отобразить, загрузить содержимое с помощью jQuery AJAX (load - самое простое и, вероятно, достаточно), которое возвращаетсделать соответствующий вид перед открытием диалога.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...