<think>我们已经在之前的讨论中详细说明了如何根据语言动态切换广告位PID。现在,根据您给出的思路(不同语言显示不同banner),我将提供一个更简洁的实现方案,特别针对eyoucms模板标签。
### 解决方案:动态广告位PID
#### 步骤1:在公共函数文件中定义语言映射
在`/application/common.php`中添加以下函数:
```php
/**
* 获取当前语言
*/
function get_current_lang() {
// 1. 从URL参数获取(例如:?lang=en)
if (isset($_GET['lang']) && in_array($_GET['lang'], ['zh', 'en', 'ja'])) {
return $_GET['lang'];
}
// 2. 从Session获取
if (isset($_SESSION['user_lang']) && in_array($_SESSION['user_lang'], ['zh', 'en', 'ja'])) {
return $_SESSION['user_lang'];
}
// 3. 从Cookie获取
if (isset($_COOKIE['site_lang']) && in_array($_COOKIE['site_lang'], ['zh', 'en', 'ja'])) {
return $_COOKIE['site_lang'];
}
// 4. 从浏览器语言获取
$browserLang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
if (in_array($browserLang, ['zh', 'en', 'ja'])) {
return $browserLang;
}
// 5. 默认语言
return 'zh'; // 默认中文
}
/**
* 根据语言获取广告位PID
*/
function get_banner_pid() {
$lang = get_current_lang();
$map = [
'zh' => 1, // 中文广告位PID
'en' => 2, // 英文广告位PID
'ja' => 3 // 日文广告位PID
];
return $map[$lang] ?? $map['zh']; // 默认中文
}
```
#### 步骤2:在模板中动态调用广告位
修改模板文件(例如:`/template/pc/default/index/index.html`)中的banner部分:
```html
<section class="home-banner">
<div class="swiper" id="indexbanner">
<div class="swiper-wrapper">
<!-- 动态调用广告位,使用函数get_banner_pid()获取当前语言对应的PID -->
{eyou:adv pid=':get_banner_pid();'}
<div class="swiper-slide">
<a href="{$field.links}" title="{$field.title}" class="pcimg">
<img src="{$field.litpic}" width="1920" height="801" alt="{$field.title}"/>
</a>
<a href="{$field.links}" title="{$field.title}" class="mobimg">
<img src="{$field.litpic}" width="750" height="313" alt="{$field.title}"/>
</a>
<div class="banner-animote">
<div class="title">{$field.title}</div>
<div class="text">{$field.intro}</div>
</div>
</div>
{/eyou:adv}
</div>
<div class="swiper-pagination banner-pagination"></div>
<div class="banner-button-next"><em class="iconfont icon-xiangyoujiantou"></em></div>
<div class="banner-button-prev"><em class="iconfont icon-xiangzuojiantou"></em></div>
</div>
</section>
```
#### 步骤3:创建语言切换控制器
创建文件`/application/index/controller/Language.php`:
```php
<?php
namespace app\index\controller;
use think\Controller;
class Language extends Controller
{
public function switchLang($lang = 'zh')
{
// 验证语言
$allowedLangs = ['zh', 'en', 'ja'];
if (!in_array($lang, $allowedLangs)) {
$this->error('语言不支持');
}
// 设置Session
session('user_lang', $lang);
// 设置Cookie(30天有效期)
cookie('site_lang', $lang, 30 * 86400);
// 返回上一页
$this->redirect($_SERVER['HTTP_REFERER']);
}
}
```
#### 步骤4:在模板中添加语言切换链接
在需要切换语言的地方(如页眉)添加:
```html
<div class="language-switcher">
<a href="{:url('index/language/switchLang', ['lang'=>'zh'])}">中文</a>
<a href="{:url('index/language/switchLang', ['lang'=>'en'])}">English</a>
<a href="{:url('index/language/switchLang', ['lang'=>'ja'])}">日本語</a>
</div>
```
#### 步骤5:配置路由(可选)
在`/application/route.php`中添加:
```php
use think\Route;
Route::get('switch-lang/:lang', 'index/language/switchLang');
```
### 原理解释
1. **动态广告位PID**:
- 通过`get_banner_pid()`函数获取当前语言对应的广告位ID
- 在eyoucms标签中,使用`pid=':get_banner_pid();'`动态传入PID
- 函数内部维护语言到广告位ID的映射
2. **语言切换流程**:
- 用户点击语言链接 → 调用`switchLang`方法
- 方法设置Session和Cookie → 重定向回原页面
- 页面重新加载时,`get_current_lang()`会读取新的语言设置
- 广告位PID随之更新,展示对应语言的banner
### 注意事项
1. **广告位创建**:
- 在后台创建三个广告位,PID分别为1(中文)、2(英文)、3(日文)
- 每个广告位添加对应语言的广告内容
2. **缓存问题**:
- 如果使用了页面缓存,需要在语言切换时清除缓存
- 在广告标签中添加随机参数避免缓存:`{eyou:adv pid=':get_banner_pid();' rand=':time();'}`
3. **默认语言**:
- 确保默认语言(中文)的广告位PID=1存在
4. **SEO优化**:
- 为不同语言版本添加hreflang标签,帮助搜索引擎识别多语言页面
### 高级优化:无刷新切换(AJAX)
```javascript
// 语言切换按钮事件
$('.lang-switch').click(function(e) {
e.preventDefault();
var lang = $(this).data('lang');
// 发送AJAX请求切换语言
$.post('/switch-lang', {lang: lang}, function() {
// 重新加载banner区域
reloadBanner();
});
});
// 重新加载banner
function reloadBanner() {
$.get(window.location.href, function(html) {
var newBanner = $(html).find('.home-banner').html();
$('.home-banner').html(newBanner);
// 重新初始化Swiper
if (typeof Swiper !== 'undefined') {
new Swiper('#indexbanner', {
// ...配置...
});
}
});
}
```
### 最终效果
- 中文用户访问时,显示PID=1的banner(中文广告)
- 英文用户访问时,显示PID=2的banner(英文广告)
- 日文用户访问时,显示PID=3的banner(日文广告)
- 用户切换语言后,页面刷新并显示对应语言的banner
§§相关问题§§:
1. 如何在eyoucms中实现多语言内容管理(文章、产品等)
2. 使用AJAX实现无刷新语言切换时如何避免页面闪烁
3. 多语言网站如何设置404页面和错误处理
4. 在eyoucms中如何批量导入多语言内容</think>### 详细解决方案:在eyoucms中实现多语言banner切换
根据您的思路,我将提供完整的实现方案,让不同语言显示不同的banner。以下是详细的步骤和代码:
#### 核心思路
1. 为每种语言创建独立的广告位(不同PID)
2. 根据当前语言动态选择广告位PID
3. 在模板中动态调用对应语言的广告位
#### 完整实现代码
##### 步骤1:创建语言识别函数(全局函数)
在`/application/common.php`中添加:
```php
// 获取当前语言
function get_current_lang() {
// 1. 检查URL参数(最高优先级)
if (!empty($_GET['lang'])) {
$lang = substr($_GET['lang'], 0, 2);
if (in_array($lang, ['zh', 'en'])) {
return $lang;
}
}
// 2. 检查会话(用户本次访问设置)
if (!empty($_SESSION['user_lang'])) {
return $_SESSION['user_lang'];
}
// 3. 检查Cookie(长期设置)
if (!empty($_COOKIE['site_lang'])) {
return $_COOKIE['site_lang'];
}
// 4. 检查浏览器语言
if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
$browser_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
if (in_array($browser_lang, ['zh', 'en'])) {
return $browser_lang;
}
}
// 5. 默认语言(从系统配置获取)
return \think\Config::get('default_lang') ?: 'zh';
}
// 获取当前语言的banner PID
function get_banner_pid() {
$lang = get_current_lang();
// 语言到PID的映射(可在后台配置)
$map = [
'zh' => 1, // 中文广告位PID
'en' => 2 // 英文广告位PID
// 添加更多语言...
];
return $map[$lang] ?? $map['zh']; // 默认使用中文
}
```
##### 步骤2:创建语言切换控制器
创建`/application/index/controller/Language.php`:
```php
<?php
namespace app\index\controller;
class Language extends \think\Controller
{
// 语言切换
public function switchLang($lang = 'zh')
{
// 验证语言是否合法
$allowed_langs = ['zh', 'en'];
if (!in_array($lang, $allowed_langs)) {
$this->error('不支持的语言');
}
// 设置会话
session('user_lang', $lang);
// 设置Cookie(30天有效期)
cookie('site_lang', $lang, 30 * 86400);
// 返回上一页
$this->redirect($_SERVER['HTTP_REFERER']);
}
}
```
##### 步骤3:修改模板文件
在您的模板文件(如`/template/pc/default/index/index.html`)中修改banner部分:
```html
<!-- 语言切换按钮 -->
<div class="language-switcher">
<a href="{:url('index/language/switchLang', ['lang' => 'zh'])}" class="lang-zh">中文</a>
<a href="{:url('index/language/switchLang', ['lang' => 'en'])}" class="lang-en">English</a>
</div>
<!-- 动态banner区域 -->
<section class="home-banner">
<div class="swiper" id="indexbanner">
<div class="swiper-wrapper">
<!-- 动态PID调用:根据语言选择不同的广告位 -->
{eyou:adv pid=':get_banner_pid();'}
<div class="swiper-slide">
<a href="{$field.links}" title="{$field.title}" class="pcimg">
<img src="{$field.litpic}" width="1920" height="801" alt="{$field.title}"/>
</a>
<a href="{$field.links}" title="{$field.title}" class="mobimg">
<img src="{$field.litpic}" width="750" height="313" alt="{$field.title}"/>
</a>
<div class="banner-animote">
<div class="title">{$field.title}</div>
<div class="text">{$field.intro}</div>
</div>
</div>
{/eyou:adv}
</div>
<div class="swiper-pagination banner-pagination"></div>
<div class="banner-button-next"><em class="iconfont icon-xiangyoujiantou"></em></div>
<div class="banner-button-prev"><em class="iconfont icon-xiangzuojiantou"></em></div>
</div>
</section>
```
##### 步骤4:配置路由(可选)
在`/application/route.php`中添加:
```php
use think\Route;
Route::get('switch-lang/:lang', 'index/language/switchLang');
```
##### 步骤5:后台广告位设置
1. 登录eyoucms后台
2. 进入「系统」→「广告管理」→「广告位管理」
3. 创建两个广告位:
- 中文首页轮播 (PID=1)
- 英文首页轮播 (PID=2)
4. 为每个广告位添加对应的banner内容
#### 实现原理详解
1. **语言检测流程**:
- 系统通过`get_current_lang()`函数检测当前语言
- 检测顺序:URL参数 > 会话 > Cookie > 浏览器语言 > 默认语言
- 确保用户手动选择的语言优先级最高
2. **动态PID调用**:
- `get_banner_pid()`函数根据当前语言返回对应的PID
- 在模板中使用`{eyou:adv pid=':get_banner_pid();'}`动态调用广告位
- 中文用户:调用PID=1的广告位
- 英文用户:调用PID=2的广告位
3. **语言切换机制**:
```mermaid
sequenceDiagram
用户->>前端: 点击语言切换按钮
前端->>后端: 请求 /switch-lang/en
后端->>后端: 设置session和cookie
后端->>前端: 重定向回原页面
前端->>后端: 重新加载页面
后端->>模板引擎: 渲染页面
模板引擎->>PHP: 调用get_banner_pid()
PHP->>模板引擎: 返回当前PID(如2)
模板引擎->>前端: 输出英文banner
```
#### 高级优化:AJAX无刷新切换
```javascript
// 在模板底部添加
<script>
$(document).ready(function() {
// 语言切换按钮点击事件
$('.language-switcher a').click(function(e) {
e.preventDefault();
var lang = $(this).hasClass('lang-en') ? 'en' : 'zh';
// 发送AJAX请求切换语言
$.ajax({
url: '/switch-lang/' + lang,
type: 'GET',
success: function() {
// 重新加载banner区域
reloadBanner();
}
});
});
// 重新加载banner
function reloadBanner() {
$.ajax({
url: window.location.href,
data: { 'partial': 'banner' }, // 只请求banner部分
success: function(response) {
// 提取新的banner内容
var newBanner = $(response).find('.home-banner').html();
// 替换当前banner
$('.home-banner').html(newBanner);
// 重新初始化Swiper
if (typeof Swiper !== 'undefined') {
new Swiper('#indexbanner', {
loop: true,
pagination: {
el: '.swiper-pagination',
clickable: true
},
navigation: {
nextEl: '.banner-button-next',
prevEl: '.banner-button-prev'
},
autoplay: {
delay: 5000,
}
});
}
}
});
}
});
</script>
```
#### 后台控制器优化(支持部分加载)
在控制器中添加部分加载支持:
```php
// /application/index/controller/Index.php
public function index()
{
// ...原有代码...
// 如果是AJAX请求且只请求banner部分
if ($this->request->isAjax() && $this->request->param('partial') == 'banner') {
return $this->fetch('index/banner');
}
return $this->fetch();
}
```
创建部分模板文件`/template/pc/default/index/banner.html`:
```html
<!-- 只包含banner部分 -->
<section class="home-banner">
<!-- ...banner代码与主模板相同... -->
</section>
```
#### 多语言SEO优化
在模板头部添加:
```html
<head>
<!-- 多语言SEO -->
<link rel="alternate" hreflang="zh" href="{:url('index/index/index', ['lang' => 'zh'])}" />
<link rel="alternate" hreflang="en" href="{:url('index/index/index', ['lang' => 'en'])}" />
<!-- 设置当前页面语言 -->
<meta property="og:locale" content="{:get_current_lang()}" />
<!-- 语言切换的规范URL -->
{if get_current_lang() == 'zh'}
<link rel="canonical" href="{:url('index/index/index', ['lang' => 'zh'])}" />
{else}
<link rel="canonical" href="{:url('index/index/index', ['lang' => 'en'])}" />
{/if}
</head>
```
#### 注意事项
1. **缓存处理**:
- 在广告标签中添加随机参数:`{eyou:adv pid=':get_banner_pid();' rand=':time();'}`
- 在语言切换时清除模板缓存
2. **默认语言设置**:
在`/config/app.php`中添加:
```php
'default_lang' => 'zh', // 默认语言
```
3. **广告位不存在处理**:
```php
function get_banner_pid() {
// ...原有代码...
// 检查PID是否存在
$exists = \think\Db::name('adv')->where('pid', $pid)->find();
return $exists ? $pid : $map['zh'];
}
```
4. **多语言扩展**:
- 添加新语言只需在映射数组中添加:
```php
$map = [
'zh' => 1,
'en' => 2,
'fr' => 3, // 法语
'es' => 4 // 西班牙语
];
```
### 最终效果
- 中文用户访问时,显示PID=1的中文banner
- 英文用户访问时,显示PID=2的英文banner
- 用户可以通过语言切换按钮实时切换语言
- 系统会记住用户的语言偏好(通过session和cookie)