0

I have a simple cakephp 2.x app that I baked using the bake script. The two main tables are conditions and drugs. A condition HABTM drugs and vice verca. I'm trying to display the drugs that belong to a condition in the condition index, basic listing all conditions, but ONLY those drugs. I have tried doing it like this, to display the drugs belonging to a condition in a comma seperated list, which works in another 1.3 app:

<?php 
    $condition_drugs = '';
    foreach($condition['Drug'] as $drug):
      $condition_drugs .= $drug['drug'] . ', ';
      //echo $drug['generic'];
    endforeach;
    //echo substr($condition_drugs, 0, -2);
    echo $condition_drugs;
?>

But it gives the following two errors: Undefined index: Drug [APP/View/Conditions/index.ctp, line 22], and Invalid argument supplied for foreach() [APP/View/Conditions/index.ctp, line 22]

I also looked at another article here that suggested doing it in a similar way. Is there something wrong with the code I have? Do I need a find in my model based on the ID? Here's the full index view code and controller:

View:

<div class="conditions index">
    <h2><?php echo __('Conditions'); ?></h2>
    <table cellpadding="0" cellspacing="0">
    <tr>
            <th><?php echo $this->Paginator->sort('condition'); ?></th>
            <th><?php echo $this->Paginator->sort('principles'); ?></th>
            <th><?php echo $this->Paginator->sort('treatment'); ?></th>
            <th><?php echo $this->Paginator->sort('clinical_tips'); ?></th>
            <th>Drugs</th>
            <th class="actions"><?php echo __('Actions'); ?></th>
    </tr>
    <?php
    foreach ($conditions as $condition): ?>
    <tr>
        <td><?php echo h($condition['Condition']['condition']); ?>&nbsp;</td>
        <td><?php echo h($condition['Condition']['principles']); ?>&nbsp;</td>
        <td><?php echo h($condition['Condition']['treatment']); ?>&nbsp;</td>
        <td><?php echo h($condition['Condition']['clinical_tips']); ?>&nbsp;</td>
    <td>
        <?php 
            $condition_drugs = '';
            foreach($condition['Drug'] as $drug):
              $condition_drugs .= $drug['drug'] . ', ';
              //echo $drug['generic'];
            endforeach;
            //echo substr($condition_drugs, 0, -2);
            echo $condition_drugs;
        ?>
    </td>
        <td class="actions">
            <?php echo $this->Html->link(__('View'), array('action' => 'view', $condition['Condition']['id'])); ?>
            <?php echo $this->Html->link(__('Edit'), array('action' => 'edit', $condition['Condition']['id'])); ?>
            <?php echo $this->Form->postLink(__('Delete'), array('action' => 'delete', $condition['Condition']['id']), null, __('Are you sure you want to delete # %s?', $condition['Condition']['id'])); ?>
        </td>
    </tr>
<?php endforeach; ?>
    </table>
    <p>
    <?php
    echo $this->Paginator->counter(array(
    'format' => __('Page {:page} of {:pages}, showing {:current} records out of {:count} total, starting on record {:start}, ending on {:end}')
    ));
    ?>  </p>

    <div class="paging">
    <?php
        echo $this->Paginator->prev('< ' . __('previous'), array(), null, array('class' => 'prev disabled'));
        echo $this->Paginator->numbers(array('separator' => ''));
        echo $this->Paginator->next(__('next') . ' >', array(), null, array('class' => 'next disabled'));
    ?>
    </div>
</div>
<div class="actions">
    <h3><?php echo __('Actions'); ?></h3>
    <ul>
        <li><?php echo $this->Html->link(__('New Condition'), array('action' => 'add')); ?></li>
    </ul>
</div>

Controller:

<?php
App::uses('AppController', 'Controller');
/**
 * Conditions Controller
 *
 * @property Condition $Condition
 */
class ConditionsController extends AppController {

/**
 * index method
 *
 * @return void
 */
    public function index() {
    $this->set('title_for_layout','Condition Index');
        $this->Condition->recursive = 0;
        $this->set('conditions', $this->paginate());
    }

/**
 * view method
 *
 * @throws NotFoundException
 * @param string $id
 * @return void
 */
    public function view($id = null) {
        $this->Condition->id = $id;
        if (!$this->Condition->exists()) {
            throw new NotFoundException(__('Invalid condition'));
        }
        $this->set('condition', $this->Condition->read(null, $id));
    }

/**
 * add method
 *
 * @return void
 */
    public function add() {
        if ($this->request->is('post')) {
            $this->Condition->create();
            if ($this->Condition->save($this->request->data)) {
                $this->Session->setFlash(__('The condition has been saved'));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The condition could not be saved. Please, try again.'));
            }
        }
    $drugs = $this->Condition->Drug->find('list',array('fields'=>array('id','generic')));
    $this->set(compact('drugs'));
    }

/**
 * edit method
 *
 * @throws NotFoundException
 * @param string $id
 * @return void
 */
    public function edit($id = null) {
        $this->Condition->id = $id;
        if (!$this->Condition->exists()) {
            throw new NotFoundException(__('Invalid condition'));
        }
        if ($this->request->is('post') || $this->request->is('put')) {
            if ($this->Condition->save($this->request->data)) {
                $this->Session->setFlash(__('The condition has been saved'));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The condition could not be saved. Please, try again.'));
            }
        } else {
            $this->request->data = $this->Condition->read(null, $id);
        }
    $drugs = $this->Condition->Drug->find('list',array('fields'=>array('id','generic')));
    $this->set(compact('drugs'));
    }

/**
 * delete method
 *
 * @throws MethodNotAllowedException
 * @throws NotFoundException
 * @param string $id
 * @return void
 */
    public function delete($id = null) {
        if (!$this->request->is('post')) {
            throw new MethodNotAllowedException();
        }
        $this->Condition->id = $id;
        if (!$this->Condition->exists()) {
            throw new NotFoundException(__('Invalid condition'));
        }
        if ($this->Condition->delete()) {
            $this->Session->setFlash(__('Condition deleted'));
            $this->redirect(array('action' => 'index'));
        }
        $this->Session->setFlash(__('Condition was not deleted'));
        $this->redirect(array('action' => 'index'));
    }
}
Jonathan
  • 166
  • 5
  • 17
  • Is something like [this](http://stackoverflow.com/questions/11986746/cakephp-find-all-query-on-multiple-models) what you're trying to achieve? – Hoff Aug 17 '12 at 16:46
  • @ALS Line 22 is `foreach($condition['Drug'] as $drug):` @Hoff Is it not possible to do without changing the relationship? I'm generating a list of drug checkboxes for all the drugs. So that when a new condition is added, they can just check the related drugs. I'm not sure if changing the relationship would require changing that as well. And it looks like I would need a find call for each condition id? – Jonathan Aug 17 '12 at 17:51

1 Answers1

1

To include habtm data, you need $recursive = 1; You have set it to 0

Ceeram
  • 748
  • 4
  • 9