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