解決しました!最終的な答えはこの質問の一番下にあります
CodeIgniter を使用してメニュー ビルダーを作成しようとしていますが、何らかの理由で、十分に単純に思えますが (PHP と CI は初めてです)、その概念に頭を悩ませることができないようです。これは、クエリと MVC パターンにのみ使用しているため、CodeIgniter 自体とはあまり関係がないはずです。
私は2つのテーブルを持っています:
メニュー:
- ID
- 名前
menu_pages:
- ID
- page_id (pages.id に関連)
- menu_id (menus.id に関連)
- item_name (メニューでの表示方法)
- item_order (ソート用)
- item_parent (サブメニューでアイテムをネストするため)
編集:これは私が達成しようとしている構造です:
array(
[0] => array(
[menu_id] => 1,
[menu_name] => 'Menu 1',
[menu_pages] => array(
[0] => array(
[id] => 1,
[page_id] => 1,
[menu_id] => 1,
[item_name] => 'Home',
[item_order] => 0,
[item_level] => 0,
[parent_id] => ''
),
[1] => array(
[id] => 2,
[page_id] => 2,
[menu_id] => 1,
[item_name] => 'About',
[item_order] => 0,
[item_level] => 0,
[parent_id] => ''
)
)
),
[1] => array(
[menu_id] => 2,
[menu_name] => 'Menu 2',
[menu_pages] => array(
[0] => array(
[id] => 3,
[page_id] => 3,
[menu_id] => 2,
[item_name] => 'Services',
[item_order] => 0,
[item_level] => 0,
[parent_id] => ''
),
[1] => array(
[id] => 4,
[page_id] => 4,
[menu_id] => 2,
[item_name] => 'Contact',
[item_order] => 0,
[item_level] => 0,
[parent_id] => ''
)
)
)
)
これが私がこれまでに得たものです(更新済み):
function GetMenus() {
$menus = $this->db->get('menus');
$menucols = $this->db->list_fields('menus');
$pages = $this->db->get('menu_pages');
$pagecols = $this->db->list_fields('menu_pages');
$arr = array();
$i = 0;
foreach($menus->result() as $menu) {
foreach($pages->result() as $page) {
foreach($pagecols as $col) {
$arr[$i][$col] = $page->$col;
}
foreach($menucols as $cols) {
$this->menus[$i][$cols] = $menu->$cols;
if($arr[$i]['menu_id'] === $menu->id) {
$this->menus[$i]['menu_pages'] = $arr[$i];
}
}
}
$i++;
}
return $this->menus;
}
上記は実際にこれを出力します:
Array(
[0] => Array(
[id] => 1,
[name] => default,
[menu_pages] => Array(
Array( /* missing #1, showing #2/2 */
[id] => 2
[page_id] => 1
[menu_id] => 1
[item_name] => About
[item_order] => 0
[item_level] => 0
[parent_id] =>
)
)
),
[1] => Array(
[id] => 2,
[name] => menu2,
[menu_pages] => Array(
Array( /* missing #3, showing #4/4 */
[id] => 4
[page_id] => 3
[menu_id] => 2
[item_name] => Contact
[item_order] => 0
[item_level] => 0
[parent_id] =>
)
)
)
)
ご覧のとおり、これは私が必要としているものにかなり近いですが、配列内で上書きされているように見えるため、欠落している項目があります (各メニューの最後のメニュー項目のみを表示しています - おそらく同じものを持っているようです)キー)。
すべてのヘルプと提案に感謝します!
編集:Mischaの回答に大まかに基づいた最終的な解決策は次のとおりです。
モデル:
function GetMenus() {
/* Yes, I know these can be chained, I unchained them to avoid
horizontal scrolling on SO */
$this->db->select('menus.name, menu_pages.*, pages.slug');
$this->db->join('menu_pages', 'menu_pages.menu_id = menus.id');
$this->db->join('pages', 'pages.id = menu_pages.page_id');
$this->db->order_by('item_order', 'ASC');
$menus = $this->db->get('menus');
$result = array();
foreach($menus->result() as $menu) {
$result[$menu->name][$menu->id] = array(
'page_id' => $menu->page_id,
'menu_id' => $menu->menu_id,
'item_name' => $menu->item_name,
'item_slug' => $menu->slug,
'item_order' => $menu->item_order,
'item_level' => $menu->item_level,
'parent_id' => $menu->parent_id
);
}
return $result;
}
コントローラ:
$this->menu = $this->page->GetMenus();
意見:
<ul class="nav">
<?php foreach($this->menu['default'] as $item) { ?>
<li>
<a href="<?php echo $item['item_slug']; ?>">
<?php echo $item['item_name']; ?>
</a>
</li>
<?php } ?>
</ul>