2012-03-29 6 views
1

Dieser Code aktualisiert nur eine Zeile (die mit der ersten im Array übereinstimmt):Aktualisieren angegebene Zeilen in CakePHP mit Array von IDs?

Edit: mehr Code anzeigen!

Hier ist meine Ansicht. Es greift auf db-Einträge zu, die auf einer Verknüpfung basieren (es gibt ein Modell "clients", das eine Eins-zu-viele-Beziehung mit zwei anderen Modellen, Programmen und Benutzern, hat).

<div class="view"> 
    <h2><?php echo h($program['Program']['title'])?></h1> 
    <?php echo $this->Form->create('User', array('action' => 'pushing')); ?> 
    <table id="pushTable"> 
     <tr><th colspan="5">Select the athletes you would like to push this program to:</th></tr> 
     <tr> 
     <?php $i=0; ?> 
     <?php foreach ($clients['Players'] as $player) {?> 
      <?php if ($i == 0) {?><tr><?php } ?> 
      <td><?php echo $this->Form->checkbox($player['id']) . ' ' . $player['username'];?></td> 
      <?php if ($i == 4) {?></tr><?php $i = 0; } else { $i++; } ?> 
     <?php } ?> 
     </tr> 
    </table> 
    <?php echo $this->Form->end(__('Push')); ?> 
</div> 

In meinem Benutzer-Controller:

public function pushing() { 
    if ($this->request->is('post') || $this->request->is('put')) { 
     $athletes = $this->request->data['User']; 
     foreach ($athletes as $player => $flag){ 
      if ($flag == 0){ 
       unset($athletes[$player]); 
      } 
     } 
     $this->User->updateAll(
      array('User.data' => "'foo'"), 
      array('User.id' => $athletes) 
     ); 
     $this->Session->setFlash(__('Programs were pushed!')); 
     } 
    } 
} 

$ Athleten wird das Array aus kreuzte Kästchen gesammelt, und es scheint mir keine Probleme mit, dass ... so bin ich nicht sicher, warum die updateAll wird nicht über jede ID im Array iterieren ...

Vielleicht funktioniert es nicht für einen DB-Grund? Ich entwickle gerade auf MAMP ... vielleicht ist die db nicht für "atomare" Sachen eingerichtet (davon hab ich heute nur gehört!).

ich zuvor versucht hatte, eine foreach Schleife über die IDs verwenden, dann in der foreach habe gerade diese (edit: mehr Code!)

public function pushing() { 
    if ($this->request->is('post') || $this->request->is('put')) { 
     foreach ($this->request->data['User'] as $player => $flag) { 
      if ($flag) { 
       $this->User->id = $player; // set ID to player we want to save ($player is id that was suplpied in view to checkbox 
       $this->User->saveField('data', 'foo'); // then, push the data! 
      } 
     } 
     $this->Session->setFlash(__('Programs were pushed!')); 
    } 
    $this->autoRender = false; 
    $this->redirect(array('action' => 'index'));      
} 

Aber das verursacht seltsame Ergebnisse mit Umleitung. Egal, wo ich die Umleitung in dieser Aktion einsetze, die Sicherung wollte nur ihr eigenes Ding machen. Das $ this-> autoRender hat nichts gemacht. Die Steuerung versucht, noch an den/Schiebe-/Route

+0

Es sollte funktionieren wie es ist, indem Sie eine Anweisung 'IN()' erstellen. Hast du dein SQL-Protokoll überprüft? Es wäre auch gut, mehr Code zu sehen, wenn Sie Redirect-Probleme haben. – jeremyharris

+1

beide sollten gut funktionieren (der erste ist schneller, da es nur eine einzige atomare Abfrage ist). Ihr Problem könnte woanders liegen. – mark

Antwort

2

Geben Sie diesem einen Schuss :)

Ihrer Ansicht nach zu beheben:

<div class="view"> 
     <h2><?php echo h($program['Program']['title'])?></h1> 
     <?php echo $this->Form->create('User', array('action' => 'pushing')); ?> 
     <table id="pushTable"> 
      <tr><th colspan="5">Select the athletes you would like to push this program to:</th></tr> 
      <tr> 
      <?php $i=0; ?> 
      <?php foreach ($clients['Players'] as $player) {?> 
       <?php if ($i == 0) {?><tr><?php } ?> 
       <td><?php echo $this->Form->input('Player.' . $player['id']. '.id', array('type' => 'checkbox', 'value' => $player['id'])) . ' ' . $player['username'];?></td> 
       <?php if ($i == 4) {?></tr><?php $i = 0; } else { $i++; } ?> 
      <?php } ?> 
      </tr> 
     </table> 
     <?php echo $this->Form->end(__('Push')); ?> 
    </div> 

In Ihrem Controller:

public function pushing() { 
    if ($this->request->is('post') || $this->request->is('put')) { 
     $athletes = $this->request->data['Player']; 
     $athlete_ids = array(); 
     foreach($athletes as $a){ 
      $athlete_ids[$a['id']] = $a['id']; 
     } 

     $this->User->updateAll(
      array('User.data' => "'foo'"), 
      array('User.id' => $athlete_ids) 
     ); 
     $this->Session->setFlash(__('Programs were pushed!')); 
     } 
    } 
} 
+0

Danke William! Ich bin immer noch neu in Cake ... Warum funktioniert diese Methode, wo meine nicht? –

0

Hallo hatte Um den Code ein bisschen zu ändern, um es für mich zu arbeiten.

$contactsids = array(); 
    foreach($selected as $key => $val){ 
     if(($val <> '') && ($val <> 0)) {     
      $contactsids[$val] = $val; 
     }       
    } 

$this->Contact->updateAll(
    array('Contact.contact_category_id' => $category_id), 
    array('Contact.id' => $contactsids) 
); 
Verwandte Themen