Tables
Product Plan ProductPlan
id |name id |name id | product_id | plan_id
1 aplha 1 a 1 1 2
2 bravo 2 b 2 4 c
3 charlie 4 c
4 delta
I want to print Plan name against related Product, like that
View which i want
alpha | delta |
a c
b
but it showing me like,
alpha | bravo | charlie |delta
a
b
c
This is my controller code
$p_plan = $this->ProductPlan->find('all',array(
'conditions'=>array(
'ProductPlan.product_id'=>'Product.product_id'
)
)
);
$this->set('p_plan', $p_plan);
this is my view code,
<table>
<thead>
<tr>
<?php foreach ($p as $ps){?>
<th>
<?php echo __l($ps['Product']['name']);?>
</th>
<?php }?>
</tr>
</thead>
<tbody>
<?php foreach ($p as $p1){
foreach($p1['Plan'] as $plan){
debug($plan);
?>
<tr>
<td>
<?php echo __l($plan['name']);?>
</td>
</tr>
<?php }
}?>
</tbody>
what is wrong in my view ?if some body help me , i'll be very thaksful to him. Thanks in advance.
Apparently I can't comment, but I'll try to answer as best I can. Since you don't mention p_plan in your view, and your don't show were $p is created it's kind of hard to tell what is actually going on.
The workflow: - Get the 3 tables - Sort them into an array of arrays of product_id => plan_id - track the product_ids to the column numbers - pass that array to the view - in the view print the array as row = column
Controller:
//get just the productplan table
$p_plan = $this->ProductPlan->find('all',array(
'conditions'=>array(
'ProductPlan.product_id'=>'Product.product_id'
),'recursive' => -1
));
//get just the products table
$products = $this->Product->find('list',array(
'fields' => array('id','name')
));
//get just the plans table
$plans = $this->Plan->find('list',array(
'fields' => array('id','name')
));
//holder is a table to store counting variables
$holder = array(null);
//final_p_plan will be passed to the view. Array of arrays sorted as product_id => plan_ids
$final_p_plan = array(null);
//p_plan_ids will be passed to the view. Stores an array of used product id
$p_plan_ids = array(null);
//max_length is keeping track of how long the longest one is. will be passed to view. needed for the loop.
$max_length = 0;
//want to end up with an array we can just loop through and print off
foreach($p_plan as $p)
{
//if it's empty set row 0 as product name, then row 1 as the active plan name. else set the next row to the next plan name
if(empty($holder[[$p['product_id']]]))
{
$holder[[$p['product_id']]]['i'] = 2;
$final_p_plan[$p['product_id']][0] = $products[$p['product_id']];
$final_p_plan[$p['product_id']][1] = $plans[$p['plan_id']];
array_push($p_plan_ids,$p['product_id']);
} else {
$final_p_plan[$p['product_id']][$holder[[$p['product_id']]]['i']] = $plans[$p['plan_id']];
$holder[[$p['product_id']]]['i'] = $holder[[$p['product_id']]]['i'] + 1;
if($holder[[$p['product_id']]]['i'] > $max_length)
{
$max_length = $holder[[$p['product_id']]]['i'];
}
}
}
$this->set('final_p_plan', $final_p_plan);
$this->set('p_plan_ids', $p_plan_ids);
$this->set('max_length', $max_length);
View:
<table>
<?php $i = 0; while($i < max_length): ?>
<?php if($i == 0): ?>
<thead>
<tr>
<?php foreach($p_plan_ids as $id): ?>
<th>
<?php echo $final_p_plan[$id][$i]; ?>
</th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<?php else: ?>
<tr>
<?php foreach($p_plan_ids as $id): ?>
<th>
<?php echo $final_p_plan[$id][$i]; ?>
</th>
<?php endforeach; ?>
</tr>
<?php endif; $i++; ?>
<?php endwhile; ?>
</tbody>
</table>
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.