yii2 createUrl 正在复制路由

问题描述 投票:0回答:2

我正在建立英语和阿拉伯语的多语言网站

英文网址

阿拉伯语网址

我想将语言从任何页面完全切换到另一种语言的同一页面 所以我编写了如下代码。

   $route = Yii::$app->controller->route;
   $params = $_GET;
   array_unshift($params, '/'.$route);

  <?php if(Yii::$app->language == 'ar'){ ?>
  <?= Html::a('English', [Yii::$app->urlManager->createUrl($params), 'language'=>'en']); ?>
  <?php }else{?>
  <?= Html::a('Arabic', [Yii::$app->urlManager->createUrl($params), 'language'=>'ar']); } ?>

我的网址生成如下

/multi/backend/web/en/multi/backend/web/ar/site/index?val=hii&net=good

英语

不知道出了什么问题?

我正在使用 this 进行语言管理。

请检查我的 main.php 在 backend/config

            <?php
            $params = array_merge(
                require(__DIR__ . '/../../common/config/params.php'),
                require(__DIR__ . '/../../common/config/params-local.php'),
                require(__DIR__ . '/params.php'),
                require(__DIR__ . '/params-local.php')
            );

            return [
                'id' => 'app-backend',
                'basePath' => dirname(__DIR__),
                'controllerNamespace' => 'backend\controllers',
                'language' => 'en',
                'sourceLanguage' => 'en_UK',
                'bootstrap' => ['log'],
                'modules' => [],
                'components' => [
                    'user' => [
                        'identityClass' => 'common\models\User',
                        'enableAutoLogin' => true,
                    ],
                    'log' => [
                        'traceLevel' => YII_DEBUG ? 3 : 0,
                        'targets' => [
                            [
                                'class' => 'yii\log\FileTarget',
                                'levels' => ['error', 'warning'],
                            ],
                        ],
                    ],
                    'errorHandler' => [
                        'errorAction' => 'site/error',
                    ],
                    'i18n' => [
                        'translations' => [
                            'app' => [
                                'class' => 'yii\i18n\DbMessageSource',
                                'sourceLanguage' => 'en_UK',
                            ],
                        ],
                     ],
                    'urlManager' => [
                        'class' => 'codemix\localeurls\UrlManager',
                        'languages' => ['en', 'ar'],
                        'enableDefaultLanguageUrlCode' => false,
                        'enablePrettyUrl' => true,
                        'showScriptName' => false,
                        'rules' => [
                        ],
                    ],
                ],
                'params' => $params,
            ];
php yii2 yii2-advanced-app
2个回答
3
投票

如果您按照示例进行操作,则必须在创建的每个链接上考虑这一点。这可以轻松实现自动化。

URL 规则

您可以使用配置文件中的 url-rule 来解决此问题,如下所示:

'<language:[\w]{2,2}>/<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

这将断言到您的控制器的正确路由,并在

language
变量中为您提供所需的语言。

自定义 UrlManager

您可以扩展

UrlManager
类并确保当前语言始终附加到参数中:

class MyUrlManager extends \yii\web\UrlManager
{
    // ...

    /**
     * @inheritdoc
     */
    public function createUrl($params)
    {
        if (!isset($params['language'])) {
            $params['language'] = Yii::$app->language;
        }

        return parent::createUrl($params);
    }

    // ...
}

这将自动执行将语言添加到您创建的链接的过程。

定制应用程序

现在您还应该覆盖

Application
类,并始终将语言设置为提供的语言或选择默认值(在本例中为
en
):

class MyApplication extends \yii\web\Application
{
    // ...

    /**
     * @inheritdoc
     */
    public function init()
    {
        parent::init();

        $lang = Yii::$app->request->get('language', 'en');
        Yii::$app->language = $lang;
    }

    // ...
}

现在您的语言将始终设置为默认值或通过上面指定的查询参数提供的语言。

最后的想法

这应该为您提供如何解决问题的基本想法。根据需要进行调整...尤其是最后一部分

Application
类以及如何检索
language
变量的值。我希望它有帮助!

您的代码和提供的扩展可能存在问题

如果您阅读扩展程序的文档,则会以不同的方式生成网址。它告诉您创建网址如下:

Url::to(['demo/action', 'language'=>'ar'])

您正在创建一个简单的链接标签并覆盖

$params
。试试这个:

echo Html::a('Arabic', Url::to(['site/index', 'language'=>'ar']));

要重定向到当前页面,只需将第一部分替换为当前路由即可。


1
投票

经过多次尝试..我找到了解决方案..现在它对我有用。

    $route = Yii::$app->controller->route;
    if(Yii::$app->language == 'ar'){
        $_GET['language'] = 'en';
    }else{
        $_GET['language'] = 'ar';
    }
    $params = $_GET;
    array_unshift($params, '/'.$route);

  <?php if(Yii::$app->language == 'ar'){ ?>
  <?= Html::a('English', Yii::$app->urlManager->createUrl($params)); ?>
  <?php }else{?>
  <?= Html::a('Arabic', Yii::$app->urlManager->createUrl($params)); } ?>

它适用于像这样的网址

http://localhost/multi/backend/web/site/index?page=2&per-page=6

http://localhost/multi/backend/web/site/index

© www.soinside.com 2019 - 2024. All rights reserved.