Yii-设计问题-将对话框与主视图文件分开并访问它们

Yii-设计问题-将对话框与主视图文件分开并访问它们,yii,Yii,我的视图文件中有6个链接,单击它们会打开对话框。我将所有6个对话框的代码与链接保存在同一个视图文件中,这会导致文件变大,并将它们一起加载一次。理想的情况是,只有当用户单击链接时,对话框才会加载 那么,我们有没有办法只在主视图文件中保存链接代码,并将所有对话框保存在单独的文件中,并且仅在用户单击链接时加载它们 我是说 index.php ( view containing only links) _dialog1 ( containing code for first dialog ) _dial

我的视图文件中有6个链接,单击它们会打开对话框。我将所有6个对话框的代码与链接保存在同一个视图文件中,这会导致文件变大,并将它们一起加载一次。理想的情况是,只有当用户单击链接时,对话框才会加载

那么,我们有没有办法只在主视图文件中保存链接代码,并将所有对话框保存在单独的文件中,并且仅在用户单击链接时加载它们

我是说

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');
?>
//在控制器中
公共函数actionOpenDialog1()
{
$data=array();
$this->renderPartial(“'u dialogContent1',$data,false,true);
}
公共函数actionOpenDialog2()
{
$data=array();
$this->renderPartial(“'u dialogContent2',$data,false,true);
}
//在index.view中
//_dialogContent1.php
//_dialogContent2.php
非常感谢你的帮助

问候


Kiran

您只需在页面中包含一个空的
cguidialog
,当需要显示时,使用jQuery AJAX加载内容(这是最简单的,可能足够了),在打开对话框之前返回相应视图的呈现。

命名文件
Yii中的约定是将视图文件命名为:

  • index.php
    :完整视图
  • \u dialog1.php
    :局部视图(包含在另一个视图中)
子视图
然后可以使用
CController::renderPartial()包含局部视图

因子分解代码
这将使源节点更轻。但我建议您更进一步,避免重复所有这些小部件调用。为此,您应该为对话框参数定义一个结构并在其上循环。比如:

$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。要小心,因为从用户的角度来看,您的页面可能不太活跃。如果所有表单都有几Kb的HTML,那么就没有AJAX的nedd。但如果你走这条路,那么你需要:

  • 添加一个只包含
    的CJUI对话框
  • 创建将在对话框视图上应用
    renderPartial()
    的另一个操作
  • 用写JS的代码替换前面foreach循环的内容,比如
    函数dialog1(){jQuery(#dialogajax”).load(…);}
    。如果要动态更改小部件标题,您需要进行黑客攻击
  • 将一些事件(单击)绑定到这些JS函数

另一种方法是使您的aJAX操作呈现完整的CJuiDialog,这可能更简单并避免JS攻击。无论如何,我不确定您是否真的需要AJAX。

我的答案

//内部控制器

   public function actionOpenDialog1()
{
    $data = array();
    $this->renderPartial('_dialogContent1', $data, false, true);
}
   public function actionOpenDialog2()
{
    $data = array();
    $this->renderPartial('_dialogContent2', $data, false, true);
}
//在index.view中

"数据",

    echo 'first dialog content here';

    $this->endWidget('zii.widgets.jui.CJuiDialog');
    echo 'first dialog content here';

    $this->endWidget('zii.widgets.jui.CJuiDialog');
echo CHtml::ajaxButton(“打开第二个对话框”,CController::createUrl('dialogTesting/openDialog2'),数组('update'=>'#data')); ?>

//_dialogContent1.php

$this->beginWidget('zii.widgets.jui.cjudialog',数组( 'id'=>'mydialog1', “选项”=>数组( “标题”=>“对话框1”, “自动打开”=>true, “模态”=>正确, ), ));

    echo 'first dialog content here';

    $this->endWidget('zii.widgets.jui.CJuiDialog');
    echo 'first dialog content here';

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

//_dialogContent2.php

$this->beginWidget('zii.widgets.jui.cjudialog',数组( 'id'=>'mydialog1', “选项”=>数组( “标题”=>“对话框1”, “自动打开”=>true, “模态”=>正确, ), ));

    echo 'first dialog content here';

    $this->endWidget('zii.widgets.jui.CJuiDialog');
    echo 'first dialog content here';

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

?>

您可以粘贴当前使用的CJuiDialog吗?无需将真正的html从_dialog1粘贴到_dialog6,只需在dialog1和dialog2的内容位置写“这是dialog1 html”,“这是dialog2 html”。感谢您的回复。添加了有问题的代码。这是index.php.take的两个对话,并复制到这里。在两个对话中,只是重复了一些示例测试(使事情更清楚)。谢谢你,Jon,我带来了一些解决方案,并将其发布在我的问题中。你认为这个更好还是像你说的那样使用load更好?对不起,你解释的方法有点混乱。有帮助的代码片段吗?再次感谢。我在firefox 3.6上发布的方法发现了一些问题:(谢谢Mytskine,我带来了一些解决方案,并在我的问题中发布了它。你认为我发布的方法很好吗?再次感谢。我在firefox 3.6上发布的方法发现了一些问题:(.前两次有效,然后没有打开窗口。)