我有一个将值存储到变量中的解析器(duh)。这里讨论的变量是:
$item[2] <- contains the string 'facebook'
我有一个包含选择菜单的 html 表单。菜单是根据我的数据库中存储的内容动态填充的。这就是我的菜单的构建方式:
<?php
$formats = $wpdb->get_results($wpdb->prepare("
SELECT * FROM table
WHERE taxonomy = 'format'
"));
?>
<div id="format" class="form">
Format: <?php echo $item[2]; ?> <!-- echoes the variable to know it works -->
<?php
$terms = array();
foreach($formats as $key => $term){
$terms[$term->parent][$term->term_id] = $term;
}
?>
<select name="formats">
<option value="empty"></option>
<?php printTerms($terms, $item); ?> <!--- THIS DOESN'T APPEAR TO PASS $item INTO THE FUNCTION -->
</select>
</div>
<?php
function printTerms($terms, $item, $parent = 0, $deep = 0){ // HOW DO I USE $item ???
if(count($terms[$parent]) > 0){
$indent = "";
for($i = 0; $i < $deep; $i++){
$indent .= " ";
}
foreach($terms[$parent] as $key => $term){
if(count($terms[$term->term_id]) > 0){
if($deep == 0){
echo "<option class='toplevel' value='".$term->name."' ".$selected.">".$term->name."</option>"; // <- Outputs top level parents
} else {
echo "<option class='child".$deep."' value='".$term->name."' ".$selected.">".$indent.$term->name."</option>"; // <- Outputs children that are also parents
}
printTerms($terms, $term->term_id, ($deep+1));
} else {
echo "<option class='solo' value='".$term->name."' ".$selected.">".$indent.$term->name."</option>"; // <- outputs bottom level children and solos.
}
}
}
}
?>
到目前为止一切正常,但这是我的问题。
我想做的是,如果 items[2] 包含字符串“Facebook”(确实如此),则默认选择相应的菜单选项。
我确实让它在像这样的简单静态选择菜单中工作:
foreach ($formats as $format) {
$selected = '';
if ($item[2] == 'facebook' || $item[2] == 'wall' && $format->slug == 'facebook'){
$selected = 'selected';
}
echo "<option value='".$format->name."' ".$selected.">".$format->name."</option>";
}
$format->slug 是包含我想要匹配到 $item[2] 的值。 因此,$term->slug 对应于 $format->slug。
$format->name 是输出到菜单本身的选择选项的标题。 同样,$term->name 对应于 $format->name。
$formats 访问这个 MySQL 表:
term_id name slug taxonomy parent
1 Entry Form entry-form format 0
2 Page page format 3
3 Facebook facebook format 0
4 Entry Form facebook-entry-form format 3
5 Twitter twitter format 0
6 Single single format 2
您会注意到我已经将 $selected 变量插入到我的函数中。我的问题是我无法让上面的代码在 printTerms 函数的上下文中工作。
就我的问题而言,假设任何变量中都没有空格(我检查过)。
需要牢记的一些规则:
$term->slug 和 $item[2] 并不总是匹配。如果 $item[2] 是 'wall',这也应该导致默认选择 'facebook'。 (见我上面的代码)。
所以问题是,如何将我的 printTerms() 函数与我的选择代码结合起来?
最佳答案
为了测试,我稍微修改了您的代码以在没有数据库的情况下工作。真正的“改变”是我修改了 count()使用 isset()相反。
细微的变化是选项现在以换行符分隔,函数不输出任何内容,而是返回输出。
由此生成的 HTML 确实在我的 Firefox 浏览器中显示为默认选择的“Facebook”。
(缩进,为了易读性删除了 </option>)
<html><body><select>
<option class='solo' value='Entry Form'>Entry Form
<option class='toplevel' value='Facebook' selected="selected">Facebook
<option class='child1' value='Page' > Page
<option class='solo' value='Single' > Single
<option class='solo' value='Entry Form'> Entry Form
<option class='solo' value='Twitter' >Twitter
</select></body></html>
PHP测试用例如下:
<?php
$formats = array(
array('term_id' => 1, 'name' => 'Entry Form', 'slug' => 'entry-form', 'taxonomy' => 'format', 'parent' => 0),
array('term_id' => 2, 'name' => 'Page', 'slug' => 'page', 'taxonomy' => 'format', 'parent' => 3),
array('term_id' => 3, 'name' => 'Facebook', 'slug' => 'facebook', 'taxonomy' => 'format', 'parent' => 0),
array('term_id' => 4, 'name' => 'Entry Form', 'slug' => 'facebook-entry-form', 'taxonomy' => 'format', 'parent' => 3),
array('term_id' => 5, 'name' => 'Twitter', 'slug' => 'twitter', 'taxonomy' => 'format', 'parent' => 0),
array('term_id' => 6, 'name' => 'Single', 'slug' => 'single', 'taxonomy' => 'format', 'parent' => 2),
);
$terms = array();
foreach($formats as $term){
$a = $term['parent'];
$b = $term['term_id'];
$terms[$a][$b] = $term;
}
function printTerms($terms, $parent = 0, $deep = 0, $item){
$output = '';
if(count($terms[$parent]) > 0){
$indent = "";
for($i = 0; $i < $deep; $i++){
$indent .= " ";
}
foreach($terms[$parent] as $key => $term)
{
$selected = ($item == $term['slug']) ? ' selected="selected"' : '';
if(isset($terms[$term['term_id']]))
{
if($deep == 0){
$output .= "<option class='toplevel' value='".$term['name']."'".$selected.">".$term['name']."</option>"; // <- Out
puts top level parents
} else {
$output .= "<option class='child".$deep."' value='".$term['name']."'".$selected.">".$indent.$term['name']."</option>";
// <- Outputs children that are also parents
}
$output .= "\n";
$output .= printTerms($terms, $term['term_id'], ($deep+1), $item);
} else {
$output .= "<option class='solo' value='".$term['name']."'".$selected.">".$indent.$term['name']."</option>"; // <- outputs
bottom level children and solos.
$output .= "\n";
}
}
}
return $output;
}
print "<html><body><select>";
print printTerms($terms, 0, 0, 'facebook');
print "</select></body></html>";
?>
更新:我们可以在之前的 printTerms 的基础上进行构建函数进行更灵活的匹配。
首先我们重命名printTerms()至 printTermsBase()我们从中删除了所有对选项选择的引用。输出将是一堆形式的行
<option class='something' value='somethingelse'>text</option>
现在我们可以对输出运行文本匹配。下面的函数,当传入“wall”时,会选择“wall”;如果没有“wall”,它将选择“facebook”;如果那也不存在,它将不选择任何内容。您可以反转数组以便选择“wall”,除非 facebook 存在。文本匹配是精确的:“facebook-form”将被忽略。如果你想为“facebook-form”匹配“facebook”,你需要使用 preg*功能。
function printTerms($terms, $item)
{
$items = array($item, 'facebook');
$options = printTermsBase($terms, 0, 0);
foreach($items as $raw)
{
// We could use preg_match here for even greater flexibility
$search="value='$raw'";
if (false === strpos($options, $search))
continue;
// One of the option matches.
// We just replace value='something'
// with value='something' selected='selected'
return str_replace($search, $search.' selected="selected"', $options);
}
// No match. Return options unchanged.
return $options;
}
关于php - 无法在循环中选择表单选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14271028/
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("