yii2 createUrl正在复制路由

时间:2016-02-23 10:11:55

标签: yii2 yii2-advanced-app

我正在使用英语和阿拉伯语构建多语言网站

url for English

url for Arabic

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

   $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']); } ?>

和我的网址生成如下

/多/后端/网络/ EN /多/后端/网络/ AR /站点/索引VAL = HII&安培;净=好

English

不知道出了什么问题?

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

请检查backend / config

下的 main.php
            <?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,
            ];

2 个答案:

答案 0 :(得分: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 - var的值。我希望它有所帮助!

您的代码和扩展程序可能出现的问题

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

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

您正在创建一个简单的链接标记并覆盖$params。试试这个:

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

要重定向到当前页面,只需用当前路径替换第一部分。

答案 1 :(得分: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