在我们一天一天web开发任务,这是必要的,我们的工作与客户端和服务器端代码。我们用PHP编写的业务逻辑和生成在用户的浏览器显示的HTML。然后,我们使用的框架,如jQuery或原型,提供客户端交互。
现在想想如何可以改变和操作使用服务器端的PHP代码生成的HTML。phpQuery是最终的解决方案,将来到你的头脑。如果你还没有听说过有关phpQuery在这篇文章中,您可能会感兴趣,因为我给你一个简短的介绍的phpQuery和解释如何可以使用它在现实世界中的项目。
什么是phpQuery
phpQuery是服务器端,链式,CSS3选择器驱动的文档对象模型(DOM)API jQuery JavaScript库的基础上。
这是官方给出的定义phpQuery项目页面。如果你已经使用jQuery,那么你将有一个想法如何,它可以简化许多任务需要DOM操作。phpQuery提供完全要在你的服务器端PHP代码使用相同的功能。凌乱的HTML代码生成,使用echo语句和类似的方法,你可以说再见。
你将有机会获得大部分由jQuery的在phpQuery提供的功能,它可以大致可分为以下提到的4个任务分为:
创建DOM元素
选择和操作元素
遍历DOM的
打印输出到浏览器
您可以执行的任务使用由phpQuery这被称为提供的功能,让我们来看看第一功能“移植jQuery的部分。”
选择 -找到根据给定条件的元素。
属性 – DOM元素的属性的工作。
穿越 -穿越选定元素的列表。
操作 -添加和删除选定的元素含量。
阿贾克斯 -创 ​​建服务器端的Ajax请求。
活动 -结合DOM对所选元素的事件。
公用事业 -通用功能,以支持其他功能。
您可以下载从项目页面code.google.com/P/phpquery phpQuery库。复制到Web服务器的文件夹,你都准备好了。安装是如此简单,上手,你可以执行demo.php文件。
如何使用phpQuery的
我要告诉你如何创建一个两列的无序列表头和不同行的颜色为奇数和偶数行,在下面的图片所示:

首先,让我们创建一个HTML文档,使用phpQuery:

<?php
require(“phpQuery/phpQuery.php”);
$doc= phpQuery::newDocument(“<div/>”);

上面的代码将创建一个基本的HTML文档用div标签。 该库提供了创建文档的各种方法,我用最简单的一个,但你可以找到其他人在demo.php和文档。

现在,我们需要创建一个无序列表,并把它添加到我们的HTML文件。

<?php

$doc[“div”]->append(“<ul><li>Product Name</li><li>Price</li></ul>”);
$products=array(
array(“Product 1″,”$30”),
array(“Product 2″,”$50”),
array(“Product 3″,”$20”));
foreach($productsas$key=>$product) {
$doc[“div ul”]->append(“<li>$product[0]</li><li>$product[1]</li>”);
}
print $doc;

你可以看到,我们现在的无序列表。但所有的元素是在一个单一的列,这是默认的。我们必须移动到第二列的清单,甚至元素。

<?php

$doc[“div ul”]->attr(“style”, “width:420px;”);
$doc[“div ul”]->find(“li:even”)->attr(“style”,”width:200px; float:left; padding:5px; list-style:none;”);
$doc[“div ul”]->find(“li:odd”)->attr(“style”,”width:200px; float:left; padding:5px; list-style:none;”);

我使用的样式属性定义CSS样式需要我们的例子,但它不建议使用内联样式,除非它真正需要的。始终使用CSS类添加样式。
现在,让我们突出的头和偶数行使用phpQuery方法。

<?php

$doc[“div ul”]->find(“li:nth-child(4n)”)->attr(“style”,”background:#EEE; width:200px; float:left; padding:5px; list-style:none;”);
$doc[“div ul”]->find(“li:nth-child(4n-1)”)->attr(“style”,”background:#EEE; width:200px; float:left; padding:5px; list-style:none;”);
$doc[“div ul”]->find(“li:lt(1)”)->attr(“style”,”background:#CFCFCF; width:200px; float:left; padding:5px; list-style:none;”);

我们已经完成了我们的简单的例子,你现在应该有phpQuery如何可以用来简化HTML生成服务器端的一个想法。 我们所做的一切,几乎是将使用jQuery来完成相同的,除了我们做对了所有的动作$doc对象。

phpQuery的重要性

虽然我解释phpQuery的功能,你一定想知道为什么我们需要库时,我们有对jQuery的客户端。 我将展示使用实际情况下phpQuery的重要性。

考虑下面的情况:假设我们有一个如下所示,其中有所有关于谁去采访Web开发人员的信息表。

现在,这里有我们在这种情况下,发展的要求列表:

  • 谁得到了一个标志超过60考试申请人应以蓝色突出显示。
  • 申请人具有3年以上工作经验,应该在前面的链接标有“申请高级软件工程师”和其他申请者应具备的链接“申请软件工程师”。
  • 公司拥有基于经验的薪酬结构:
    • 1年 – $ 5,000
    • 2年 – $ 10,000
    • 3年 – $ 20,000
    • 超过3年 – $ 50,000

    salary列应以绿色为申请谁符合条件加以强调。

这是输出的外观:

开发人员可以提供以下解决方案来满足使用纯PHP代码的要求。

<?php
// retrieve applicants from database
//…

echo<<<ENDHTML
<div id=”main”>
<divclass=”row_head”>
<div>Name</div>
<div>Marks</div>
<div>Experience</div>
<div>Position</div>
<div>Expected Salary</div>
</div>
ENDHTML;
foreach($applicantsas$applicant) {
echo'<div>’;
echo”<div>”.$applicant[“name”] .”</div>”;
echo'<divmarks”]) . ‘”>’ .$applicant[“marks”] .”</div>”;
echo”<div>”.$applicant[“experience”] .”</div>”;
echo”<div>”. positionLink($applicant[“experience”]) .”</div>”;
echo'<divexperience”], $applicant[“salary”]) . ‘”>’ .$applicant[“salary”] .”</div>”;
echo”</div>”;
}
echo”</div>”;

functionmarksClass($info) {
return($info> 60) ?”pass”:”fail”;
}

functionpositionLink($experience) {
return($experience> 3)
?'<a href=”http://www.php1.cn/”>
:'<a href=”http://www.php1.cn/”>
}

functionsalaryClass($experience,$salary) {
switch($experience) {
case1:
return($salary< 5000) ?”accept”:”reject”;
case2:
return($salary< 10000) ?”accept”:”reject”;
case3:
return($salary< 20000) ?”accept”:”reject”;
default:
return($salary< 50000) ?”accept”:”reject”;
}
}

现在,让我们使用phpQuery做,比较代码和优势。

<?php
require(“phpQuery/phpQuery.php”);
$doc= phpQuery::newDocument(‘<div id=”main”></div>’);
phpQuery::selectDocument($doc);

// retrieve applicants from database
//…

$doc[“#main”]->append(‘
<div id=”main”>
<divclass=”row_head”>
<div>Name</div>
<div>Marks</div>
<div>Experience</div>
<div>Position</div>
<div>Expected Salary</div>
</div>’);

foreach($applicantsas$key=>$applicant) {
$doc[“#main”]->append(‘<div id=”app_’.$key.'”></div>’);
foreach($applicantas$field=>$info) {
$doc[“#main”]->find(“#app_”.$key)->append(‘<div>’.$info.”</div>”);
if($field==”experience”) {
$doc[“#main”]->find(“#app_”.$key)->append(‘<div style=”width:400px”>-</div>’);
}
}
}

addMarksClass($doc);
addSalaryClass($doc);
addPositionLink($doc);

print$doc;

functionaddMarksClass(&$doc) {
$marks= pq(“._marks”);
foreach($marksas$appMark) {
if(pq($appMark)->html() > 60) {
pq($appMark)->addClass(“pass”);
}
else{
pq($appMark)->addClass(“fail”);
}
}
}

functionaddSalaryClass(&$doc) {
$marks= pq(“._salary”);
foreach($marksas$appMark) {
$experience= pq($appMark)->parent()->find(“._experience”)->html();
$salary= pq($appMark)->html();

switch($experience) {
case1:
pq($appMark)->addClass(
($salary< 5000) ?”accept”:”reject”
);
break;
case2:
pq($appMark)->addClass(
($salary< 10000) ?”accept”:”reject”
);
break;
case3:
pq($appMark)->addClass(
($salary< 20000) ?”accept”:”reject”
);
break;
default:
pq($appMark)->addClass(
($salary < 50000) ? “accept” : “reject”
);
}
}
}

function addPositionLink(&$doc) {
$experience = pq(“._experience”);
foreach ($experiece as $appExp) {
if (pq($appExp)->html() > 3) {
pq($appExp)->parent()->find(“._position”)->html(‘<a href=”#”>Apply for Senior Software Engineer</a>’);
}
else{
pq($appExp)->parent()->find(“._position”)->html(‘<a href=”#”>Apply for Software Engineer</a>’);
}
}
}

phpQuery是很容易的,如果你已经使用jQuery的知识。最上面的代码将是不言自明。我想提一提,PQ()虽然是指到当前文档。所有其他的jQuery函数。
尽管两者看起来很相似,代码使用phpQuery提供更好的质量和可扩展性。想想如何脆的原代码可以是,如果你以后添加额外的功能。假设我们要添加额外的工作经验为基础的商标验证。在这种情况下,你必须添加另一种方法和分配的foreach循环内返回的结果。这意味着你要改变已经写好的代码,违反了开闭原则:
软件实体(类,模块,函数等)应该对扩展开放,对修改关闭。
有了第二次的例如使用phpQuery的,首先生成代码没有任何验证,然后传递到每个功能表,并放置到原始表的变化。每个功能并不影响其他功能,所以我们可以写任何新要求的新的功能和使用外循环与其他功能。我们不修改现有的代码,这听起来不错吧?这被称为装修:
Decorator模式是一种设计模式,它允许被添加到现有对象的行为动态。