您现在的位置是:首页 > cms教程 > Ecshop商城教程Ecshop商城教程
ecshop的jquery与transport.js冲突解决方法
卫荷2024-12-18Ecshop商城教程已有人查阅
导读ecshop里面jquery与transport.js文件冲突是众所周知的,这里提供的方案,不是最完美的,是在网上提出的解决方案的基础上整理的。
ecshop里面jquery与transport.js文件冲突是众所周知的,这里提供的方案,不是最完美的,是在网上提出的解决方案的基础上整理的。
是这样的,保留原来的transport.js,发生冲突的页面调用修改过的transportGoods.js,这样就避免了修改所有js文件的麻烦;函数方面,保留原来的函数,调用出错的函数,重新复制一个,起个新的函数名。
不喜欢这种方式的,下面的可以忽略了,没有什么技术含量,总结了一下。
页面:goods.dwt
效果:放大镜
所用插件:jquery图片放大镜效果插件 jqzoom
症状一:jquery与transport.js文件冲突
思路分析:两者都定义了$,导致发生冲突
实施方案:详细的分析网上有很多,这里只上传已配置好的transport.js文件(文件名重命名为:transportGoods.js),感兴趣的百度下详细的配置。
解决步骤:
下载transportGoods.js到js目录下
在goods.dwt页面,适当的位置调用一下就好:
{insert_scripts files='transportGoods.js'}
至此,放大镜效果完美解决了。
症状二:在线购买失效,报错:
错误: goods.toJSONString is not a function
源文件:
行:34
出错地方的代码:
解决步骤:
1、对比transport.js与transportGoods.js 的352行
5、修改goods.dwt页面,调用addToCart()的地方为addToCartGoods()
OK!
是这样的,保留原来的transport.js,发生冲突的页面调用修改过的transportGoods.js,这样就避免了修改所有js文件的麻烦;函数方面,保留原来的函数,调用出错的函数,重新复制一个,起个新的函数名。
不喜欢这种方式的,下面的可以忽略了,没有什么技术含量,总结了一下。
页面:goods.dwt
效果:放大镜
所用插件:jquery图片放大镜效果插件 jqzoom
症状一:jquery与transport.js文件冲突
思路分析:两者都定义了$,导致发生冲突
实施方案:详细的分析网上有很多,这里只上传已配置好的transport.js文件(文件名重命名为:transportGoods.js),感兴趣的百度下详细的配置。
解决步骤:
下载transportGoods.js到js目录下
在goods.dwt页面,适当的位置调用一下就好:
{insert_scripts files='transportGoods.js'}
至此,放大镜效果完美解决了。
症状二:在线购买失效,报错:
错误: goods.toJSONString is not a function
源文件:
行:34
出错地方的代码:
Ajax.call('flow.php?step=add_to_cart', 'goods=' + goods.toJSONString(), addToCartResponse, 'POST', 'JSON');
思路分析:goods.dwt页面调用的是修改后的transportGoods.js文件,导致toJSONString函数找不到。解决步骤:
1、对比transport.js与transportGoods.js 的352行
legalParams = "JSON=" + params.toJSONString(); //transport.js
legalParams = "JSON=" + objToJSONString(params); //transportGoods.js
2、common.js文件的34行:
Ajax.call('flow.php?step=add_to_cart', 'goods=' + goods.toJSONString(), addToCartResponse, 'POST', 'JSON');
3、分析1、2中的红色代码区,修改common.js的34行为:
Ajax.call('flow.php?step=add_to_cart', 'goods=' + objToJSONString(goods), addToCartResponse, 'POST', 'JSON');
4、至此,证明方法可行,但是其他地方的Ajax.call就会出错,在线购买调用的是common.js里面的addToCart()函数,复制一份,重命名为:addToCartGoods(),修改里面的Ajax.call为步骤3中提到的。5、修改goods.dwt页面,调用addToCart()的地方为addToCartGoods()
OK!
1 /**
2 * @file transport.js
3 * @description 用于支持AJAX的传输类。
4 * @author ECShop R&D Team ( http:// .ecshop.com/ )
5 * @date 2007-03-08 Wednesday
6 * @license Licensed under the Academic Free License 2.1 http:// .opensource.org/licenses/afl-2.1.php
7 * @version 1.0.20070308
8 **/
9
10 var Transport =
11 {
12 /* *
13 * 存储本对象所在的文件名。
14 *
15 * @static
16 */
17 filename : "transportGoods.js",
18
19 /* *
20 * 存储是否进入调试模式的开关,打印调试消息的方式,换行符,调试用的容器的ID。
21 *
22 * @private
23 */
24 debugging :
25 {
26 isDebugging : 0,
27 debuggingMode : 0,
28 linefeed : "",
29 containerId : 0
30 },
31
32 /* *
33 * 设置调试模式以及打印调试消息方式的方法。
34 *
35 * @public
36 * @param {int} 是否打开调试模式 0:关闭,1:打开
37 * @param {int} 打印调试消息的方式 0:alert,1:innerHTML
38 *
39 */
40 debug : function (isDebugging, debuggingMode)
41 {
42 this.debugging =
43 {
44 "isDebugging" : isDebugging,
45 "debuggingMode" : debuggingMode,
46 "linefeed" : debuggingMode ? "<br />" : "\n",
47 "containerId" : "dubugging-container" + new Date().getTime()
48 };
49 },
50
51 /* *
52 * 传输完毕后自动调用的方法,优先级比用户从run()方法中传入的回调函数高。
53 *
54 * @public
55 */
56 onComplete : function ()
57 {
58 },
59
60 /* *
61 * 传输过程中自动调用的方法。
62 *
63 * @public
64 */
65 onRunning : function ()
66 {
67 },
68
69 /* *
70 * 调用此方法发送HTTP请求。
71 *
72 * @public
73 * @param {string} url 请求的URL地址
74 * @param {mix} params 发送参数
75 * @param {Function} callback 回调函数
76 * @param {string} ransferMode 请求的方式,有"GET"和"POST"两种
77 * @param {string} responseType 响应类型,有"JSON"、"XML"和"TEXT"三种
78 * @param {boolean} asyn 是否异步请求的方式
79 * @param {boolean} quiet 是否安静模式请求
80 */
81 run : function (url, params, callback, transferMode, responseType, asyn, quiet)
82 {
83 /* 处理用户在调用该方法时输入的参数 */
84 params = this.parseParams(params);
85 transferMode = typeof(transferMode) === "string"
86 && transferMode.toUpperCase() === "GET"
87 ? "GET"
88 : "POST";
89
90 if (transferMode === "GET")
91 {
92 var d = new Date();
93
94 url += params ? (url.indexOf("?") === - 1 ? "?" : "&") + params : "";
95 url = encodeURI(url) + (url.indexOf("?") === - 1 ? "?" : "&") + d.getTime() + d.getMilliseconds();
96 params = null;
97 }
98
99 responseType = typeof(responseType) === "string" && ((responseType = responseType.toUpperCase()) === "JSON" || responseType === "XML") ? responseType : "TEXT";
100 asyn = asyn === false ? false : true;
101
102 /* 处理HTTP请求和响应 */
103 var xhr = this.createXMLHttpRequest();
104
105 try
106 {
107 var self = this;
108
109 if (typeof(self.onRunning) === "function" && !quiet)
110 {
111 self.onRunning();
112 }
113
114 xhr.open(transferMode, url, asyn);
115
116 if (transferMode === "POST")
117 {
118 xhr.setRequestHeader("Content-Type", "application/x- -form-urlencoded");
119 }
120
121 if (asyn)
122 {
123 xhr.onreadystatechange = function ()
124 {
125 if (xhr.readyState == 4)
126 {
127 switch ( xhr.status )
128 {
129 case 0:
130 case 200: // OK!
131 /*
132 * If the request was to create a new resource
133 * (such as post an item to the database)
134 * You could instead return a status code of '201 Created'
135 */
136
137 if (typeof(self.onComplete) === "function")
138 {
139 self.onComplete();
140 }
141
142 if (typeof(callback) === "function")
143 {
144 callback.call(self, self.parseResult(responseType, xhr), xhr.responseText);
145 }
146 break;
147
148 case 304: // Not Modified
149 /*
150 * This would be used when your Ajax widget is
151 * checking for updated content,
152 * such as the Twitter interface.
153 */
154 break;
155
156 case 400: // Bad Request
157 /*
158 * A bit like a safety net for requests by your JS interface
159 * that aren't supported on the server.
160 * "Your browser made a request that the server cannot understand"
161 */
162 alert("XmlHttpRequest status: [400] Bad Request");
163 break;
164
165 case 404: // Not Found
166 alert("XmlHttpRequest status: [404] \nThe requested URL "+url+" was not found on this server.");
167 break;
168
169 case 409: // Conflict
170 /*
171 * Perhaps your JavaScript request attempted to
172 * update a Database record
173 * but failed due to a conflict
174 * (eg: a field that must be unique)
175 */
176 break;
177
178 case 503: // Service Unavailable
179 /*
180 * A resource that this request relies upon
181 * is currently unavailable
182 * (eg: a file is locked by another process)
183 */
184 alert("XmlHttpRequest status: [503] Service Unavailable");
185 break;
186
187 default:
188 alert("XmlHttpRequest status: [" + xhr.status + "] Unknow status.");
189 }
190
191 xhr = null;
192 }
193 }
194 if (xhr != null) xhr.send(params);
195 }
196 else
197 {
198 if (typeof(self.onRunning) === "function")
199 {
200 self.onRunning();
201 }
202
203 xhr.send(params);
204
205 var result = self.parseResult(responseType, xhr);
206 //xhr = null;
207
208 if (typeof(self.onComplete) === "function")
209 {
210 self.onComplete();
211 }
212 if (typeof(callback) === "function")
213 {
214 callback.call(self, result, xhr.responseText);
215 }
216
217 return result;
218 }
219 }
220 catch (ex)
221 {
222 if (typeof(self.onComplete) === "function")
223 {
224 self.onComplete();
225 }
226
227 alert(this.filename + "/run() error:" + ex.description);
228 }
229 },
230
231 /* *
232 * 如果开启了调试模式,该方 打印出相应的信息。
233 *
234 * @private
235 * @param {string} info 调试信息
236 * @param {string} type 信息类型
237 */
238 displayDebuggingInfo : function (info, type)
239 {
240 if ( ! this.debugging.debuggingMode)
241 {
242 alert(info);
243 }
244 else
245 {
246
247 var id = this.debugging.containerId;
248 if ( ! document.getElementById(id))
249 {
250 div = document.createElement("DIV");
251 div.id = id;
252 div.style.position = "absolute";
253 div.style.width = "98%";
254 div.style.border = "1px solid #f00";
255 div.style.backgroundColor = "#eef";
256 var pageYOffset = document.body.scrollTop
257 || window.pageYOffset
258 || 0;
259 div.style.top = document.body.clientHeight * 0.6
260 + pageYOffset
261 + "px";
262 document.body.appendChild(div);
263 div.innerHTML = "<div></div>"
264 + "<hr style='height:1px;border:1px dashed red;'>"
265 + "<div></div>";
266 }
267
268 var subDivs = div.getElementsByTagName("DIV");
269 if (type === "param")
270 {
271 subDivs[0].innerHTML = info;
272 }
273 else
274 {
275 subDivs[1].innerHTML = info;
276 }
277 }
278 },
279
280 /* *
281 * 创建XMLHttpRequest对象的方法。
282 *
283 * @private
284 * @return 返回一个XMLHttpRequest对象
285 * @type Object
286 */
287 createXMLHttpRequest : function ()
288 {
289 var xhr = null;
290
291 if (window.ActiveXObject)
292 {
293 var versions = ['Microsoft.XMLHTTP', 'MSXML6.XMLHTTP', 'MSXML5.XMLHTTP', 'MSXML4.XMLHTTP', 'MSXML3.XMLHTTP', 'MSXML2.XMLHTTP', 'MSXML.XMLHTTP'];
294
295 for (var i = 0; i < versions.length; i ++ )
296 {
297 try
298 {
299 xhr = new ActiveXObject(versions);
300 break;
301 }
302 catch (ex)
303 {
304 continue;
305 }
306 }
307 }
308 else
309 {
310 xhr = new XMLHttpRequest();
311 }
312
313 return xhr;
314 },
315
316 /* *
317 * 当传输过程发生错误时将调用此方法。
318 *
319 * @private
320 * @param {Object} xhr XMLHttpRequest对象
321 * @param {String} url HTTP请求的地址
322 */
323 onXMLHttpRequestError : function (xhr, url)
324 {
325 throw "URL: " + url + "\n"
326 + "readyState: " + xhr.readyState + "\n"
327 + "state: " + xhr.status + "\n"
328 + "headers: " + xhr.getAllResponseHeaders();
329 },
330
331 /* *
332 * 对将要发送的参数进行格式化。
333 *
334 * @private
335 * @params {mix} params 将要发送的参数
336 * @return 返回合法的参数
337 * @type string
338 */
339 parseParams : function (params)
340 {
341 var legalParams = "";
342 params = params ? params : "";
343
344 if (typeof(params) === "string")
345 {
346 legalParams = params;
347 }
348 else if (typeof(params) === "object")
349 {
350 try
351 {
352 legalParams = "JSON=" + objToJSONString(params);
353 }
354 catch (ex)
355 {
356 alert("Can't stringify JSON!");
357 return false;
358 }
359 }
360 else
361 {
362 alert("Invalid parameters!");
363 return false;
364 }
365
366 if (this.debugging.isDebugging)
367 {
368 var lf = this.debugging.linefeed,
369 info = "[Original Parameters]" + lf + params + lf + lf
370 + "[Parsed Parameters]" + lf + legalParams;
371
372 this.displayDebuggingInfo(info, "param");
373 }
374
375 return legalParams;
376 },
377
378 /* *
379 * 对返回的HTTP响应结果进行过滤。
380 *
381 * @public
382 * @params {mix} result HTTP响应结果
383 * @return 返回过滤后的结果
384 * @type string
385 */
386 preFilter : function (result)
387 {
388 return result.replace(/\xEF\xBB\xBF/g, "");
389 },
390
391 /* *
392 * 对返回的结果进行格式化。
393 *
394 * @private
395 * @return 返回特定格式的数据结果
396 * @type mix
397 */
398 parseResult : function (responseType, xhr)
399 {
400 var result = null;
401
402 switch (responseType)
403 {
404 case "JSON" :
405 result = this.preFilter(xhr.responseText);
406 try
407 {
408 result = parseObjectToJSON(result);
409 }
410 catch (ex)
411 {
412 throw this.filename + "/parseResult() error: can't parse to JSON.\n\n" + xhr.responseText;
413 }
414 break;
415 case "XML" :
416 result = xhr.responseXML;
417 break;
418 case "TEXT" :
419 result = this.preFilter(xhr.responseText);
420 break;
421 default :
422 throw this.filename + "/parseResult() error: unknown response type:" + responseType;
423 }
424
425 if (this.debugging.isDebugging)
426 {
427 var lf = this.debugging.linefeed,
428 info = "[Response Result of " + responseType + " Format]" + lf
429 + result;
430
431 if (responseType === "JSON")
432 {
433 info = "[Response Result of TEXT Format]" + lf
434 + xhr.responseText + lf + lf
435 + info;
436 }
437
438 this.displayDebuggingInfo(info, "result");
439 }
440
441 return result;
442 }
443 };
444
445 /* 定义两个别名 */
446 var Ajax = Transport;
447 Ajax.call = Transport.run;
448
449 /*
450 json.js
451 2007-03-06
452
453 Public Domain
454
455 This file adds these methods to JavaScript:
456
457 array.toJSONString()
458 boolean.toJSONString()
459 date.toJSONString()
460 number.toJSONString()
461 object.toJSONString()
462 string.toJSONString()
463 These methods produce a JSON text from a JavaScript value.
464 It must not contain any cyclical references. Illegal values
465 will be excluded.
466
467 The default conversion for dates is to an ISO string. You can
468 add a toJSONString method to any date object to get a different
469 representation.
470
471 string.parseJSON(filter)
472 This method parses a JSON text to produce an object or
473 array. It can throw a SyntaxError exception.
474
475 The optional filter parameter is a function which can filter and
476 transform the results. It receives each of the keys and values, and
477 its return value is used instead of the original value. If it
478 returns what it received, then structure is not modified. If it
479 returns undefined then the member is deleted.
480
481 Example:
482
483 // Parse the text. If a key contains the string 'date' then
484 // convert the value to a date.
485
486 myData = text.parseJSON(function (key, value) {
487 return key.indexOf('date') >= 0 ? new Date(value) : value;
488 });
489
490 It is expected that these methods will formally become part of the
491 JavaScript Programming Language in the Fourth Edition of the
492 ECMAScript standard in 2008.
493 */
494
495 // Augment the basic prototypes if they have not already been augmented.
496 /*
497 if ( ! Object.prototype.toJSONString) {
498 Array.prototype.toJSONString = function () {
499 var a = ['['], // The array holding the text fragments.
500 b, // A boolean indicating that a comma is required.
501 i, // Loop counter.
502 l = this.length,
503 v; // The value to be stringified.
504
505 function p(s) {
506
507 // p accumulates text fragments in an array. It inserts a comma before all
508 // except the first fragment.
509
510 if (b) {
511 a.push(',');
512 }
513 a.push(s);
514 b = true;
515 }
516
517 // For each value in this array...
518
519 for (i = 0; i < l; i ++) {
520 v = this;
521 switch (typeof v) {
522
523 // Values without a JSON representation are ignored.
524
525 case 'undefined':
526 case 'function':
527 case 'unknown':
528 break;
529
530 // Serialize a JavaScript object value. Ignore objects thats lack the
531 // toJSONString method. Due to a specification error in ECMAScript,
532 // typeof null is 'object', so watch out for that case.
533
534 case 'object':
535 if (v) {
536 if (typeof v.toJSONString === 'function') {
537 p(v.toJSONString());
538 }
539 } else {
540 p("null");
541 }
542 break;
543
544 // Otherwise, serialize the value.
545
546 default:
547 p(v.toJSONString());
548 }
549 }
550
551 // Join all of the fragments together and return.
552
553 a.push(']');
554 return a.join('');
555 };
556
557 Boolean.prototype.toJSONString = function () {
558 return String(this);
559 };
560
561 Date.prototype.toJSONString = function () {
562
563 // Ultimately, this method will be equivalent to the date.toISOString method.
564
565 function f(n) {
566
567 // Format integers to have at least two digits.
568
569 return n < 10 ? '0' + n : n;
570 }
571
572 return '"' + this.getFullYear() + '-' +
573 f(this.getMonth() + 1) + '-' +
574 f(this.getDate()) + 'T' +
575 f(this.getHours()) + ':' +
576 f(this.getMinutes()) + ':' +
577 f(this.getSeconds()) + '"';
578 };
579
580 Number.prototype.toJSONString = function () {
581
582 // JSON numbers must be finite. Encode non-finite numbers as null.
583
584 return isFinite(this) ? String(this) : "null";
585 };
586
587 Object.prototype.toJSONString = function () {
588 var a = ['{'], // The array holding the text fragments.
589 b, // A boolean indicating that a comma is required.
590 k, // The current key.
591 v; // The current value.
592
593 function p(s) {
594
595 // p accumulates text fragment pairs in an array. It inserts a comma before all
596 // except the first fragment pair.
597
598 if (b) {
599 a.push(',');
600 }
601 a.push(k.toJSONString(), ':', s);
602 b = true;
603 }
604
605 // Iterate through all of the keys in the object, ignoring the proto chain.
606
607 for (k in this) {
608 if (this.hasOwnProperty(k)) {
609 v = this[k];
610 switch (typeof v) {
611
612 // Values without a JSON representation are ignored.
613
614 case 'undefined':
615 case 'function':
616 case 'unknown':
617 break;
618
619 // Serialize a JavaScript object value. Ignore objects that lack the
620 // toJSONString method. Due to a specification error in ECMAScript,
621 // typeof null is 'object', so watch out for that case.
622
623 case 'object':
624 if (this !== window)
625 {
626 if (v) {
627 if (typeof v.toJSONString === 'function') {
628 p(v.toJSONString());
629 }
630 } else {
631 p("null");
632 }
633 }
634 break;
635 default:
636 p(v.toJSONString());
637 }
638 }
639 }
640
641 // Join all of the fragments together and return.
642
643 a.push('}');
644 return a.join('');
645 };
646
647 (function (s) {
648
649 // Augment String.prototype. We do this in an immediate anonymous function to
650 // avoid defining global variables.
651
652 // m is a table of character substitutions.
653
654 var m = {
655 '\b': '\\b',
656 '\t': '\\t',
657 '\n': '\\n',
658 '\f': '\\f',
659 '\r': '\\r',
660 '"' : '\\"',
661 '\\': '\\\\'
662 };
663
664 s.parseJSON = function (filter) {
665
666 // Parsing happens in three stages. In the first stage, we run the text against
667 // a regular expression which looks for non-JSON characters. We are especially
668 // concerned with '()' and 'new' because they can cause invocation, and '='
669 // because it can cause mutation. But just to be safe, we will reject all
670 // unexpected characters.
671
672 try {
673 if (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.
674 test(this)) {
675
676 // In the second stage we use the eval function to compile the text into a
677 // JavaScript structure. The '{' operator is subject to a syntactic ambiguity
678 // in JavaScript: it can begin a block or an object literal. We wrap the text
679 // in parens to eliminate the ambiguity.
680
681 var j = eval('(' + this + ')');
682
683 // In the optional third stage, we recursively walk the new structure, passing
684 // each name/value pair to a filter function for possible transformation.
685
686 if (typeof filter === 'function') {
687
688 function walk(k, v) {
689 if (v && typeof v === 'object') {
690 for (var i in v) {
691 if (v.hasOwnProperty(i)) {
692 v = walk(i, v);
693 }
694 }
695 }
696 return filter(k, v);
697 }
698
699 j = walk('', j);
700 }
701 return j;
702 }
703 } catch (e) {
704
705 // Fall through if the regexp test fails.
706
707 }
708 throw new SyntaxError("parseJSON");
709 };
710
711 s.toJSONString = function () {
712
713 // If the string contains no control characters, no quote characters, and no
714 // backslash characters, then we can simply slap some quotes around it.
715 // Otherwise we must also replace the offending characters with safe
716 // sequences.
717
718 // add by weberliu @ 2007-4-2
719 var _self = this.replace("&", "%26");
720
721 if (/["\\\x00-\x1f]/.test(this)) {
722 return '"' + _self.replace(/([\x00-\x1f\\"])/g, function(a, b) {
723 var c = m;
724 if (c) {
725 return c;
726 }
727 c = b.charCodeAt();
728 return '\\u00' +
729 Math.floor(c / 16).toString(16) +
730 (c % 16).toString(16);
731 }) + '"';
732 }
733 return '"' + _self + '"';
734 };
735 })(String.prototype);
736 }
737 */
738
739 Ajax.onRunning = showLoader;
740 Ajax.onComplete = hideLoader;
741
742 /* *
743 * 显示载入信息
744 */
745 function showLoader()
746 {
747 document.getElementsByTagName('body').item(0).style.cursor = "wait";
748
749 if (top.frames['header-frame'])
750 {
751 top.frames['header-frame'].document.getElementById("load-div").style.display = "block";
752 }
753 else
754 {
755 var obj = document.getElementById('loader');
756
757 if ( ! obj && process_request)
758 {
759 obj = document.createElement("DIV");
760 obj.id = "loader";
761 obj.innerHTML = process_request;
762
763 document.body.appendChild(obj);
764 }
765 }
766 }
767
768 /* *
769 * 隐藏载入信息
770 */
771 function hideLoader()
772 {
773 document.getElementsByTagName('body').item(0).style.cursor = "auto";
774 if (top.frames['header-frame'])
775 {
776 setTimeout(function(){top.frames['header-frame'].document.getElementById("load-div").style.display = "none"}, 10);
777 }
778 else
779 {
780 try
781 {
782 var obj = document.getElementById("loader");
783 obj.style.display = 'none';
784 document.body.removeChild(obj);
785 }
786 catch (ex)
787 {}
788 }
789 }
790
791 function objToJSONString(obj, filter){
792 return JSON.stringify(obj, filter);
793 }
794
795 function parseObjectToJSON(object, filter){
796 return JSON.parse(object, filter);
797 }
成功解决!
本文标签:
很赞哦! ()
相关教程
图文教程
ecshop商品属性排序怎么按最新添加商品属性排序
情况一:添加新产品时,让属 按照添加的顺序(属 id)排列修改/inclues/lib_goods.php情况二:在 商品时属 排序跟原商品相反到处理修改/inclues/lib_goods.php
ecshop大量重复页面提高SEO效果的解决方法
使用过ECSHOP的朋友都会知道ECSHOP有严重的重复收录过多的问题,很多朋友的网站实际产品加文章数量仅仅1000来个,查询链接居然有3,4千,google甚至会有上万。 重复链接因为Title
ecshop中的$user对象说明
ecshop的程序中,有个对象:$user,它是用来处理用户信息的。比如登录、注册,还有就是用来和第三方管理通讯和共享资源的。在user.php中
ecshop出现shop_config错误的解决方法
近日,有客户告诉我们。他们的ECSHOP网站瘫痪了。出现shop_config错误!那么,为什么会出现这样的问题呢?我们又该如何解决呢?下面,商易就和大家一一详解!
相关源码
-
(自适应响应式)门窗定制门业带视频功能pbootcms模板下载本模板采用PbootCMS内核开发,为门窗制造、定制安装企业打造,通过可视化后台管理系统快速构建品牌官网。自适应设计确保在手机、平板、电脑等设备上均能获得优质浏览体验查看源码 -
粉色家政月嫂保姆公司pbootcms网站模板(PC+WAP)为家政服务、月嫂保姆企业打造的营销型解决方案,基于PbootCMS内核开发,采用温馨粉色主题传递行业温度。PHP7.0+高性能架构支持SQLite/MySQL双数据库查看源码 -
(PC+WAP)餐饮奶茶美食小吃招商加盟pbootcms模板源码下载为茶饮烘焙、小吃快餐等餐饮品牌打造的招商加盟系统,助力品牌快速拓展市场;双端pc+wap设计呈现加盟政策对比表。支持后台实时更新菜品图片、加盟费用等关键信息。查看源码 -
(自适应)pbootcms模板五金元件气缸气动系统源码下载基于PbootCMS核心开发的气缸气动系统网站模板,为五金元件、气动设备制造企业设计。采用响应式布局技术,自动适配手机、平板等移动设备,确保各类终端用户获得良好浏览体验。查看源码 -
(自适应响应式)HTML5简繁双语电子元器件设备制造Pbootcms模板下载本模板为电子科技设备制造、电子元件生产等高科技企业设计,采用PbootCMS内核开发,具备简繁双语切换功能。模板设计充分考虑了电子科技行业的技术展示需求,能够专业呈现各类电子元器件、电路板、智能设备的参数规格和应用方案。查看源码 -
pbootcms响应式蓝色旅游旅行社pbootcms网站源码下载为旅游公司、旅行社定制的响应式网站模板,聚焦旅游线路展示、景点推荐及预约服务场景。采用PbootCMS内核开发,自适应技术确保PC与手机端数据实时同步查看源码
| 分享笔记 (共有 篇笔记) |
