我有以下数据库和 php。我正在尝试制作一个无序列表的类别菜单。 原来的 php 是自己工作的。 我正在尝试在 codeigniter 中将其转换为 MVC,以下是我到目前为止所得到的但无法正常工作的内容。 如果有人能指出我做错了什么,我将不胜感激。
数据库
CREATE TABLE IF NOT EXISTS `categories` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`shortdesc` varchar(255) NOT NULL,
`longdesc` text NOT NULL,
`status` enum('active','inactive') NOT NULL,
`parentid` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;
--
-- Dumping data for table `categories`
--
INSERT INTO `categories` (`id`, `name`, `shortdesc`, `longdesc`, `status`, `parentid`) VALUES (1, 'shoes', 'Shoes for boys and girls.', '', 'active', 7);
INSERT INTO `categories` (`id`, `name`, `shortdesc`, `longdesc`, `status`, `parentid`) VALUES (2, 'shirts', 'Shirts and blouses!', '', 'active', 7);
...
...
menu.php(原始 php 和工作)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>View Tasks</title>
</head>
<body>
<h3>Menu</h3>
<?php
function make_list ($parent) {
global $data;
echo '<ul>';
foreach ($parent as $task_id => $todo) {
echo "<li>$todo";
if (isset($data[$task_id])) {
make_list($data[$task_id]);
}
echo '</li>';
}
echo '</ul>';
}
$dbc = @mysqli_connect ('localhost', 'root1', 'root', 'ci_day6') OR die ('<p>Could not connect to the database!</p></body></html>');
$q = 'SELECT id, parentid, name FROM categories ORDER BY parentid ASC';
$r = mysqli_query($dbc, $q);
$data = array();
while (list($id, $parentid, $name) = mysqli_fetch_array($r, MYSQLI_NUM)) {
$data[$parentid][$id] = $name;
}
make_list($data[0]);
?>
</body>
</html>
此 php 输出以下 html
Menu
* clothes
o shoes
o shirts
o pants
o dresses
* fun
o toys
o games
我的 MVC 到目前为止还没有工作。
cat_menu_model.php(模型)
<?php
class Cat_menu_model extends Model
{
function Cat_menu_model()
{
parent::Model();
}
function get_categories_nav()
{
$data = array();
$this->db->select('id,name,parentid');
$this->db->where('status', 'active');
$this->db->orderby('parentid','asc');
$this->db->orderby('name','asc');
$Q = $this->db->get('categories');
if ($Q -> num_rows() > 0){
foreach ($Q -> result_array() as $row){
$data[$row['parentid']][$row['id']] = $row['name'];
}
}
$Q->free_result();
return $data;
}
}
cat_menu.php( Controller )
<?php
class Cat_menu extends Controller
{
function Cat_menu()
{
parent::Controller();
}
function make_menu($parent)
{
$this->load->model('cat_menu_model');
$data['navlist'] = $this->cat_menu_model->get_categories_nav();
$this -> load ->view('menu');
}
}
菜单.php( View )
<?php
if (count($navlist))
{
$this->make_menu($data[0]);
echo '<ol>';
foreach ($parent as $id => $catname) {
echo "<li>$catname";
if (isset($data[$id])) {
make_menu($data[$id]);
}
echo '</li>';
}
echo '</ol>';
}
?>
它显示错误信息。
A PHP Error was encountered
Severity: Warning
Message: Missing argument 1 for Cat_menu::make_menu()
Filename: controllers/cat_menu.php
Line Number: 10
最佳答案
鉴于上面的 PHP 错误消息,它表示您已经告诉方法 Cat_menu::make_menu() 接受一个参数。在这种情况下,Cat_menu Controller 中的函数 make_menu($parent)。
如果此函数不需要任何输入——看起来不像使用 $parent——那么只需从 make_menu 中删除 $parent 参数。
或者,如果您希望函数不接受任何参数,则设置一个默认值。见下文:
cat_menu.php( Controller )
<?php
class Cat_menu extends Controller
{
function Cat_menu()
{
parent::Controller();
}
function make_menu($parent = FALSE) //Is this $parent argument needed?
{
$this->load->model('cat_menu_model');
$data['navlist'] = $this->cat_menu_model->get_categories_nav();
//If you want to parse data to a view you need to state it
$this->load->view('menu', $data);
}
}
假设您的其余代码是正确的,现在应该可以工作了。请参阅CodeIgniter User Guide供以后引用。特别是 views documentation关于解析值。
OP* 已在下面的评论中做出回应,这是我的回应。
**OP = 原始海报*
在 View 中运行 print_r($navlist) 时。 OP 获得以下输出:
Array (
[0] => Array (
[7] => clothes
[8] => fun
)
[7] => Array (
[3] => pants
[2] => shirts
[1] => shoes
)
[8] => Array (
[6] => games
[5] => toys
)
)
但是,值得注意的是,OP 的 CI 模型 ActiveRecord 查询与原始的——非 MVC——查询有很大不同:
SELECT
id,
parentid,
name
FROM
categories
ORDER BY
parentid ASC
对比
$this->db->select('id,name,parentid');
$this->db->where('status', 'active');
$this->db->orderby('parentid','asc');
$this->db->orderby('name','asc');
$Q = $this->db->get('categories');
CI 模型查询与最初的原始 SQL 不同。当转换为 SQL 时,它将产生以下结果:
SELECT
id,
name,
parentid
FROM
categories
WHERE
status = 'active'
ORDER BY
parentid ASC,
name ASC
但是,这似乎是带回的正确数据,所以我将继续。
OP 希望数组的格式像层次结构一样。为了将来引用,请参阅:PHP/MySQL - building a nav menu hierarchy .最简单的方法是遵循 OP 的原始(非 MVC)功能并将其添加为模型功能。此模型函数将创建一个嵌套数组,而不是直接的 html 输出——这样做的原因是将应用程序逻辑与输出分开。
您可以将以下内容作为函数添加到您的模型中。最初取自 Nested sets, php array and transformation但由于 OP 出现错误而重写:
function to_hierarchy($collection = NULL)
{
if (is_null($collection)) return false;
$tree = array();
foreach($collection[0] as $key => $value)
{
$tree[$value] = array();
foreach($collection[$key] as $item)
{
array_push($tree[$value], $item);
}
}
return $tree;
}
现在我们可以将 Controller 更新为以下内容:
cat_menu.php( Controller )
<?php
class Cat_menu extends Controller
{
function Cat_menu()
{
parent::Controller();
}
function make_menu($parent = FALSE) //Is this $parent argument needed?
{
$this->load->model('cat_menu_model');
$get_nav_list = $this->cat_menu_model->get_categories_nav();
$format_nav_list = $this->cat_menu_model->to_hierarchy($get_nav_list);
//Load the HTML helper for ul/ol conversion
$this->load->helper('html');
$data['navlist'] = $format_nav_list;
//If you want to parse data to a view you need to state it
$this->load->view('menu', $data);
}
}
现在我们可以更新我们的 View 如下:
menu.php( View )
<?php
echo ul($navlist);
?>
免责声明: 以上均未使用 PHP 进行测试,因为我目前无法从这台计算机访问解释器。请确保检查任何语法。
关于php - 如何从 native php 转换为 codeigniter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1550105/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]