【问题标题】:Yii, Is possible to render another information from another controller/action?Yii,是否可以从另一个控制器/动作呈现另一个信息?
【发布时间】:2014-07-23 02:53:58
【问题描述】:

好吧,为了避免过多的编码,我想知道是否有一种方法可以调用控制器/动作来显示信息,比如 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 一样。

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

【问题讨论】:

  • @user1954544 我用它来跟踪信息,这是一项正在进行的工作,稍后我将更改名称
  • 如果您想更多地练习阅读有关模式的知识,您的问题的答案很简单,只需一个单词“布局”阅读,您就会得到答案
  • 如果您在我的回答中发现有用的信息,请标记为回答

标签: php yii


【解决方案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()-&gt;myComponent-&gt;getSomeHtml()

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

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

添加

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/

【讨论】:

  • 我虽然为每个 div 做 $content,但我认为它只会渲染相同的动作 3 次,我将开始寻找如何做到这一点
  • 我想为每个 div 提供一个 $content 的示例,如果你有的话,能给我看一个吗?
  • 添加了基本描述,您应该根据需要更改它,您也可以重新声明渲染方法以更改其行为,主要内容 - 更改布局 - 评估此布局所需的变量。你甚至可以在渲染之前添加\编辑它(在抽象控制器类中),简单的例子是'用户在服务器上被禁止正在通过抽象控制器做,这将决定用户是否可以看到页面'
猜你喜欢
  • 2020-09-12
  • 2023-03-09
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多