Поддержка мульти язычности и ЧПУ для самописного компонента

  • 5 Ответов
  • 249 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

voron121

  • Давно я тут
  • ****
  • 222
  • 1
  • Метод тыка и мата помогает в кодинге
Доброго времени суток уважаемые форумчане. Дорос я до того что решил попробовать написать свой компонент для Joomla (пробую написать компонент работы с турами для турфирмы по аналогии с компонентом статей). Есесн как "самый умный" попробовал написать примитивный компонент по видео уроку - как ни странно получилось и даже работает. Это дало мне возможность примерно понять как все работает. Однако нужно сделать поддержку ЧПУ урлов и мульти язычность в компоненте. К сожалению Google по запросам выдает лишь советы как настроить ЧПУ в самой Joomla и ни слова про то, как сделать мальти языность и ЧПУ для своего компонента. По сему прошу помощи у вас. Возможно кто то сталкивался с подобной задачей и может подсказать где и что искать  или же тыкнуть в доки.

То есть сейчас компонент создает запись в БД с нужными для меня полями. Я хочу сделать поддержку мультиязычности компонента как это реализованно в компоненте создания материалов Joomla и поддержку ЧПУ для ссылок на страницы моего компонента (в БД есть запись алиаса ссылки вывожу через JRoute::_(""); )

*

voron121

  • Давно я тут
  • ****
  • 222
  • 1
  • Метод тыка и мата помогает в кодинге
UPD:

с мультиязычностью разобрался: добавил в форме добавления записи в админке список с языками и в моделе выборки статей для фронтенда изменил код с проверкой на мульти язычность :

Код: php
<?php
defined('_JEXEC') or exit;
//Модель работает с БД и получает список  записей с турами
class TourModelTour extends JModelList {

protected function getListQuery() {

if (JLanguageMultilang::isEnabled()) {

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*');
$query->from('#__tour');
$query->where('`published` = 1');
$query->where('language in (' . $db->quote(JFactory::getLanguage()->getTag()). ',' . $db->quote('*'). ')');
$query->order('`id` DESC');

}else {
$query = $db->getQuery(true);
$query->select('*');
$query->from('#__tour');
$query->where('`published` = 1');
$query->order('`id` DESC');
}

return($query);
}

}

?>

Однако вопрос с урлами остался. Я так понимаю что в папке компонента для фронтенда в корне должен лежать фаил route.php  который будет обрабатывать ссылки. Однако мне не совсем ясно как ссылку с него передать в вид и как  фаил route,php получить сам URL ?

*

Aleks.Denezh

  • Практически профи
  • *******
  • 2785
  • 376
То есть сейчас компонент создает запись в БД с нужными для меня полями. Я хочу сделать поддержку мультиязычности компонента как это реализованно в компоненте создания материалов Joomla и поддержку ЧПУ для ссылок на страницы моего компонента (в БД есть запись алиаса ссылки вывожу через JRoute::_(""); )
Мультиязычность как в com_content? да нет ничего проще!
1. Добавляете поле langiage для таблицы вашей
2. В админке делаете запись мультиязычности в это поле!
3. в модели пользовательской добавляете к запросу:
Код: php
if ( JLanguageMultilang::isEnabled() ) {
$query->where( 'language in (' . $this->getDbo()->quote( JFactory::getLanguage()->getTag() ). ',' . $this->getDbo()->quote( '*' ). ')' );
}

По ЧПУ уж сколько тут тем было.. читать не перечитать!
Можете немного у меня почитать http://inet-reklama.com/blog/joomla/routing-v-joomla-jroute.html
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

voron121

  • Давно я тут
  • ****
  • 222
  • 1
  • Метод тыка и мата помогает в кодинге
По ЧПУ уж сколько тут тем было.. читать не перечитать!
Можете немного у меня почитать http://inet-reklama.com/blog/joomla/routing-v-joomla-jroute.html

ознакомился с вашей статьей - все понятно и ничего не понятно )) Я дохожу до формирования файла роута и потом у меня ступор т.к более мение вменяемой инфы или не нахожу или  где то жутко как туплю. Вот смотрите у меня сейчас router.php выглядит вот так:

Код: php
<?php
defined('_JEXEC') or exit;
 
function TourBuildRoute( &$query ){
    $segments = array();
if ( isset( $query['view'] ) ) {
        $segments[] = $query['view'];
unset( $query['view'] );
    }
return $segments;
}


function TourParseRoute( $segments ) {
    $vars = array();
    $count = count( $segments );
    if ( $count ) {
        $count--;
        $segment = array_shift( $segments );
        $vars['view'] = $segment;
    }
    if ( $count ) {
        $count--;
        $segment = array_shift( $segments );
        $vars['id'] = $segment;
    }
    return $vars;
}


?>

В свое же время макет вывода виглядит вот так:

Код: php

<?php defined('_JEXEC') or exit;
//макет вывода туров в списке
?>

<?php if (!empty($this->items)) : ?>

<?php foreach($this->items as $item):?>
<div>
<h2>
<a href="<?=JRoute::_('index.php?option=com_tour&view=item&id='.$item->id);?>"><?=$item->title;?></a>
</h2>
<div>
<?=$item->publish;?>
</div>
<div>
<?php if(!empty($item->images->image)):?>
<img src="<?=$item->images->image;?>" alt="<?=$item->title;?>">
<?php endif;?>
</div>
<div>
<?=$item->text;?>
</div>
</div>
<?php endforeach;?>

<div class="pagination text-center">
<p class="counter text-center">
<?=$this->pagination->getPagesCounter();?>
</p>
<?=$this->pagination->getPageslinks();?>
</div>

<?php endif;?>


Пробую в нем сделать print_r(); для переменной $vars которую в роутере формирует функция парсера - пишет что такая переменная не объявлена - ну это и логично  -  я ее нигде не объявлял. Но тогда в какой переменной хранится массив с инфой о правильном урле, и которая передается в макет ?

*

Aleks.Denezh

  • Практически профи
  • *******
  • 2785
  • 376
1. JRoute::_('index.php?option=com_tour&view=item&id='.$item->id); вот это обрабатывает buildRoute (тоесть построит ссылку типа /view/item/10
2. site.ru/view/item/10 вот это обработает ParseRoute (то есть ссылку которая в браузере переведет из view/item/10 в view=item и id=10

А дальше нужно знать какую ссылку вы хотите получить что бы понять как и что делать!
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

voron121

  • Давно я тут
  • ****
  • 222
  • 1
  • Метод тыка и мата помогает в кодинге
спасибо - сработало ! ) Правда почему то пример с вашего сайта сработал не сразу  - нашел с доков тот же практически пример однако он работает. Думаю мог быть баг при копировании кода с сайта, ну да это уже мелочи. Однозначно + :)