【发布时间】:2015-05-18 06:16:55
【问题描述】:
我正在尝试在 CodeIgniter 中为我的应用程序开发一个小部件系统。我有一个循环遍历的模板列的数据库表。然后从该循环中循环遍历该列的小部件表。加载小部件的数据库信息后,我需要确定为当前小部件加载的文件并将其添加为小部件的主体。加载的视图文件存储在小部件数组的 body 变量中。
问题是在加载主视图文件之前显示小部件内容。小部件的内容需要在主视图文件中。我做错了什么?
我的控制器:
$widget_types = $this->widget->type_array();
foreach($columns as $column){
$column_results[$column['column_id']] = $column;
$widgets = $this->widget->retrieve($column['column_id']);
foreach($widgets as $widget){
$widgets[$widget['id']]['body'] = $this->load->view('widgets/'.$widget_types[$widget['type']]['view'], array('widget' => $widget));
}
$column_results[$column['column_id']]['widgets'] = $widgets;
}
$data['column_results'] = $column_results;
$this->load->view('index_body', $data);
小部件模型:
<?php
class Widget extends MY_Model {
var $info = array();
var $error = NULL;
function __construct(){
parent::__construct();
$this->error = NULL;
}
function get_info($widget_id){
$this->db->from('template_widgets')->where('widget_id', $widget_id)->limit(1);
if($query = $this->db->get()){
if($query->num_rows() > 0){
$widget = $query->row_array();
$info = array(
'id' => $widget['widget_id'],
'title' => $widget['title'],
'column_id' => $widget['column_id'],
'position' => $widget['position'],
'options' => unserialize($widget['options']),
'type' => $widget['type']
);
$this->info = $info;
}
}
}
function retrieve($column_id){
$widget_results = array();
$this->db->from('template_widgets')->where('column_id', $column_id)->order_by('position', 'asc');
if($query = $this->db->get()){
if($query->num_rows() > 0){
foreach($query->result_array() as $widget){
if(empty($widget_results[$widget['widget_id']])){
$this->get_info($widget['widget_id']);
if($this->error == NULL){
$widget_results[$widget['widget_id']] = $this->info;
}
}
}
}
}
return $widget_results;
}
function type_array($type = ''){
$widget_types = array(
0 => array(
'name' => 'Category Feed',
'view' => 'category_feed'
),
1 => array(
'name' => 'Members Feed',
'view' => 'members_feed'
),
2 => array(
'name' => 'Events Feed',
'view' => 'events_feed'
),
3 => array(
'name' => 'Category List',
'view' => 'category_list'
),
4 => array(
'name' => 'Testimonials',
'view' => 'Testimonials'
),
5 => array(
'name' => 'Events Calendar',
'view' => 'events_calendar'
),
6 => array(
'name' => 'Content',
'view' => 'content'
),
7 => array(
'name' => 'Statistics Feed',
'view' => 'statistics_feed'
)
);
return ($type == '') ? $widget_types : $widget_types[(int) $type];
}
}
小部件视图文件示例:
<?php
$str = '';
$CI =& get_instance();
$CI->load->model('member');
$members = $CI->member->result_array($widget['options']['max_results'], $widget['options']['order_column']);
foreach($members as $member){
if($widget['options']['display_method'] == '1'){
$str .=
'<div class="col-sm-6 col-md-4">
<div class="thumbnail">
'.img(array('src' => attachment_url($member['avatar']['file_name']), 'width' => '192', 'height' => '108', 'border' => '0', 'alt' => 'Article Thumbnail', 'class' => 'img-thumbnail')).'
<div class="caption">
<h4>'.anchor('members/'.url_title($member['display_name']).'/'.$member['id'], $member['display_name']).'</h4>
<p>Joined on '.$member['date_joined'].'</p>
</div>
</div>
</div>
';
} else {
$str .=
'<div class="media">
<div class="media-left">
'.img(array('src' => attachment_url($member['avatar']['file_name']), 'width' => '192', 'height' => '108', 'border' => '0', 'align' => 'left', 'alt' => 'Article Thumbnail', 'class' => 'img-thumbnail')).'
</div>
<div class="media-body">
<div class="media-heading">
<h4>'.anchor('articles/'.url_title($member['display_name']).'/'.$member['id'], $member['display_name']).'</h4>
<p>Joined on '.$member['date_joined'].'</p>
</div>
</div>
</div>
';
}
}
echo $str;
索引体视图文件:
<?php
$CI =& get_instance();
$str = '
<div class="container">
<section id="content">
<div class="row">
';
if(count($column_results) > 0){
foreach($column_results as $id => $column){
$str .= '<div class="col-md-'.$column['width'].'">
';
if(count($column['widgets']) > 0){
foreach($column['widgets'] as $id => $widget){
$str .= '<div class="panel panel-default">
<div class="panel-heading">
<h3>'.$widget['title'].'</h3>
</div>
<div class="panel-body">
'.$widget['body'].'
</div>
</div>
';
}
}
$str .= '</div>
';
}
}
$str .= '</div>
</section>
</div>
';
echo $str;
【问题讨论】:
标签: php codeigniter