2013-04-15 22 views
0

Я застрял на чем-то, что, по моему мнению, сводится к моему опыту со многими отношениями.Реализация отношения many_to_many с флажками

В моем заявлении я сопоставляю интересы с продуктами со многими для многих. Я хочу создать следующий сценарий, в соответствии с которым полный список интересов указан в определенном продукте с флажками. Для каждого флажка, выбранного при отправке формы, строка добавляется в таблицу InterestProductAssignment.

В моем контроллере продукта я называю полный список interests-

$interests = Interest::model()->findAll(); 

На самом деле я не получаю много дальше, чем это, как мой ум в узлах, интересно, куда двигаться дальше. До сих пор я пытался создать массив объектов InterestProductAssignment для соответствия массиву интересов, который я вернул выше. Я пробовал передать его взгляду и создать форму, но я довольно запутался, пытаясь совместить эти два, и я не могу поверить, что правильно использую Yii, поскольку это грязно.

Может ли кто-нибудь определить решение этой проблемы, которое позволит мне установить флажок против всех интересов, которые добавили бы связь между продуктом и процентом при отправке? Мне было бы интересно посмотреть, что вы напишете в контроллере и просмотрите.

Чтобы уточнить, эта страница является предметом только одного продукта.

РАСШИРЕНИЕ

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

Мое отношение внутри моего контроллера продукта читается как this-

  'interests'=>array(self::MANY_MANY, 'Interest', 'interest_product_assignment(interest_id, product_id)') 

контроллер

public function actionUpdate($id) 
{ 
      // loadModel as been adapted to be called "->with('interests')" 
    $model=$this->loadModel($id); 

    // Uncomment the following line if AJAX validation is needed 
    // $this->performAjaxValidation($model); 

    if(isset($_POST['Product'])) 
    { 
     $model->attributes=$_POST['Product']; 
     if($model->save()) 
      foreach($_POST['ProductInterest'] as $i => $interest_id){ 
       $this_interest = new InterestProductAssignment; 
       $this_interest->product_id = $model->id; 
       $this_interest->interest_id = $interest_id; 
       $this_interest->save(); 
      } 
      $this->redirect(array('view','id'=>$model->id)); 
    } 

    $this->render('update',array(
     'model'=>$model, 
    )); 
} 

Соответствующая часть зрения _form.php

<div class="row"> 
    <?php echo CHtml::checkBoxList('ProductInterest', CHtml::listData($model->interests, 'interest_id', true), CHtml::listData(Interest::model()->findAll(), 'id', 'interest'));?> 
</div> 

Проблема в том, что второе поле в checkBoxList, похоже, не правильно заполняет флажки, которые уже выбраны. Я подозреваю, что первопричиной этого является, вероятно, глупая ошибка. Я не могу это заметить, и я недостаточно знаком с checkBoxList.

Заранее спасибо.

ответ

0

гусь,

Я думаю, что вы ищете здесь является CheckBoxList.

В вашей форме вы можете использовать код

echo CHtml::checkBoxList('Product_Interests', $model->getInterests(), CHtml::listData(Interest::model()->findAll(), 'interest_id', 'interest_title')); 
//$model->getInterests() is a method that should returns an array of IDs of all the currently selected interests 

Тогда в контроллере вы можете использовать код:

foreach($_POST['Product_Interests'] as $interest_id=>$checked) 
    if($checked) 
     $model->addInterest($interest_id); //Add Interest 
    else 
     $model->removeInterest($interest_id); //Remove an Interest if it exists 
//Note: If you have a model that connects these tables those can be created or destroyed here 
+0

Это звучит здорово, я буду проверять его. Благодаря! – goose

+0

Еще раз спасибо Зане, это то, что я искал. У меня есть один вопрос. У меня возникли проблемы с заполнением второго аргумента. Если у меня есть идентификатор продукта, как использовать отношение many_many для заполнения массива уже выбранных интересов? – goose

+0

Самый простой способ (я знаю), если просто создать массив ключей => с ключом, являющимся ключом интереса, а значение истинным или ложным (если оно выбрано/уже заинтересовано). Попробуйте: «CHtml :: listData ($ model-> ProductInterests, "interest_id", true) ' –

Смежные вопросы