リストビューを持つコンポーネントを開発します:index.php?option=com_mycomponent&view=listview&catid=1
さまざまなカテゴリを指すこのコンポーネントのいくつかのメニュー要素を公開しました。
それらは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を変更するための方法です。
どうすればこれを達成できるでしょうか?
言語フィルターシステムプラグインを確認すると、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;
}
}