控制器中的代码:
public function testt(){
//$title="练习册";
//$content='<br>'.$_GET['name'];
//$this->assign('title',$title);
$User = M('name');
$list = $User->select();
$this->assign('list',$list);
$this->assign("title","SMARTY测试");
$this->display();
}
模板中的代码:
{$title}<br />
<hr />
<foreach name="list" item="vo">
{$vo.age}{$vo.name}<hr />
</foreach>
重要去掉foreach部分就正常,否则就会出显这样
syntax error, unexpected ')', expecting T_VARIABLE or '$' D:\AppServ\www\App\admin\Runtime\Cache\6e178638460c8ba2282739c247c2ce14.php 第 10 行.cache文件中的代码为:
<body>
<?php echo ($title); ?><br />
<hr />
<?php if(is_array($)): foreach($ as $key=>$): echo ($vo["age"]); echo ($vo["name"]); ?><hr /><?php endforeach; endif; ?>
</body>
看来好久也没有头绪,怎么办啊?
thinkphpforeach
public function testt(){
//$title="练习册";
//$content='<br>'.$_GET['name'];
//$this->assign('title',$title);
$User = M('name');
$list = $User->select();
$this->assign('list',$list);
$this->assign("title","SMARTY测试");
$this->display();
}
模板中的代码:
{$title}<br />
<hr />
<foreach name="list" item="vo">
{$vo.age}{$vo.name}<hr />
</foreach>
重要去掉foreach部分就正常,否则就会出显这样
syntax error, unexpected ')', expecting T_VARIABLE or '$' D:\AppServ\www\App\admin\Runtime\Cache\6e178638460c8ba2282739c247c2ce14.php 第 10 行.cache文件中的代码为:
<body>
<?php echo ($title); ?><br />
<hr />
<?php if(is_array($)): foreach($ as $key=>$): echo ($vo["age"]); echo ($vo["name"]); ?><hr /><?php endforeach; endif; ?>
</body>
看来好久也没有头绪,怎么办啊?
thinkphpforeach
static $_iterateParseCache = array();
//如果已经解析过,则直接返回变量值
$cacheIterateId = md5($attr.$content);
if(isset($_iterateParseCache[$cacheIterateId]))
return $_iterateParseCache[$cacheIterateId];
$tag = $this->parseXmlAttr($attr,'foreach');
$name = $tag['name'];
$item = $tag['item'];
$key = !empty($tag['key'])?$tag['key']:'key';
$name = $this->autoBuildVar($name);
$parseStr = '<?php if(is_array('.$name.')): foreach('.$name.' as $'.$key.'=>$'.$item.'): ?>';
$parseStr .= $this->tpl->parse($content);
$parseStr .= '<?php endforeach; endif; ?>';
$_iterateParseCache[$cacheIterateId] = $parseStr;
if(!empty($parseStr)) {
return $parseStr;
}
return ;
}
稍微查了下解析foreach标签的源码,这个并不是list变量为空,其实是没取到标签里name和item的值,具体原因楼主可以自己去查源码排除下,当然最简单的解决办法就是改用volist标签。
我看了是 $this->parseXmlAttr($attr,'foreach')执行后$tag没值??????????????
结果在源码里测就是parseXmlAttr函数里面出的问题。可是会是源码的问题么
//XML解析安全过滤
$attr = str_replace('&','___', $attr);
$xml = '<tpl><tag '.$attr.' /></tpl>';
$xml = simplexml_load_string($xml);
if(!$xml) {
throw_exception(L('_XML_TAG_ERROR_').' : '.$attr);
}
$xml = (array)($xml->tag->attributes());
$array = array_change_key_case($xml['@attributes']);
if($array) {
$attrs = explode(',',$this->tags[strtolower($tag)]['attr']);
if(isset($this->tags[strtolower($tag)]['must'])){
$must = explode(',',$this->tags[strtolower($tag)]['must']);
}else{
$must = array();
}
foreach($attrs as $name) {
if( isset($array[$name])) {
$array[$name] = str_replace('___','&',$array[$name]);
}elseif(false !== array_search($name,$must)){
throw_exception(L('_PARAM_ERROR_').':'.$name);
}
}
return $array;
}
}
再顺着查一下源码不就好了么,不清楚的变量就打印一下,很容易就能找出问题来,源码有错误也不是什么稀奇的事,也可能是书写格式不对。
//XML解析安全过滤
$attr = str_replace('&','___', $attr);
$xml = '<tpl><tag '.$attr.' /></tpl>';
$xml = simplexml_load_string($xml);
if(!$xml) {
throw_exception(L('_XML_TAG_ERROR_').' : '.$attr);
}
$xml = (array)($xml->tag->attributes());
$array = array_change_key_case($xml['@attributes']);
if($array) {
$attrs = explode(',',$this->tags[strtolower($tag)]['attr']);
if(isset($this->tags[strtolower($tag)]['must'])){
$must = explode(',',$this->tags[strtolower($tag)]['must']);
}else{
$must = array();
}
foreach($attrs as $name) {
if( isset($array[$name])) {
$array[$name] = str_replace('___','&',$array[$name]);
}elseif(false !== array_search($name,$must)){
throw_exception(L('_PARAM_ERROR_').':'.$name);
}
}
return $array;
}
}
再顺着查一下源码不就好了么,不清楚的变量就打印一下,很容易就能找出问题来,源码有错误也不是什么稀奇的事,也可能是书写格式不对。控制器里面传给模板的数组是$select=array('id'=>1,'name'=>'yan');
在进过foreach标签处理就是它里面的函数parseXmlAttr($attr,$tag)中的这句话
$xml = (array)($xml->tag->attributes());得到的$xml是array(0){}
他处理后就变为空数组了,这个函数就没有返回数据。
就是这一步。和你发的对比了一下。源码就是这样的啊,到底那不错了啊?????????
volist和foreach还有for效果都是一样的。
纠结,好好地数组,传给源码后就被处理为空了。
我下载的是官网上的3.1.3,会不会是编程平台的问题我用的是EclipsePHP Studio v1.2.2。
开发环境用的是集成的appserv。有弄了一下午,在网上也有人说是有bug,就是parseXmlAttr($attr,$tag) 中的
$xml = (array)($xml->tag->attributes());
使用foreach遍历给$array,我试了试,这样有输出数组正常,可是在TagLibCx中进行字符串链接的时候,出现字符串链接不上的情况
为啥就thinkphp的标签出问题呢???????