第十四天:标签,第二部分
symfony前情提要ob娱乐下载
在昨天的教程中,我们构建了大众分类法交响乐的特点。ob娱乐下载的QuestionTag
类和模型的其他扩展帮助我们在问题列表和问题详细信息中显示问题的标记。此外,还开发了针对给定标签的流行问题列表。
关于标签还有两件事要做,它们听起来都很“web2.0”:使用AJAX表单添加新标签的能力,以及全局askeet标签气泡。您准备好体验symfony的敏捷开发方法了吗?ob娱乐下载
为问题添加标签
表单
我们不仅希望让注册用户能够为某个问题添加标签,还希望在其他问题与他/她输入的第一个字母匹配时,向他们推荐一个标签。这叫做自动完成。如果你玩过谷歌建议你知道这是怎么回事。
昨天,我们创建了一个片段,当问题细节显示时,它会插入到侧栏中。编辑这个使用/应用程序/前端/模块/栏/模板/ _question.php
文件在最后添加一个表单:
...<?php如果(sf_user美元->isAuthenticated()):? ><?php回声form_remote_tag(数组(“url”= >“@tag_add”,“更新”= >“question_tags”,))? ><?php回声input_hidden_tag(“question_id”,美元问题->getId())? ><?php回声input_auto_complete_tag(“标签”,”,标签/自动完成的,“自动完成=了”,“use_style = true”)? ><?php回声submit_tag(“标签”)? >< /形式> < / div ><?phpendif;? >当然,由于标记必须链接到用户,因此新标记的添加仅限于经过身份验证的用户。我们一会儿会讲到
form_remote_tag ()
帮手。但首先,让我们看一下自动补全输入
标签。它指定了一个动作(这里,标签/自动完成
)以获取匹配选项的数组。自动完成
操作应返回的列表是用户输入的与
标签
字段,无副本,按字母顺序排列。返回这个的SQL查询是:选择截然不同的标签作为标签从question_tag在哪里User_id = $id和标签就像美元的条目订单通过标签属性中添加此操作
模块/标签/动作/ action.class.php
文件:公共函数executeAutocomplete(){这个美元->标签= QuestionTagPeer::getTagsForUserLike(这个美元->getUser()->getSubscriberId(),这个美元->getRequestParameter(“标签”),10);}通常,数据库查询的核心在于模型。属性中添加以下方法
QuestionTagPeer
类:公共静态函数getTagsForUserLike(user_id美元,美元的标记,美元最大=10){美元的标记=数组();反对美元=推动:getConnection();美元的查询=从%s中选择不同的%s作为标签,%s = ?%s喜欢什么?按%s '排序;美元的查询=sprintf(美元的查询, QuestionTagPeer::标签, QuestionTagPeer::TABLE_NAME, QuestionTagPeer::USER_ID, QuestionTagPeer::标签, QuestionTagPeer::标签);支撑美元=反对美元->prepareStatement(美元的查询);支撑美元->setInt(1,user_id美元);支撑美元->setString(2,美元的标记.“%”);支撑美元->setLimit(美元最大);rs美元=支撑美元->executeQuery();而(rs美元->下一个()){美元的标记[]=rs美元->getString(“标签”);}返回美元的标记;}操作已经确定了标记列表,我们只需要在
autocompleteSuccess.php
模板:< ul ><?phpforeach(美元的标记作为美元的标记):? ><李> < ?php回声美元的标记李? > < / ><?phpendforeach;? >< / ul >添加一个新的
routing.yml
路由(并使用它代替模块/行动
在input_auto_complete_tag ()
召唤_question.php
部分):Tag_autocomplete: url: / Tag_autocomplete参数:{模块:标签,动作:自动完成}配置你的
view.yml
:autocompleteSuccess: has_layout: off components: []继续,您可以尝试一下:在现有帐户(例如:fabpot/symfony)上注册后,显示一个问题并注意侧边栏中的新字段。ob娱乐下载输入这个用户已经给出的标签的第一个字母(例如:relatives),并观察出现在字段下面的div,建议适当的条目。
远程形式
提交表单时,不需要刷新整个页面:只需刷新标签列表和要添加标签的表单。这就是目的
form_remote_tag ()
Helper,它指定提交表单时要调用的操作(标签/添加
),以及该操作的结果(标识为'question_tags'的元素)要更新的页面区域。这已经在第八天,用AJAX表单添加一个问题。让我们创建
executeAdd ()
方法中的标签
行动:公共函数executeAdd(){这个美元->问题= QuestionPeer::retrieveByPk(这个美元->getRequestParameter(“question_id”));这个美元->forward404Unless(这个美元->问题);userId美元=这个美元->getUser()->getSubscriberId();美元的短语=这个美元->getRequestParameter(“标签”);这个美元->问题->addTagsForUser(美元的短语,userId美元);这个美元->标签=这个美元->问题->getTags();}和
addTagsForUser
在问题
类:公共函数addTagsForUser(美元的短语,userId美元){//将短语拆分为单独的标签美元的标记=标签::splitPhrase(美元的短语);//添加标签foreach(美元的标记作为美元的标记){questionTag美元=新QuestionTag();questionTag美元->setQuestionId(这个美元->getId());questionTag美元->setUserId(userId美元);questionTag美元->setTag(美元的标记);questionTag美元->保存();}}的
addSuccess.php
模板将确定将替换更新
区。与通常的AJAX操作一样,它包含一个简单的include_partial ()
:<?phpinclude_partial(“标记/ question_tags”,数组(“问题”= >美元问题,“标签”= >美元的标记))? >添加一个新的
routing.yml
路线:Tag_add: url: / Tag_add参数:{模块:标签,动作:添加}配置你的
view.yml
:addSuccess: has_layout: off components: []测试它
尝试一下:登录到网站,显示一个问题细节,输入一个新标签并提交。整个列表更新,新的标签插入是按字母顺序的。
显示标签气泡
大众分类法允许根据流行程度对标签进行评级。但是标签的数量使得标签列表难以阅读。从视觉上讲,最令人满意的解决方案是根据标签词的受欢迎程度增加标签词的大小,这样最受欢迎的标签(用户最多的标签)就会立即出现。检查us流行标签页理解什么是标签冒泡。
一个网站80%的访问量只关注不到20%的内容,这是许多网站每天都要验证的规则,askeet可能也不例外。因此,如果askeet提出了一个标签列表,它也必须按照流行程度来排列,以限制最不受欢迎的标签('grandma', 'chocolate')的扰动,并增加最受欢迎的标签('php', 'real life', 'useful')的可见性。
扩展
QuestionTagPeer
类流行标签列表的提供者不能是其他类
QuestionTagPeer
.用一个新方法来扩展它,在这个方法中,我们将尝试一种编写SQL查询的替代方法:公共静态函数getPopularTags(美元最大=5){美元的标记=数组();反对美元=推动:getConnection();美元的查询=' select '.QuestionTagPeer::NORMALIZED_TAG.' AS标签,COUNT('.QuestionTagPeer::NORMALIZED_TAG.')从'.QuestionTagPeer::TABLE_NAME.' group by '.QuestionTagPeer::NORMALIZED_TAG.“按计数DESC排序”;支撑美元=反对美元->prepareStatement(美元的查询);支撑美元->setLimit(美元最大);rs美元=支撑美元->executeQuery();max_popularity美元=0;而(rs美元->下一个()){如果(!max_popularity美元){max_popularity美元=rs美元->getInt(“数”);}美元的标记[rs美元->getString(“标签”)]=地板上((rs美元->getInt(“数”)/max_popularity美元*3.)+1);}ksort(美元的标记);返回美元的标记;}我们将流行度的数量限制为4,因为否则标签云将变得不可读。ob直播app该方法的结果是标记名称和流行度的关联数组。我们已经准备好展示它了。
显示一个标签气泡
创建一个简单的
受欢迎的
行动在标签
模块:公共函数executePopular(){这个美元->标签= QuestionTagPeer::getPopularTags(sfConfig::得到(“app_tag_ob直播appcloud_max”));}几乎和动作一样简单
popularSuccess.php
模板:流行标签
“tag_ob直播appcloud”><?phpforeach(美元的标记作为美元的标记= >美元计算):? ><李类=“tag_popularity_ < ?php回声美元计算? >"> < ?php回声link_to(美元的标记,“@tag ?标签= '.美元的标记,“rel =标签”)李? > < / ><?phpendforeach;? >< / ul >
方法中为此新操作添加路由规则
routing.yml
配置文件:参数:{模块:标签,动作:流行}和
app_tag_ob直播appcloud_max
应用程序中的参数app.yml
:所有:tag: clob直播appoud_max: 40一切就绪:通过请求显示标记云ob直播app
http://askeet/popular_tags样式标签列表项
但是云在哪里呢?ob直播app该操作返回的只是一个按字母顺序排列的标记列表。真正的造型是由样式表完成的,正如web标准所推荐的那样。将以下声明附加到
main.css
样式表(位于使用/ web / css
).ul# tagob直播app_cloud{list-style:没有一个;}ul# tagob直播app_cloud李{list-style:没有一个;显示:内联;}ul# tagob直播app_cloud李.tag_popularity_1{字体大小:60%;}ul# tagob直播app_cloud李.tag_popularity_2{字体大小:One hundred.%;}ul# tagob直播app_cloud李.tag_popularity_3{字体大小:130%;}ul# tagob直播app_cloud李.tag_popularity_4{字体大小:160%;}刷新流行标签页面,瞧!
明天见
使用symfony在站点中添加分类法并不是什么大问题。ob娱乐下载复杂的请求、自动完成表单和表单提交后页面的本地刷新只需要几行代码。
但是开发应用程序的工具不能让您忘记良好的开发原则,您应该始终测试所做的所有更改。允许您快速开发和经常重构的最佳工具是单元测试这是计算机编程的最新进展,我们明天将讨论这些问题。
在那之前,你可以把21日的建议发到使用邮件列表.如果要下载到目前为止应用程序的全部代码,请转到askeet SVN存储库,以及
/标签/ release_day_14
标签。
本作品采用创作共用署名-非商业性-禁止派生作品3.0未移植许可协议授权。