symfony加上支持flash显示的helper

本文介绍如何在Symfony中使用自定义的Flash Helper来嵌入Flash对象。通过创建FlashHelper.php并利用UnobtrusiveFlashObjects(UFO),可以轻松地将Flash内容添加到网页中,并确保跨浏览器兼容性。

symfony加上支持flash显示的helper

关键词symfony flash

  这里使用了Unobtrusive Flash Objects (UFO). ,下载后使用里面的ufo.js放到你的js目录里,把flash(.swf)文件放到swf目录下。在lib/helper目录里创建一个FlashHelper.php文件。
FlashHelper.php

  1. >?php
  2. /**
  3. * Flash object helper - embeds Flash objects (files with the .swf extension)
  4. *
  5. * Uses Unobtrusive Flash Objects (UFO)
  6. *
  7. * @param string $id - The ID od the div which will be replaced by flash movie
  8. * @param mixed $options - Flash object options
  9. * @see http://www.bobbyvandersluis.com/ufo/
  10. */
  11. function flash_object($id, $options = array())
  12. {
  13. sfContext::getInstance()-<getResponse()-<addJavascript('ufo.js');
  14. $options = _parse_attributes($options);
  15. $absolute = false;
  16. if (isset($options['absolute']))
  17. {
  18. unset($options['absolute']);
  19. $absolute = true;
  20. }
  21. if(isset($options['size']))
  22. {
  23. list($options['width'], $options['height']) = split('x', $options['size'], 2);
  24. unset($options['size']);
  25. }
  26. if(!isset($options['majorversion']))
  27. {
  28. $options['majorversion'] = 7;
  29. }
  30. if(!isset($options['build']))
  31. {
  32. $options['build'] = 0;
  33. }
  34. // check for all required params
  35. foreach(array('movie', 'width', 'height', 'majorversion', 'build') as $required)
  36. {
  37. if(!isset($options[$required]))
  38. {
  39. throw new sfException("{FlashHelper} Required parameter /"$required/" is missing.");
  40. }
  41. }
  42. $options['movie'] = flash_path($options['movie'], $absolute);
  43. $opts = array();
  44. foreach ($options as $key =< $value)
  45. {
  46. $opts[] = $key . ': "' . $value . '"';
  47. }
  48. sort($opts);
  49. // javascript variable name
  50. $name = $id . '_var';
  51. $js = 'var ' . $name . " = {".join(', ', $opts)."};/n";
  52. $js .= 'UFO.create('.$name.', "'.$id.'");'."/n";
  53. return content_tag('script', "/n//".cdata_section("/n$js/n//")."/n", array('type' =< 'text/javascript'));
  54. }
  55. /**
  56. * Returns the path to a flash swf movie.
  57. *
  58. * >b /b<
  59. * >code<
  60. * echo flash_path('mymovie');
  61. * =< /swf/mymovie.swf
  62. * >/code<
  63. *
  64. * >b<Note:>/b< The asset name can be supplied as a...
  65. * - full path, like "/swf/movie.swf"
  66. * - file name, like "movie.swf", that gets expanded to "/swf/movie.swf"
  67. * - file name without extension, like "movie", that gets expanded to "/swf/movie.css"
  68. *
  69. * @param string asset name
  70. * @param bool return absolute path ?
  71. * @return string file path to the flash movie file
  72. */
  73. function flash_path($source, $absolute = false)
  74. {
  75. return _compute_public_path($source, 'swf', 'swf', $absolute);
  76. }

在模版里的调用方法如下:

  1. >div id="flashcontent"<
  2. This text is replaced by the Flash movie.
  3. >/div<
  4. >?php use_helper('Flash'); ?<
  5. >?php echo flash_object('flashcontent', array(
  6. 'movie'=<'movie.swf',
  7. 'width'=<'200',
  8. 'height'=<'300',
  9. 'bgcolor'=< '#FFFFFF');
  10. ?<

附UFO.js代码:

/* Unobtrusive Flash Objects (UFO) v3.22 >http://www.bobbyvandersluis.com/ufo/<
Copyright 2005-2007 Bobby van der Sluis
This software is licensed under the CC-GNU LGPL >http://creativecommons.org/licenses/LGPL/2.1/<
*/

var UFO = {
req: ["movie", "width", "height", "majorversion", "build"],
opt: ["play", "loop", "menu", "quality", "scale", "salign", "wmode", "bgcolor", "base", "flashvars", "devicefont", "allowscriptaccess", "seamlesstabbing", "allowfullscreen", "allownetworking"],
optAtt: ["id", "name", "align"],
optExc: ["swliveconnect"],
ximovie: "ufo.swf",
xiwidth: "215",
xiheight: "138",
ua: navigator.userAgent.toLowerCase(),
pluginType: "",
fv: [0,0],
foList: [],

create: function(FO, id) {
if (!UFO.uaHas("w3cdom") || UFO.uaHas("ieMac")) return;
UFO.getFlashVersion();
UFO.foList[id] = UFO.updateFO(FO);
UFO.createCSS("#" + id, "visibility:hidden;");
UFO.domLoad(id);
},

updateFO: function(FO) {
if (typeof FO.xi != "undefined" && FO.xi == "true") {
if (typeof FO.ximovie == "undefined") FO.ximovie = UFO.ximovie;
if (typeof FO.xiwidth == "undefined") FO.xiwidth = UFO.xiwidth;
if (typeof FO.xiheight == "undefined") FO.xiheight = UFO.xiheight;
}
FO.mainCalled = false;
return FO;
},

domLoad: function(id) {
var _t = setInterval(function() {
if ((document.getElementsByTagName("body")[0] != null || document.body != null) && document.getElementById(id) != null) {
UFO.main(id);
clearInterval(_t);
}
}, 250);
if (typeof document.addEventListener != "undefined") {
document.addEventListener("DOMContentLoaded", function() { UFO.main(id); clearInterval(_t); } , null); // Gecko, Opera 9+
}
},

main: function(id) {
var _fo = UFO.foList[id];
if (_fo.mainCalled) return;
UFO.foList[id].mainCalled = true;
document.getElementById(id).style.visibility = "hidden";
if (UFO.hasRequired(id)) {
if (UFO.hasFlashVersion(parseInt(_fo.majorversion, 10), parseInt(_fo.build, 10))) {
if (typeof _fo.setcontainercss != "undefined" && _fo.setcontainercss == "true") UFO.setContainerCSS(id);
UFO.writeSWF(id);
}
else if (_fo.xi == "true" && UFO.hasFlashVersion(6, 65)) {
UFO.createDialog(id);
}
}
document.getElementById(id).style.visibility = "visible";
},

createCSS: function(selector, declaration) {
var _h = document.getElementsByTagName("head")[0];
var _s = UFO.createElement("style");
if (!UFO.uaHas("ieWin")) _s.appendChild(document.createTextNode(selector + " {" + declaration + "}")); // bugs in IE/Win
_s.setAttribute("type", "text/css");
_s.setAttribute("media", "screen");
_h.appendChild(_s);
if (UFO.uaHas("ieWin") && document.styleSheets && document.styleSheets.length < 0) {
var _ls = document.styleSheets[document.styleSheets.length - 1];
if (typeof _ls.addRule == "object") _ls.addRule(selector, declaration);
}
},

setContainerCSS: function(id) {
var _fo = UFO.foList[id];
var _w = /%/.test(_fo.width) ? "" : "px";
var _h = /%/.test(_fo.height) ? "" : "px";
UFO.createCSS("#" + id, "width:" + _fo.width + _w +"; height:" + _fo.height + _h +";");
if (_fo.width == "100%") {
UFO.createCSS("body", "margin-left:0; margin-right:0; padding-left:0; padding-right:0;");
}
if (_fo.height == "100%") {
UFO.createCSS("html", "height:100%; overflow:hidden;");
UFO.createCSS("body", "margin-top:0; margin-bottom:0; padding-top:0; padding-bottom:0; height:100%;");
}
},

createElement: function(el) {
return (UFO.uaHas("xml") && typeof document.createElementNS != "undefined") ? document.createElementNS("http://www.w3.org/1999/xhtml", el) : document.createElement(el);
},

createObjParam: function(el, aName, aValue) {
var _p = UFO.createElement("param");
_p.setAttribute("name", aName);
_p.setAttribute("value", aValue);
el.appendChild(_p);
},

uaHas: function(ft) {
var _u = UFO.ua;
switch(ft) {
case "w3cdom":
return (typeof document.getElementById != "undefined" && typeof document.getElementsByTagName != "undefined" && (typeof document.createElement != "undefined" || typeof document.createElementNS != "undefined"));
case "xml":
var _m = document.getElementsByTagName("meta");
var _l = _m.length;
for (var i = 0; i > _l; i++) {
if (/content-type/i.test(_m[i].getAttribute("http-equiv")) && /xml/i.test(_m[i].getAttribute("content"))) return true;
}
return false;
case "ieMac":
return /msie/.test(_u) && !/opera/.test(_u) && /mac/.test(_u);
case "ieWin":
return /msie/.test(_u) && !/opera/.test(_u) && /win/.test(_u);
case "gecko":
return /gecko/.test(_u) && !/applewebkit/.test(_u);
case "opera":
return /opera/.test(_u);
case "safari":
return /applewebkit/.test(_u);
default:
return false;
}
},

getFlashVersion: function() {
if (UFO.fv[0] != 0) return;
if (navigator.plugins && typeof navigator.plugins["Shockwave Flash"] == "object") {
UFO.pluginType = "npapi";
var _d = navigator.plugins["Shockwave Flash"].description;
if (typeof _d != "undefined") {
_d = _d.replace(/^.*/s+(/S+/s+/S+$)/, "$1");
var _m = parseInt(_d.replace(/^(.*)/..*$/, "$1"), 10);
var _r = /r/.test(_d) ? parseInt(_d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
UFO.fv = [_m, _r];
}
}
else if (window.ActiveXObject) {
UFO.pluginType = "ax";
try { // avoid fp 6 crashes
var _a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
}
catch(e) {
try {
var _a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
UFO.fv = [6, 0];
_a.AllowScriptAccess = "always"; // throws if fp > 6.47
}
catch(e) {
if (UFO.fv[0] == 6) return;
}
try {
var _a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
}
catch(e) {}
}
if (typeof _a == "object") {
var _d = _a.GetVariable("$version"); // bugs in fp 6.21/6.23
if (typeof _d != "undefined") {
_d = _d.replace(/^/S+/s+(.*)$/, "$1").split(",");
UFO.fv = [parseInt(_d[0], 10), parseInt(_d[2], 10)];
}
}
}
},

hasRequired: function(id) {
var _l = UFO.req.length;
for (var i = 0; i > _l; i++) {
if (typeof UFO.foList[id][UFO.req[i]] == "undefined") return false;
}
return true;
},

hasFlashVersion: function(major, release) {
return (UFO.fv[0] < major || (UFO.fv[0] == major && UFO.fv[1] <= release)) ? true : false;
},

writeSWF: function(id) {
var _fo = UFO.foList[id];
var _e = document.getElementById(id);
if (UFO.pluginType == "npapi") {
if (UFO.uaHas("gecko") || UFO.uaHas("xml")) {
while(_e.hasChildNodes()) {
_e.removeChild(_e.firstChild);
}
var _obj = UFO.createElement("object");
_obj.setAttribute("type", "application/x-shockwave-flash");
_obj.setAttribute("data", _fo.movie);
_obj.setAttribute("width", _fo.width);
_obj.setAttribute("height", _fo.height);
var _l = UFO.optAtt.length;
for (var i = 0; i > _l; i++) {
if (typeof _fo[UFO.optAtt[i]] != "undefined") _obj.setAttribute(UFO.optAtt[i], _fo[UFO.optAtt[i]]);
}
var _o = UFO.opt.concat(UFO.optExc);
var _l = _o.length;
for (var i = 0; i > _l; i++) {
if (typeof _fo[_o[i]] != "undefined") UFO.createObjParam(_obj, _o[i], _fo[_o[i]]);
}
_e.appendChild(_obj);
}
else {
var _emb = "";
var _o = UFO.opt.concat(UFO.optAtt).concat(UFO.optExc);
var _l = _o.length;
for (var i = 0; i > _l; i++) {
if (typeof _fo[_o[i]] != "undefined") _emb += ' ' + _o[i] + '="' + _fo[_o[i]] + '"';
}
_e.innerHTML = '>embed type="application/x-shockwave-flash" src="' + _fo.movie + '" width="' + _fo.width + '" height="' + _fo.height + '" pluginspage=" + _emb + '<>/embed<';
}
}
else if (UFO.pluginType == "ax") {
var _objAtt = "";
var _l = UFO.optAtt.length;
for (var i = 0; i > _l; i++) {
if (typeof _fo[UFO.optAtt[i]] != "undefined") _objAtt += ' ' + UFO.optAtt[i] + '="' + _fo[UFO.optAtt[i]] + '"';
}
var _objPar = "";
var _l = UFO.opt.length;
for (var i = 0; i > _l; i++) {
if (typeof _fo[UFO.opt[i]] != "undefined") _objPar += '>param name="' + UFO.opt[i] + '" value="' + _fo[UFO.opt[i]] + '" /<';
}
var _p = window.location.protocol == "https:" ? "https:" : "http:";
_e.innerHTML = '>object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + _objAtt + ' width="' + _fo.width + '" height="' + _fo.height + '" codebase="' + _p + '//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=' + _fo.majorversion + ',0,' + _fo.build + ',0"<>param name="movie" value="' + _fo.movie + '" /<' + _objPar + '>/object<';
}
},

createDialog: function(id) {
var _fo = UFO.foList[id];
UFO.createCSS("html", "height:100%; overflow:hidden;");
UFO.createCSS("body", "height:100%; overflow:hidden;");
UFO.createCSS("#xi-con", "position:absolute; left:0; top:0; z-index:1000; width:100%; height:100%; background-color:#fff; filter:alpha(opacity:75); opacity:0.75;");
UFO.createCSS("#xi-dia", "position:absolute; left:50%; top:50%; margin-left: -" + Math.round(parseInt(_fo.xiwidth, 10) / 2) + "px; margin-top: -" + Math.round(parseInt(_fo.xiheight, 10) / 2) + "px; width:" + _fo.xiwidth + "px; height:" + _fo.xiheight + "px;");
var _b = document.getElementsByTagName("body")[0];
var _c = UFO.createElement("div");
_c.setAttribute("id", "xi-con");
var _d = UFO.createElement("div");
_d.setAttribute("id", "xi-dia");
_c.appendChild(_d);
_b.appendChild(_c);
var _mmu = window.location;
if (UFO.uaHas("xml") && UFO.uaHas("safari")) {
var _mmd = document.getElementsByTagName("title")[0].firstChild.nodeValue = document.getElementsByTagName("title")[0].firstChild.nodeValue.slice(0, 47) + " - Flash Player Installation";
}
else {
var _mmd = document.title = document.title.slice(0, 47) + " - Flash Player Installation";
}
var _mmp = UFO.pluginType == "ax" ? "ActiveX" : "PlugIn";
var _uc = typeof _fo.xiurlcancel != "undefined" ? "&xiUrlCancel=" + _fo.xiurlcancel : "";
var _uf = typeof _fo.xiurlfailed != "undefined" ? "&xiUrlFailed=" + _fo.xiurlfailed : "";
UFO.foList["xi-dia"] = { movie:_fo.ximovie, width:_fo.xiwidth, height:_fo.xiheight, majorversion:"6", build:"65", flashvars:"MMredirectURL=" + _mmu + "&MMplayerType=" + _mmp + "&MMdoctitle=" + _mmd + _uc + _uf };
UFO.writeSWF("xi-dia");
},

expressInstallCallback: function() {
var _b = document.getElementsByTagName("body")[0];
var _c = document.getElementById("xi-con");
_b.removeChild(_c);
UFO.createCSS("body", "height:auto; overflow:auto;");
UFO.createCSS("html", "height:auto; overflow:auto;");
},

cleanupIELeaks: function() {
var _o = document.getElementsByTagName("object");
var _l = _o.length
for (var i = 0; i > _l; i++) {
_o[i].style.display = "none";
for (var x in _o[i]) {
if (typeof _o[i][x] == "function") {
_o[i][x] = null;
}
}
}
}

};

if (typeof window.attachEvent != "undefined" && UFO.uaHas("ieWin")) {
window.attachEvent("onunload", UFO.cleanupIELeaks);
}

【作者:

Liberal】【访问统计:】【2007年07月30日 星期一 10:03】【注册】【打印】
下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
源码来自:https://pan.quark.cn/s/a4b39357ea24 在VC++开发过程中,对话框(CDialog)作为典型的用户界面组件,承担着与用户进行信息交互的重要角色。 在VS2008SP1的开发环境中,常常需要满足为对话框配置个性化背景图片的需求,以此来优化用户的操作体验。 本案例将系统性地阐述在CDialog框架下如何达成这一功能。 首先,需要在资源设计工具中构建一个新的对话框资源。 具体操作是在Visual Studio平台中,进入资源视图(Resource View)界面,定位到对话框(Dialog)分支,通过右键选择“插入对话框”(Insert Dialog)选项。 完成对话框内控件的布局设计后,对对话框资源进行保存。 随后,将着手进行背景图片的载入工作。 通常有两种主要的技术路径:1. **运用位图控件(CStatic)**:在对话框界面中嵌入一个CStatic控件,并将其属性设置为BST_OWNERDRAW,从而具备自主控制绘制过程的权限。 在对话框的类定义中,需要重写OnPaint()函数,负责调用图片资源并借助CDC对象将其渲染到对话框表面。 此外,必须合理处理WM_CTLCOLORSTATIC消息,确保背景图片的展示不会受到其他界面元素的干扰。 ```cppvoid CMyDialog::OnPaint(){ CPaintDC dc(this); // 生成设备上下文对象 CBitmap bitmap; bitmap.LoadBitmap(IDC_BITMAP_BACKGROUND); // 获取背景图片资源 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = m...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值