web-dev-qa-db-ja.com

任意のテキストを含むSEF URLを変更する方法

リストビューを持つコンポーネントを開発します:index.php?option=com_mycomponent&view=listview&catid=1

さまざまなカテゴリを指すこのコンポーネントのいくつかのメニュー要素を公開しました。

  • cat1
  • cat2
  • cat3

それらはmenúアイテムであるため、SEF URLは次のとおりです。

  • www.myweb.com/cat1

  • www.myweb.com/cat2

  • www.myweb.com/cat3

これまでのところ、通常の動作は良好です。

また、ロケーションテキスト付きのCookieを取得しました。私の顧客は、Cookieの値に応じてURLが異なることを望んでいます。

Cookieの値が「マドリード」の場合、URLは

  • www.myweb.com/madrid/cat1

  • www.myweb.com/madrid/cat2

  • www.myweb.com/madrid/cat3

Cookieの値が「バルセロナ」の場合、

  • www.myweb.com/barcelona/cat1

  • www.myweb.com/barcelona/cat2

  • www.myweb.com/barcelona/cat3

等々。

それ以外は何もありません。リストはすべての場合でまったく同じですが、URLを変更するための方法です。

どうすればこれを達成できるでしょうか?

2
Piero Marsilio

言語フィルターシステムプラグインを確認すると、URLを操作してリンクに言語プレフィックスを追加する方法がわかります。同じ方法を使用して、Cookie値に基づいて場所の接頭辞を追加できます。

これが私がやったことですが、私はトリッキーなリクエストがあったことを念頭に置いて、それを言語フィルタープラグインと一緒に機能させ、国を言語コードの前に表示させる必要がありました。異なる国が同じアイテムを表示でき、言語は共通の国で共有されます。 K2のカスタム国別フィールドプラグインと組み合わせて機能しますが、これには無関係です。私がしたことはJoomla 3.4以降でのみ可能です

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

class PlgSystemCountryFilter extends JPlugin
{
   protected $app;

   public $countries = array('austria', 'belgium', 'czech-republic', 'poland', 'slovakia', 'ukraine');
   public $country;

   public function __construct(&$subject, $config)
   {
      parent::__construct($subject, $config);
      $this->app = JFactory::getApplication();
   }

   public function onAfterInitialise()
   {
      if ($this->app->isSite())
      {
         // country/fr/menus
         $path = str_replace(JUri::root(), '', JUri::current());

         $parts = explode('/', $path);
         if(!empty($parts[0]) && in_array($parts[0], $this->countries)) {
            $this->country = $parts[0];
            $router = $this->app->getRouter();

            $router->attachBuildRule(array($this, 'buildRule'), JRouter::PROCESS_BEFORE);
            $router->attachBuildRule(array($this, 'postprocessSEFBuildRule'), JRouter::PROCESS_AFTER);
            $router->attachParseRule(array($this, 'parseRule'), JRouter::PROCESS_BEFORE);
         }
      }
   }

   public function buildRule(&$router, &$uri)
   {
      if(!empty($this->country)) {
         $parts = explode('/', $uri->getPath());
         $lang = array_shift($parts);
         $uri->setPath(implode('/', $parts) . '/' . $this->country . '/' . $lang . '/');
      }
   }

   public function postprocessSEFBuildRule(&$router, &$uri)
   {    
      $uri->delVar('sitecountry');
   }

   public function parseRule(&$router, &$uri)
   {
      $path = $uri->getPath();
      $parts = explode('/', $path);
      if(!empty($parts[0]) && in_array($parts[0], $this->countries)) {
         $country = $parts[0];
      }

      $array = array();
      if(!empty($country)) {
         array_shift($parts);
         // if we are supposed to be on the root page /fr, then make it be like /fr/country so that per country homepage can be displayed
         // for this to work hidden menu with aliases /country must be created
         if(count($parts) == 1) {
            $parts[] = $country;
         }
         $uri->setPath(implode('/', $parts));

         $this->app->input->set('sitecountry', $country);
         $array = array('sitecountry' => $country);
      }
      return $array;
   }

}
2
Marko D