OctoberCMS Перевести плагин перенаправить с помощью хэша - PullRequest
0 голосов
/ 17 февраля 2020

Я использую плагин OctoberCMS Translate (https://octobercms.com/plugin/rainlab-translate) и он работает в соответствии с моими ожиданиями.

Однако у меня есть одно пользовательское требование, в котором я генерирую га sh в URL (то есть http://localhost/ibis/whats-on/details#2020 -sydney-international-whitewater-event - # 2020-sydney-international-whitewater-event ).

Теперь дело в том, , когда я должен перенаправить, используя приведенный ниже код,

 {% for code, name in locales %}
  <a class="dropdown-item" href="#" data-request="onSwitchLocale" data-request-data="locale: '{{ code }}'">
      {{ name |upper }}
  </a>

Я могу перенаправить, однако мой URL теряет свой тег ha sh, и он становится чем-то вроде http://localhost/ibis/fr/whats-on/details ( fr - мой выбранный французский язык).

Здесь ниже мой код перезаписи на вкладке кода макета в onSwitchLocale метод, который предоставляется Перевести плагин .

use RainLab\Translate\Models\Locale as LocaleModel;
use RainLab\Translate\Classes\Translator;
use October\Rain\Router\Router as RainRouter;


function onSwitchLocale()
{
    $this->translator = Translator::instance();
    $locale = post('locale');

    if (!$locale = post('locale')) {
            return;
    }
    $this->translator->setLocale($locale);

    $pageUrl = $this->translator->withPreservedQueryString($this->translator->makeLocaleUrlFromPage($locale), $locale);
    if ($this->property('forceUrl')) {
        return Redirect::to($this->translator->getPathInLocale($pageUrl, $locale));
    }

    return Redirect::to($pageUrl);
}

Как вы видите, я пытается выполнить sh перенаправление URL с ha sh, но я получаю здесь ошибку, говоря:

вызов неопределенного метода RainLab \ Translate \ Classes \ Translator :: withPreservedQueryString ()

И не удалось выполнить этот запрос. Я продолжил исследования и обнаружил, что withPreservedQueryString имеет защищенный метод, и я пытался различными способами выполнить этот метод, но не смог этого сделать.

Итак, сначала мне нужно выполнить sh, а затем я хочу добавить тег hash в свой URL.

Может ли кто-нибудь подсказать мне, как мне этого добиться?

Спасибо

1 Ответ

1 голос
/ 17 февраля 2020

Я не уверен $this->translator [Translator :: instance (); ] есть этот метод там! это просто метод компонента LocalePicker.

Это реализованный код, поэтому используйте его и определите свой собственный метод

protected function withPreservedQueryString($pageUrl, $locale)
{
    $page = $this->getPage();
    $query = request()->query();

    /**
     * @event translate.localePicker.translateQuery
     * Enables manipulating the URL query parameters
     *
     * You will have access to the page object, the old and new locale and the URL query parameters.
     *
     * Example usage:
     *
     *     Event::listen('translate.localePicker.translateQuery', function($page, $params, $oldLocale, $newLocale) {
     *        if ($page->baseFileName == 'your-page-filename') {
     *             return YourModel::translateParams($params, $oldLocale, $newLocale);
     *         }
     *     });
     *
     */
    $translatedQuery = Event::fire('translate.localePicker.translateQuery',
                                    [$page, $query, $this->oldLocale, $locale], true);

    $query = http_build_query($translatedQuery ?: $query);

    return $query ? $pageUrl . '?' . $query : $pageUrl;
}

Используйте его как это

$pageUrl = $this->
    withPreservedQueryString(  // <- this call
        $this->translator->makeLocaleUrlFromPage($locale), 
        $locale
    );
if ($this->property('forceUrl')) {
    return Redirect::to($this->translator->getPathInLocale($pageUrl, $locale));
}

это должно работать, если есть сомнения, прокомментируйте.

...