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