Подскажыте как связать две таблицы

Подскажите пожалуйста как связать де таблицы.

Есть таблицы Персонал, Страна, Города.

Staff {id, first_name, last_name, country, city, …};

Country { id, name};

City { id, id_country, name};

Один контроллер, три модели :

StaffContriller;

Staff;

Country;

City;

Нужно связать страну и город чтоб при создании сотрудника было два DropDownList { Country, City}, при выборе страны загружались города этой страны.

Я в yii и php новичок, не могу найти подробной инструкции, ищу целый день, уже перепробовал все что есть в сети, ничего не получается.

Помогите пожалуйста, буду очень благодарен!

Что я не так делаю?

Контроллер


    public function actionDynamiccities()

    {

            $data = City::model()->findAll('id_country= :id_country', array(':id_country' => (int) $_POST['StaffController']['id_country']));

            $data = CHtml::listData($data, 'id', 'name');

            foreach($data as $id => $name) {

                echo CHtml::tag('option', array('value' => $id), CHtml::encode($name), true);

            }

    }

Модель Country


    public function relations()

    {

        // NOTE: you may need to adjust the relation name and the related

        // class name for the relations automatically generated below.

        return array(

        'city' => array(self::HAS_MANY, 'City', 'id_country'),

        );

    } 

Модель City


    public function relations()

    {

        // NOTE: you may need to adjust the relation name and the related

        // class name for the relations automatically generated below.

        return array(

        'country' => array(self::BELONGS_TO, 'Country', 'id'),

        );

    } 

Представление


$list = CHtml::listData(Country::model()->findAll(), 'id', 'name');

            echo CHtml::dropDownList('id_country', '', $list, array('empty'=>'-- Select Country --'),

                array(

                    'ajax' => array(

                        'type' => 'POST',

                        //'url' => $this->createUrl('StaffController/dynamiccities'),

                        'url' => CController::createUrl('StaffController/dynamiccities'),

                        'update'=>'#modification_id',

                    ) )  );

            echo '<br>';

            echo CHtml::dropDownList('modification_id', '', array()); 

А что именно у тебя не работает? На первый взгляд все правильно. Разве что в actionDynamiccities ты генерируешь список из <options> а не целый <select>.

Код:


'update'=>'#modification_id',

AFAIK ищет элемент с id=modification_id и заменяет его содержимое, иными словами:


$('#modification_id').html(data)

а в выпадающем списке, для замены его элементов такой номер кажется не пройдет, хотя не уверен.

#modification_id - это DIV?

Ошибок не каких не выдает, просто не работает, второй список всегда пустой.

Можете пожалуйста подробно описать что нужно изменить?

Что ни кто не может помочь?

Посмотрите в firebug или chrome dev tool (в network) что отправляется в запросе при выборе в первом dropdown. У вас форма StaffController называется? Получает контроллер [color="#008800"][size="2"]id_country[/size][/color]? Что возвращается в запрос?

Нехорошо не отвечать на вопросы. Приведи пожалуйста код вьюхи.


<div class="form"> 


<?php $form=$this->beginWidget('CActiveForm', array( 

    'id'=>'staff-form', 

    'enableAjaxValidation'=>true, 

    'enableClientValidation'=>true, 

    'clientOptions'=>array( 

        'validateOnSubmit'=>true, 

    ), 

    'htmlOptions'=>array('enctype'=>'multipart/form-data'), 

)); ?> 

    <?php //echo CHtml::form('','post',array('enctype'=>'multipart/form-data')); ?> 


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


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


    <div class="row"> 

        <?php echo $form->labelEx($model,'first_name'); ?> 

        <?php echo $form->textField($model,'first_name',array('size'=>60,'maxlength'=>128)); ?> 

        <?php echo $form->error($model,'first_name'); ?> 

    </div> 


    <div class="row"> 

        <?php echo $form->labelEx($model,'last_name'); ?> 

        <?php echo $form->textField($model,'last_name',array('size'=>60,'maxlength'=>128)); ?> 

        <?php echo $form->error($model,'last_name'); ?> 

    </div> 


    <div class="row"> 

        <?php echo $form->labelEx($model,'email'); ?> 

        <?php echo $form->textField($model,'email',array('size'=>60,'maxlength'=>128)); ?> 

        <?php echo $form->error($model,'email'); ?> 

    </div> 

<!-- 

    <div class="row"> 

        <?php echo $form->labelEx($model,'country'); ?> 

        <?php echo $form->dropDownList($model,'country', CHtml::listData(Country::model()->findAll(), 'id', 'name'), array('empty'=>'-- Select Country --')); ?> 

        <?php echo $form->error($model,'country'); ?> 

    </div> 


    <div class="row"> 

        <?php echo $form->labelEx($model,'city'); ?> 

        <?php echo $form->dropDownList($model,'city', CHtml::listData(City::model()->findAll(), 'id', 'name'), array('empty'=>'-- Select City --')); ?> 

        <?php echo $form->error($model,'city'); ?> 

    </div> 

    --> 


<? 


            $list = CHtml::listData(Country::model()->findAll(), 'id', 'name'); 

            //echo CHtml::dropDownList('id_country','', array(1=>'USA',2=>'France',3=>'Japan'), 

            echo CHtml::dropDownList('id_country', '', $list, array('empty'=>'-- Select Country --'), 

                array( 

                    'ajax' => array( 

                        'type' => 'POST', 

                        'url' => CController::createUrl('staff/dynamiccities'),  

                        'update'=>'#modification_id', 

                    ) 

                ) 

            ); 

            echo '<br>'; 

            echo CHtml::dropDownList('modification_id', '', array()); 


    ?> 




     

    <div class="row"> 

    <?php echo $form->labelEx($model,'photo'); ?> 

    <?php echo $form->FileField($model, 'photo'); ?> 

    <?php echo $form->error($model,'photo'); ?> 

    </div> 


    <div class="row"> 

        <?php echo $form->labelEx($model,'notes'); ?> 

        <?php echo $form->textArea($model,'notes',array('rows'=>6, 'cols'=>60)); ?> 

        <?php echo $form->error($model,'notes'); ?> 

    </div> 


    <div class="row buttons"> 

        <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?> 

        <?php echo CHtml::submitButton('Return',array( 

             'submit' => '/index.php?r=staff/admin')); ?> 

    </div> 


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


</div><!-- form -->




'update'=>'#modification_id', 

         'data'=>array(

            'country'=>'js:this.value',

        ),

по идее тебе не хватает таких строк, т.е. в контроллер не передается id-города

PS: исправь ошибку в теме

Не помогло

Ну тогда продемонстрируй хотя бы слабое желание разобраться в том, как должен работать скрипт. Найди ответ на вопрос UncleSym. Опиши свои догадки о причинах проблеме и что именно ты проверил.

В программировании нужно знать причину "не работает", например в чем выражается эта неработоспособность.