Yii,是否可以从另一个控制器/动作渲染另一个信息?

时间:2014-07-23 02:53:58

标签: php yii

好吧,为了避免过多的编码,我想知道是否有办法调用控制器/动作来显示信息,比如iframe。

我创建了另一个有3列的布局列,并且大部分时间都会呈现相同的信息,如果需要,它会更改,我已经在布局中创建了一个代码来完成我想要的工作做,但只是为了好奇,有可能渲染另一个控制器?

这是我的专栏/布局:

<?php
$this->beginContent('//layouts/main');

if(isset($_GET['user']))
    $user = Users::model()->findByPk($_GET['user'])->attributes;

else
    $user = Users::model()->findByPk(Yii::app()->user->getId())->attributes;
?>

<div class="col-md-3">
    <div class="well well-success text-center">
        <img src="<?php echo $this->renderImg($user['img_path']);?>" alt="User" class="img-rounded"  width="90%"    height="auto">
    </div>  
    <div class="panel panel-success">
        <div class="panel-heading">
            <h2><?php echo $user['nombre']; ?></h2>
        </div>
        <div class="panel-body">
            <?php echo $user['bio']; ?>
        </div>
    </div>
</div>

    <div id="content" class="col-md-6">
        <?php echo $content; ?>
    </div><!-- content -->

    <div class="col-md-3">
        <div class="user">
            <div class="well text-center">
                <a href="#a">
                    <img src="<?php echo Yii::app()->request->baseUrl;?>/images/1D3.jpg" class="img-rounded"  width="90%"   height="auto">
                </a>
            </div>
            <div class="panel-info panel">
                <div class="panel-heading">
                    Anuncio del Restaurante
                </div>
                <div class="panel-body text-justu">
                    Lorem ipsum dolor sit amet, consectetur
                    adipisicing elit. Enim pariatur aliquid a nemo soluta dignissimos
                    minus accusamus porro natus autem cum error odio exercitationem
                    quidem veritatis itaque quas, laudantium ipsam!
                </div>
            </div>
        </div>

        <?php
        $this->beginWidget('zii.widgets.CPortlet', array(
            'title'=>'Operations',
        ));
        $this->widget('zii.widgets.CMenu', array(
            'items'=>$this->menu,
            'htmlOptions'=>array('class'=>'operations'),
        ));
        $this->endWidget();
    ?>
    </div>
</div>
<?php $this->endContent(); ?>

这是一项正在进行中的工作,我想在我的第一个div.col-md-3中使用“此代码”,因为你可以看到我已经在那里制作了代码..

我希望调用的控制器(不同)将执行此操作:

public function actionPreview($id)
    {
        $model = $this->checkUser($id);

        $this->renderPartial('preview', array(
            'model'=>$model
        ));
    }

并且此操作的视图将包含以下代码:

<div class="well well-success text-center">
    <img src="<?php echo $this->renderImg($model->img_path);?>" alt="User" class="img-rounded"  width="90%" height="auto">
</div>  
<div class="panel panel-success">
    <div class="panel-heading">
        <h2><?php echo $model->nombre; ?></h2>
    </div>
    <div class="panel-body">
        <?php echo $model->bio; ?>
    </div>
</div>

就像位于布局中的第一个div一样。

我只是为了好奇而提出这个问题,我并不急于想要练习更多编码,如果有办法可以做到这一点,也许其他人会觉得这很有用

1 个答案:

答案 0 :(得分:1)

重新阅读此http://www.yiiframework.com/doc/guide/1.1/en/basics.controller

在控制器中定义另一个动作

class PostController extends CController
{
    public function actions()
    {
        return array(
            'edit'=>'application.controllers.post.UpdateAction',
        );
    }
}

之后你可以在你的行动中像(AFAIK)那样召唤它

$this->edit();

因此,您应该执行独立操作以使其呈现。另请阅读有关renderPartial()widgets的信息,也可以为您提供帮助。另一种方法是创建一个可以呈现所需的组件,但它看起来像Yii::app()->myComponent->getSomeHtml()

所以你可以用很多东西来做你想要的。

您也可以在布局上执行三个$content变量。通过abstractController,您可以在每个控件中创建任何数据。在布局中需要加载抽象控制器的基础,在主控制器类中,您将选择将在每列中呈现的操作(这里您可以使用我之前展示的任何解决方案),您将获得任何自定义的列数。 ..

<强> ADDED

class ControllerAbstract extends CController
{
    public $layout = 'default';

    public function setLayout($sLayout)
    {
        $this->layout = $sLayout;

        return $this;
    }
}

class Controller extends ControllerAbstract
{

    public function actionIndex()
    {
        $this->setLayout('column_three');
        // or without method
        // $this->layout = 'column_three';

        $aData = array(
            'column1' => $this->getHtmlColumn(1),
            'column2' => $this->getHtmlColumn(2),
            'column3' => $this->getHtmlColumn(3),
        );

        $this->render('index', $aData);
    }

    public function getHtmlColumn($iType)
    {
        // here i won't show how call standalone action - read yii manual

        $sHtml = '';

        switch ($iType) {
            case 1:
                // here call some functions to get html
                $sHtml = '1';
                break;
            case 2:
                // here call some functions to get html
                $sHtml = '2';
                break;
            case 3:
                // here call some functions to get html
                $sHtml = '3';
                break;

            default:
                $sHtml = 'incorrect input, no data';
                break;
        }

        return $sHtml;
    }
}

也读这个(由yii原生) http://www.yiiframework.com/wiki/28/how-to-implement-multiple-page-layouts-in-an-application/