0

我在为我的应用程序创建某些东西时遇到问题。我已经拥有的是一个 CJuiTabs 系统,每个选项卡中都有一个表单。选项卡的数量和值/名称由我数据库中另一个表中的许多 tinyInt 列定义。选项卡的值作为隐藏字段与表单一起提交。

因此,现在如果您使用已提交记录的 id 访问视图,您将能够更新该记录,但无法使用其他选项卡值创建新记录。这是我的问题。我如何让应用程序根据您选择的选项卡决定是创建新记录还是更新现有记录?如果您正在更新一条记录,我希望显示该记录的值,但如果您正在创建一个新记录,您应该只看到空白字段(好吧,它是一个评级系统,所以我猜它是星号而不是字段)。

我想应该通过使用 AJAX 来完成,但我非常不确定如何做到这一点。

游戏/视图:

<?php 
$tab_list=Platform::getPlatforms();
$tabarray=array();

// Create Dynamic Tabs
foreach($tab_list as $key=>$value){
    $tabarray["$value"]=array(
        'id'=>$key,
        'content'=>$this->renderPartial('../ranking/_form',
            array('model'=>$ranking, 'key'=>$key),TRUE)
    );
}?>

<?php
$this->widget('zii.widgets.jui.CJuiTabs',array(
    'tabs'=>$tabarray,
    'options'=>array(
        'collapsible'=>true,
    ),
    'id'=>'categorytabs',
)); ?>

型号/平台:

const PC = 1;
    const Mac = 2;
    const XBOX = 3;
    const XBOX360 = 4;
    const PS2 = 5;
    const PS3 = 6;
    const PSP = 7;
    const PSVITA = 8;
    const Wii = 9;
    const WiiU = 10;
    const NintendoDS = 11;
    const NintendoDS3 = 12;
...
    public function getPlatforms()
    {
        $id = Yii::app()->request->getQuery('id');
        $platform = Platform::model()->findByPk($id);
        $platforms = array();
        if ($platform -> pc == 1)
        {
            $platforms[self::PC] = "PC";
        }
        if ($platform -> xbox == 1)
        {
            $platforms[self::XBOX] = 'XBOX';
        }
        if ($platform -> xbox360 == 1)
        {
            $platforms[self::XBOX360] = "XBOX 360";
        }
        if ($platform -> ps2 == 1)
        {
            $platforms[self::PS2] = "PS2";
        }
        if ($platform -> ps3 == 1)
        {
            $platforms[self::PS3] = 'PS3';
        }
        if ($platform -> psp == 1)
        {
            $platforms[self::PSP] = "PSP";
        }
        if ($platform -> psVita == 1)
        {
            $platforms[self::PSVITA] = 'PS VITA';
        }
        if ($platform -> wii == 1)
        {
            $platforms[self::Wii] = "Wii";
        }
        if ($platform -> wiiU == 1)
        {
            $platforms[self::WiiU] = "Wii U";
        }
        if ($platform -> nintendoDS == 1)
        {
            $platforms[self::NintendoDS] = 'Nintendo DS';
        }
        if ($platform -> nintendoDS3 == 1)
        {
            $platforms[self::NintendoDS3] = 'Nintendo DS3';
        }       
        return $platforms;
    }

控制器/游戏控制器:

public function actionView($id)
    {
        ...
        $ranking=$this->createRanking($model);
        ...
        }

    protected function createRanking($model)
    {
        $user_id=Yii::app()->user->getId(); 
        $game_id=$model->id;
        $rank=ranking::model()->find("create_user_id=$user_id and game_id=$game_id"); 

        if($rank===null){
        $ranking=new Ranking;
        }
        else{
        $ranking=$rank;
        }

        if(isset($_POST['Ranking']))
        {
            $ranking->game_id=$model->id;
            $ranking->attributes=$_POST['Ranking'];

            $valid = $ranking->validate();
            if ($valid)
            {
                $ranking->save(false);
                $this->redirect(array('index'));
            }
        }
        return $ranking;
    }

排名/_form:

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'ranking-form',
    'enableAjaxValidation'=>false,
)); ?>

    <p class="note">Fields with <span class="required">*</span> are required.</p>

    <?php echo $form->errorSummary($model); ?>

    <?php echo $form->hiddenField($model, 'platform_id', array('value' => $key)); ?>

    <div class="row">
        <?php echo $form->labelEx($model,'overall'); ?>
        <?php $this->widget('CStarRating',array(
            'model'=>$model,
            'attribute' => 'overall',
        )); ?>
        <?php echo $form->error($model,'overall'); ?>
    </div>
    <br/>

    <div class="row">
        <?php echo $form->labelEx($model,'graphics'); ?>
        <?php $this->widget('CStarRating',array(
            'model'=>$model,
            'attribute' => 'graphics',
        )); ?>
        <?php echo $form->error($model,'graphics'); ?>
    </div>
    <br/>

    <div class="row">
        <?php echo $form->labelEx($model,'sound'); ?>
        <?php $this->widget('CStarRating',array(
            'model'=>$model,
            'attribute' => 'sound',
        )); ?>
        <?php echo $form->error($model,'sound'); ?>
    </div>
    <br/>

    <div class="row">
        <?php echo $form->labelEx($model,'gameplay'); ?>
        <?php $this->widget('CStarRating',array(
            'model'=>$model,
            'attribute' => 'gameplay',
        )); ?>
        <?php echo $form->error($model,'gameplay'); ?>
    </div>
    <br/>

    <div class="row">
        <?php echo $form->labelEx($model,'lastingApp'); ?>
        <?php $this->widget('CStarRating',array(
            'model'=>$model,
            'attribute' => 'lastingApp',
        )); ?>
        <?php echo $form->error($model,'gameplay'); ?>
    </div>
    <br/>

    <div class="row buttons">
        <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
    </div>

<?php $this->endWidget(); ?>
4

1 回答 1

1

我不确定我是否完全明白,让我试试看是否有问题,

您有多个表单一个用户可以编辑,它们都是在不同游戏平台(XBOX、PS2/3 等)上对一款游戏进行排名的表单。

如果是这种情况,请在您的游戏控制器中:

$rank=ranking::model()->find("create_user_id=$user_id and game_id=$game_id");

无论游戏平台如何,都将始终返回相同的数据库条目(前提是有条目)您需要使用类似的东西

$rank=ranking::model()->find("create_user_id=$user_id and game_id=$game_id and platform_id=$platform_id");

这涵盖了保存部分,但显示中也存在问题。你有:

foreach($tab_list as $key=>$value){
    $tabarray["$value"]=array(
        'id'=>$key,
        'content'=>$this->renderPartial('../ranking/_form',
            array('model'=>$ranking, 'key'=>$key),TRUE)
    );

本质上,您对每个选项卡使用相同的 $ranking 模型,因此相同的(已经存在的)字段输入或星级评分。

这是它变得有点棘手的地方。理想情况下,您将使用Yii 的关系将您的模型设置为具有多个游戏(MANY_MANY)的平台,这些游戏具有多个评级,具体取决于平台/游戏组合。然后你可以按照以下方式做一些事情:

    $platforms = Plateform::model()->findAll(array(
            'with'=>array(                                                  
                'rankings'=>array(
                       'condition'=>'game_id=$game_id AND platform_id=t.id')) //t refers to platform in Yii < 1.1.13. For Yii >= 1.1.13 check version update logs

));
    foreach($platforms as $platform){
        $tabarray[$platform->title]=array( //called it title arbitrarily, could be anything
            'id'=>$platform->id,
            'content'=>$this->renderPartial('../ranking/_form',
                array('model'=>$platform->rankings[0], 'key'=>$platform->id),TRUE)
        );

(我不让你使用 'params'=>array(),但请养成习惯。)

但是,您似乎并没有走那条路,所以如果需要,请检查一下其中关键是平台 ID。然后你可以这样做:

  foreach($tab_list as $key=>$value){
        $tabarray["$value"]=array(
            'id'=>$key,
            'content'=>$this->renderPartial('../ranking/_form',
                array('model'=>$rankings[$key], 'key'=>$key),TRUE)
        );

如果您这样做,就保存而言,如果 isset($_GET['Ranking']) 那么您将使用 platform_id 将正确的模型与数组隔离,以便将其保存到 db (或创建一个新模型)如果它不存在)

希望对您有所帮助,或者至少让您走上正轨。

编辑:添加了一些代码,不是最好/最干净的解决方案,但它应该可以工作并且易于理解:

控制器/游戏控制器:

 public function actionView($id)
{
    ...
    $this->createRanking($model);
    $rankings = $this->getRankingList();
    ...
}

//add this function
protected function getRankingList($gid,$uid)
    {
        $tab_list=Platform::getPlatforms();
        $rankings = array();
        foreach($tab_list as $key=>$value)
        {
            $rank=Ranking::model()->find("create_user_id=$user_id and game_id=$game_id and platform_id=$key"); 
            if(empty($rank))
                 $rank = new Ranking;
            $rankings[$key]= $rank;
        }
        return $rankings;
    }

游戏/视图:

<?php 
$tab_list=Platform::getPlatforms();
$tabarray=array();

// Create Dynamic Tabs
foreach($tab_list as $key=>$value){
    $tabarray["$value"]=array(
        'id'=>$key,
        'content'=>$this->renderPartial('../ranking/_form',
            array('model'=>$rankings[$key], 'key'=>$key),TRUE)
    );
}?>

<?php
$this->widget('zii.widgets.jui.CJuiTabs',array(
    'tabs'=>$tabarray,
    'options'=>array(
        'collapsible'=>true,
    ),
    'id'=>'categorytabs',
)); ?>
于 2013-04-02T03:47:13.347 回答