Форум русской поддержки Joomla!® CMS
07.12.2016, 12:36:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1] 2  Все   Вниз
  Добавить закладку  |  Печать  
Автор

Формирование ЧПУ для своего компонента

 (Прочитано 769 раз)
0 Пользователей и 1 Гость смотрят эту тему.
john.deff
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 112



« : 20.05.2016, 21:10:51 »

Приветстввую!
не могу самостоятельно разобраться как формируются ЧПУ на стороне пользовательской части.
компонент у меня простой, имеется страница с выводом альбомов
Код:
www.site.ru/index.php?option=com_gallery&view=albom_list&Itemid=133 // если включить режим ЧПУ, отображается ссылка вида:
www.site.ru/galereya.html
Есть и вторая страница, страница когда мы заходим в альбом
Код:
www.site.ru/index.php?option=com_gallery&view=albom_view&id=3&Itemid=133 // Промпотр альбома
// надо сделать вид отображения типа:
www.site.ru/galereya/ИМЯ-АЛЬБОМА.html
Прошу помощи господа!
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #1 : 20.05.2016, 21:21:46 »

в роутере что?
Записан
john.deff
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 112



« Ответ #2 : 20.05.2016, 21:42:23 »

в роутере что?

Код:
<? defined( '_JEXEC' ) or die;

function GalleryBuildRoute( &$query )
{
$segments = array();
if ( isset( $query['view'] ) ) {
$segments[] = $query['view'];
unset( $query['view'] );
}
if ( isset( $query['task'] ) ) {
$segments[] = $query['task'];
unset( $query['task'] );
}
if ( isset( $query['id'] ) ) {
$segments[] = $query['id'];
unset( $query['id'] );
}
if ( isset( $query['limitstart'] ) ) {
unset( $query['limitstart'] );
}
return $segments;
}

function GalleryParseRoute( $segments )
{
$vars = array();
$count = count( $segments );
$menu = JMenu::getInstance( 'site' )->getActive();
$view = isset( $menu->query['view'] )? $menu->query['view'] : '';


/**
* Примеры роутинга с удаленным $segments[] = $query['view']; в  BuildRoute
* Пример 1 - запуска задачи activate в контроллере по умолчанию, вид ссылки site.ru/menu-name/activate
if ( isset( $segments[0] ) && $segments[0] === 'activate' ) {
$vars['task'] = 'activate';
return $vars;
}
* Пример 2 - запуска задачи getFile в контроллере по умолчанию и передача id, вид ссылки site.ru/menu-name/getFile/1
if ( isset( $segments[0] ) && $segments[0] === 'getFile' ) {
$vars['task'] = 'getFile';
$vars['id'] = $segments[1];
return $vars;
}
* Пример 3 - если текущий пункт меню связан с видом  category и количество сегментов строки = 1 то выводим вид article
* в поле id будет id записи
* Например ссылка site.ru/menu-name/ откроет вид category (при условии что menu-name это пункт меню связанный с видом category)
* site.ru/menu-name/1-page-alias.html - откроет вид article в который будет передано в качестве id строка 1-page-alias
if ( $view === 'category' && $count == 1 ) {
$vars['view'] = 'article';
$vars['id'] = $segments[0];
return $vars;
}*/

if ( $count == 1 ) {
$vars['view'] = $segments[0];
}
if ( $count == 2 ) {
$vars['view'] = $segments[0];
if ( strpos( $segments[1], ':' )!== false || is_numeric( $segments[1] ) ) {
$vars['id'] = $segments[1];
} else {
$vars['task'] = $segments[1];
}
}
if ( $count == 3 ) {
$vars['view'] = $segments[0];
$vars['task'] = $segments[1];
$vars['id'] = $segments[2];
}
return $vars;
}

Читал и Вашу статью
http://inet-reklama.com/blog/joomla/routing-v-joomla-jroute.html

мо настолько всё мудрёно, что применить к своему компоненту решение не могу!
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #3 : 21.05.2016, 00:19:18 »

Там же все в роутере даже расписано как делать )

Код
function GalleryBuildRoute( &$query )
{
$segments = array();
if ( isset( $query['view'] ) ) {
unset( $query['view'] );
}
if ( isset( $query['task'] ) ) {
$segments[] = $query['task'];
unset( $query['task'] );
}
if ( isset( $query['id'] ) ) {
$segments[] = $query['id'];
unset( $query['id'] );
}
if ( isset( $query['limitstart'] ) ) {
unset( $query['limitstart'] );
}
return $segments;
}
function GalleryParseRoute( $segments )
{
$vars = array();
$count = count( $segments );
$menu = JMenu::getInstance( 'site' )->getActive();
$view = isset( $menu->query['view'] )? $menu->query['view'] : '';
if ( $view === 'albom_list' && $count == 1 ) {
$vars['view'] = 'albom_view';
$vars['id'] = $segments[0];
return $vars;
}
}

ссылку на альбом формировать так: index.php?id=3&Itemid=133
Записан
john.deff
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 112



« Ответ #4 : 21.05.2016, 00:54:14 »

Там же все в роутере даже расписано как делать )

Код
function GalleryBuildRoute( &$query )
{
$segments = array();
if ( isset( $query['view'] ) ) {
unset( $query['view'] );
}
if ( isset( $query['task'] ) ) {
$segments[] = $query['task'];
unset( $query['task'] );
}
if ( isset( $query['id'] ) ) {
$segments[] = $query['id'];
unset( $query['id'] );
}
if ( isset( $query['limitstart'] ) ) {
unset( $query['limitstart'] );
}
return $segments;
}
function GalleryParseRoute( $segments )
{
$vars = array();
$count = count( $segments );
$menu = JMenu::getInstance( 'site' )->getActive();
$view = isset( $menu->query['view'] )? $menu->query['view'] : '';
if ( $view === 'albom_list' && $count == 1 ) {
$vars['view'] = 'albom_view';
$vars['id'] = $segments[0];
return $vars;
}
}

ссылку на альбом формировать так: index.php?id=3&Itemid=133

Вот это вообще не понял: ссылку на альбом формировать так: index.php?id=3&Itemid=133

данный код формирует такого вида ссылки:
Код:
www.site.ru/galereya/4.html
а надо: www.site.ru/galereya/ИМЯ-АЛЬБОМА.html
не могу понять где подтянуть имя "алиас" альбома? точнее куда его вставить
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Online Online

Сообщений: 7768



« Ответ #5 : 21.05.2016, 01:36:28 »

В $segments. вместо
Код:
$segments[] = $query['id'];
вставляйте алиас альбома, предварительно получив его по id. А в ParseRoute соответственно наоборот, по алиасу получайте id
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #6 : 21.05.2016, 02:12:09 »

я всего лишь взял кусок вашего роутера где у вас: www.site.ru/index.php?option=com_gallery&view=albom_view&id=3&Itemid=133
Хотите передавать не ID, а имя альбома, так передавайте его
например: echo JRoute::_('index.php?id='.$item->alias.'&Itemid=133');
Только в модели уже вам придется искать запись не по ID, а по alias!
роутер остается тот же что я писал выше!
Записан
john.deff
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 112



« Ответ #7 : 21.05.2016, 11:30:14 »

я всего лишь взял кусок вашего роутера где у вас: www.site.ru/index.php?option=com_gallery&view=albom_view&id=3&Itemid=133
Хотите передавать не ID, а имя альбома, так передавайте его
например: echo JRoute::_('index.php?id='.$item->alias.'&Itemid=133');
Только в модели уже вам придется искать запись не по ID, а по alias!
роутер остается тот же что я писал выше!

А если сделать запрос к БД в файле router.php? хотя это глупо!
сделал в echo
Код:
JRoute::_('index.php?alias='.$item->alias.'&id='.$item->id.'&Itemid=133');
в файле route.php добавил
Код:
if( isset($query['alias']) ){      
     unset($query['alias']);
}
чтоб в УРЛ не вставлялся, вопрос как подменить id на alias, вот не могу понять принцип работы роутера
« Последнее редактирование: 21.05.2016, 11:48:22 от john.deff » Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Online Online

Сообщений: 7768



« Ответ #8 : 21.05.2016, 11:59:52 »

так делайте, почему нет? чем глупо? создайте статическую переменную, загрузите в нее 1 раз массив id=>alias, и берите каждый раз алиас по ид.

если алиас не будет меняться после создания, то лучше сделать как написал Istaan, сразу передавать алиас. уйдете от лишнего запроса. если же будет, то в таком случае придется передавать ид, чтобы при смене алиаса не приходилось пересохранять пункты меню.

если будете передавать id, то сделав ссылку не /galereya/ИМЯ-АЛЬБОМА.html, а /galereya/ИМЯ-АЛЬБОМА-ID.html, уйдете еще от одного запроса определения ID при парсинге ссылки. но тогда учитывайте возможные дубли, проверяйте после load($id) соответствие ИМЯ-АЛЬБОМА алиасу, и в случае несовпадения отдавайте 404.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #9 : 21.05.2016, 12:19:56 »

А если сделать запрос к БД в файле router.php? хотя это глупо!
А зачем делать в роутере запрос к БД что бы получить ID который потом передать роутером в модель, если можно сразу сделать в модели запрос по alias!

чтоб в УРЛ не вставлялся, вопрос как подменить id на alias, вот не могу понять принцип работы роутера
я же вам уже конкретно выше написал код  как правильно делать!
Вы же зачем то написали это: JRoute::_('index.php?alias='.$item->alias.'&id='.$item->id.'&Itemid=133');
Ещё раз!
Формирование ссылки:  JRoute::_('index.php?id='.$item->alias .'&Itemid=133'); Все больше ничего не надо!
В модели:
Код
public function getItem(  )
{
$input = JFactory::getApplication()->input;
$alias = str_replace( ':', '-', $input->getString( 'id' ) );
$db = JFactory::getDbo();
$query = $db->getQuery( true )
->select( '*' )
->from( '#__table' )
->where( 'alias=' . $db->q( $alias ) );
$item = $db->setQuery( $query )->loadObject();
return $item;
}
Все!

Вы почему то зациклились на переменной ID забудьте про неё, это не системная переменная, в ней не обязательно передавать только ID, можете что угодно в ней передавать!
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #10 : 21.05.2016, 12:29:02 »

если алиас не будет меняться после создания, то лучше сделать как написал Istaan, сразу передавать алиас. уйдете от лишнего запроса. если же будет, то в таком случае придется передавать ид, чтобы при смене алиаса не приходилось пересохранять пункты меню.
Вы хотя бы тему прочли внимательно? Вы сейчас запутаете человека! Какие  алисы и смены алиасов?
Есть категория на которую завязан пункт меню, в ней есть записи, они с меню не связаны!
Из категории нужно перейти в записи! Все!

если будете передавать id, то сделав ссылку не /galereya/ИМЯ-АЛЬБОМА.html, а /galereya/ИМЯ-АЛЬБОМА-ID.html, уйдете еще от одного запроса определения ID при парсинге ссылки. но тогда учитывайте возможные дубли, проверяйте после load($id) соответствие ИМЯ-АЛЬБОМА алиасу, и в случае несовпадения отдавайте 404.
Зачем определять ещё вторым запросом ID? почему не сделать запрос по alias, как в примере что я написал выше?!

Единственное что  john.deff вам придется следить за alias ибо если будут одинаковые название то попадать юзер будет только в одну галерею.. скорее всего ввести надо будет в админке при сохранении функционал для на проверку или такой alias уже есть в таблице! либо передавать JRoute::_('index.php?id='$item->id.':'.$item->alias .'&Itemid=133');
« Последнее редактирование: 21.05.2016, 12:32:45 от Istaan » Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Online Online

Сообщений: 7768



« Ответ #11 : 21.05.2016, 12:48:38 »

Вы хотя бы тему прочли внимательно?
вроде бы прочел. еще раз прочел Azn нигде не сказано, связаны они с меню или нет. а если даже сейчас не связаны, то в будущем это исключено? если да - то вопросов нет, передавайте алиас. а если предполагается меню, то имхо неправильно передавать алиас.

Зачем определять ещё вторым запросом ID? почему не сделать запрос по alias, как в примере что я написал выше?!
да пожалуйста, делайте. только ведь это будет лишний запрос при парсинге ссылки. почему бы ссылку сразу не сформировать с ид?
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Online Online

Сообщений: 7768



« Ответ #12 : 21.05.2016, 12:53:17 »

А зачем делать в роутере запрос к БД что бы получить ID который потом передать роутером в модель, если можно сразу сделать в модели запрос по alias!
тут согласен. поскольку в модели все равно будет запрос на выборку, то правильнее выбрать в модели, а в роутер просто передать его.
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Online Online

Сообщений: 7768



« Ответ #13 : 21.05.2016, 13:03:17 »

Зачем определять ещё вторым запросом ID? почему не сделать запрос по alias, как в примере что я написал выше?!
перечитал еще раз. понял о чем вы. не о том подумал изначально, не о той выборке. после того как прочел о уникальности алиаса, понял что имеется в виду. да, вы правы, нет смысла в id. все так и есть, сразу выбирать по алиасу, при условии уникальности алиаса.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #14 : 21.05.2016, 13:42:28 »

вроде бы прочел. еще раз прочел Azn нигде не сказано, связаны они с меню или нет. а если даже сейчас не связаны, то в будущем это исключено?
Ссылка на список: www.site.ru/index.php?option=com_gallery&view=albom_list&Itemid=133
ссылка на альбом: www.site.ru/index.php?option=com_gallery&view=albom_view&id=3&Itemid=133
Дальше думаю объяснять не нужно )
Тем не менее если не исключено нужно использовать другие механизмы, определение или запись с этим id не в пункте меню, и тогда ссылка становится просто index.php?Itemid=ид_пункта_меню, иначе ссылка с алиасом!
Записан
john.deff
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 112



« Ответ #15 : 21.05.2016, 16:21:41 »

А зачем делать в роутере запрос к БД что бы получить ID который потом передать роутером в модель, если можно сразу сделать в модели запрос по alias!
я же вам уже конкретно выше написал код  как правильно делать!
Вы же зачем то написали это: JRoute::_('index.php?alias='.$item->alias.'&id='.$item->id.'&Itemid=133');
Ещё раз!
Формирование ссылки:  JRoute::_('index.php?id='.$item->alias .'&Itemid=133'); Все больше ничего не надо!
В модели:
Код
public function getItem(  )
{
$input = JFactory::getApplication()->input;
$alias = str_replace( ':', '-', $input->getString( 'id' ) );
$db = JFactory::getDbo();
$query = $db->getQuery( true )
->select( '*' )
->from( '#__table' )
->where( 'alias=' . $db->q( $alias ) );
$item = $db->setQuery( $query )->loadObject();
return $item;
}
Все!

Вы почему то зациклились на переменной ID забудьте про неё, это не системная переменная, в ней не обязательно передавать только ID, можете что угодно в ней передавать!

Я сделал как вы указали изначально, но у меня выборка в модели идет по ID, следовательно подставляя alias вместо ID выдаётся ошибка вывода данных.
Сижу вот думаю, если я буду делать выборку из БД по алиасу, как это отразится в будущем на выводе.. это не есть хорошо!

Что если выборку делать по ID в модели, а сам алиас отдавать в УРЛ, и уже на уровне РОУТЕРА как-то всё это дело обрабатывать?
в роутер передавать что-то типа слуга ID:ALIAS, ведь значения ID и ALIASa у нас есть при первоначальном запросе, так почему бы их не использовать на уровне РОУТЕРА!

перечитал статью http://inet-reklama.com/blog/joomla/routing-v-joomla-jroute.html ещё раз, там нет описания того как использовать ALIAS "категории/новости/статьи.html" и т.д.
« Последнее редактирование: 21.05.2016, 16:30:39 от john.deff » Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #16 : 21.05.2016, 18:32:24 »

Я сделал как вы указали изначально, но у меня выборка в модели идет по ID, следовательно подставляя alias вместо ID выдаётся ошибка вывода данных.
Да вот сдался вам этот id! Я же вам даже код привел как метод getItem() в модели переделать что бы он получал запись по alias, а не по id!

Сижу вот думаю, если я буду делать выборку из БД по алиасу, как это отразится в будущем на выводе.. это не есть хорошо!
Да никак это не отразится на вводе, базе данных глубоко наплевать по какому полю вы делаете выборку! Тем более базе данных глубоко пофиг на вывод, она в ней не участвует!
Есть таблица:
id| alias| title
--------------
1 | test | lalal
---------------
Сделав запрос SELECT * FROM table WHERE id=1 или сделав запрос в базу SELECT * FROM table WHERE alias='test' вы получите одну и туже запись!

Что если выборку делать по ID в модели, а сам алиас отдавать в УРЛ, и уже на уровне РОУТЕРА как-то всё это дело обрабатывать?
А ещё можно масло мазать на масло, для большей маслянистости!
Вы понимаете что вы вместо одного запроса будете делать два ОДИНАКОВЫХ, первым запросом вы выберите запись SELECT id FROM table WHERE alias='test' что бы получить ID, передать его в модель в которпой выполнить SELECT * FROM table WHERE id=1, это же бред!

в роутер передавать что-то типа слуга ID:ALIAS, ведь значения ID и ALIASa у нас есть при первоначальном запросе, так почему бы их не использовать на уровне РОУТЕРА!
Вообще роутер ничего не знает ни про ID, ни про алиас, ни про слуг, ни про что! Он только переделывает 1:lalala в 1-lalal, а что вы ему передадите ему все равно!
echo  JRoute::_('index.php?id=lala:lala'); выдаст ни что иное как site.ru/lala-lala.html

перечитал статью http://inet-reklama.com/blog/joomla/routing-v-joomla-jroute.html ещё раз, там нет описания того как использовать ALIAS "категории/новости/статьи.html" и т.д.
Там много чего нет, там написаны основы, и статье уже четыре года почти, за это время мой стиль кода в Joomla 5 раз изменился!
Записан
john.deff
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 112



« Ответ #17 : 22.05.2016, 15:20:40 »

Да вот сдался вам этот id! Я же вам даже код привел как метод getItem() в модели переделать что бы он получал запись по alias, а не по id!
Да никак это не отразится на вводе, базе данных глубоко наплевать по какому полю вы делаете выборку! Тем более базе данных глубоко пофиг на вывод, она в ней не участвует!
Есть таблица:
id| alias| title
--------------
1 | test | lalal
---------------
Сделав запрос SELECT * FROM table WHERE id=1 или сделав запрос в базу SELECT * FROM table WHERE alias='test' вы получите одну и туже запись!
А ещё можно масло мазать на масло, для большей маслянистости!
Вы понимаете что вы вместо одного запроса будете делать два ОДИНАКОВЫХ, первым запросом вы выберите запись SELECT id FROM table WHERE alias='test' что бы получить ID, передать его в модель в которпой выполнить SELECT * FROM table WHERE id=1, это же бред!
Вообще роутер ничего не знает ни про ID, ни про алиас, ни про слуг, ни про что! Он только переделывает 1:lalala в 1-lalal, а что вы ему передадите ему все равно!
echo  JRoute::_('index.php?id=lala:lala'); выдаст ни что иное как site.ru/lala-lala.html
Там много чего нет, там написаны основы, и статье уже четыре года почти, за это время мой стиль кода в Joomla 5 раз изменился!

смотрите, у меня есть категория/альбом в БД у него есть уникальный ID и ALIAS, в этот альбом я добавляю фотографии, соответственно в отдельной таблице я храню уникальный ID фотографии и ID_parent категории/альбома к которому привязана фотография. Вот и получается что, не могу я по алиасу делать выборку, так как выборка фоток происходит по ID альбома, ведь у каждой фотографии есть ID родителя.

Могу конечно при добавлении фотографий в БД сохранять у каждой фото алиас альбома для выборки, но что если надо будет поменять алиас?
это дополнительные методы для изменения всех алиасов у фотографии.
если уж от ID в урл никак не избавиться, то можно сделать /galereya/ИМЯ-АЛЬБОМА-ID.html
« Последнее редактирование: 22.05.2016, 15:24:42 от john.deff » Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #18 : 22.05.2016, 19:10:06 »

смотрите, у меня есть категория/альбом в БД у него есть уникальный ID и ALIAS, в этот альбом я добавляю фотографии, соответственно в отдельной таблице я храню уникальный ID фотографии и ID_parent категории/альбома к которому привязана фотография. Вот и получается что, не могу я по алиасу делать выборку, так как выборка фоток происходит по ID альбома, ведь у каждой фотографии есть ID родителя.

Могу конечно при добавлении фотографий в БД сохранять у каждой фото алиас альбома для выборки, но что если надо будет поменять алиас?
это дополнительные методы для изменения всех алиасов у фотографии.
если уж от ID в URL никак не избавиться, то можно сделать /galereya/ИМЯ-АЛЬБОМА-ID.html
что за чушь!
Вы в любом случае делаете два запроса!
1 запрос: SELECT * FROM album WHERE id=1
2 запрос: SELECT * FROM albium_images WHERE album_id=1
А теперь какая разница вы сделаете так:

Показать текстовый блок

Или так?!
Показать текстовый блок

Вообщем я даже не знаю как дальше аргументировать, либо вам ваши знания мешают понять всю картину, либо вы не хотите читать и воспринимать!
У меня есть куча реализаций подобных компонентов, в которых я по такому способу как вам выше предоставил избавляюсь от чего угодно в ссылке, и присоединяется у меня не одна табличка потом с записями, а десятки!
Делайте как получится..
Записан
john.deff
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 112



« Ответ #19 : 23.05.2016, 12:15:54 »

что за чушь!
Вы в любом случае делаете два запроса!
1 запрос: SELECT * FROM album WHERE id=1
2 запрос: SELECT * FROM albium_images WHERE album_id=1


эм... нет.. я делаю один запрос.
когда я захожу в альбом у меня в URL есть id_albom
одним запросом я делаю выборку из таблицы всех фотографий что есть у данного альбома по id_albom!
а вот по Вашему методу мне надо делать два запроса, что не хотелось бы
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #20 : 23.05.2016, 12:20:51 »

эм... нет.. я делаю один запрос.
когда я захожу в альбом у меня в URL есть id_albom
одним запросом я делаю выборку из таблицы всех фотографий что есть у данного альбома по id_albom!
а вот по Вашему методу мне надо делать два запроса, что не хотелось бы
И каким макаром вы делаете один запрос на список фото, для одиночной записи?
А тайтл альбома, а если описание понадобится то вы как выводите и откуда? или тупо фотки без оглавления страницы и все?
А если такого альбома нет, или снят с публикации как определите и отдадите 404 ошибку?!
« Последнее редактирование: 23.05.2016, 12:26:50 от Istaan » Записан
john.deff
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 112



« Ответ #21 : 23.05.2016, 12:28:49 »

И каким макаром вы делаете один запрос на список фото, для одиночной записи?
А тайтл альбома, а если описание понадобится то вы как выводите и откуда? или тупо фотки без оглавления страницы и все?

в БД у меня 2 таблицы:
- gallery_albom - id | name | desc | alias
- gallery_photo - id | id_albom

Первая страница вывод альбомов:
Код:
$query->select('*')->from('gallery_albom')->where('state=1');
здесь формирум URL в котором у нас есть ID альбома

Вторая страница, вывод фотографий. Отлавливаем из URL id альбома и делаем по нему выборку. Здесь фото отображаются списком, просмотр реализован лайтбоксом:
Код:
$q->select('id, id_albom, type')->from('gallery_photos')->where('id_albom=1');

По поводу тайтла альбома - Вы Правы!
но тогда лучше объединить запросы из двух таблиц в один, надо подумать только как
« Последнее редактирование: 23.05.2016, 12:37:54 от john.deff » Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #22 : 23.05.2016, 12:37:40 »

ну вот название альбома на странице списка фото вы как выводите? Описание альбома то что в desc как выводите? А метаданные для альбома?!
А если альбом снят с публикации? Все равно же выведется страница с фото, а если удален? ошибки никакой не будет, как и не будет ошибки если id альбома не существует!
Про дубли я уже молчу..
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Online Online

Сообщений: 7768



« Ответ #23 : 23.05.2016, 12:42:48 »

Istaan опередил Azn

ТС, вы же все равно на этой второй странице наверняка делаете запрос к gallery_albom? типа
Код:
$query->select('*')->from('gallery_albom')->where('id=1');
Делаете?
Записан
john.deff
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 112



« Ответ #24 : 23.05.2016, 12:45:58 »

Istaan опередил Azn

ТС, вы же все равно на этой второй странице наверняка делаете запрос к gallery_albom? типа
Код:
$query->select('*')->from('gallery_albom')->where('id=1');
Делаете?

да, я выше написал
Код:
$q->select('id, id_albom, type')->from('gallery_photos')->where('id_albom=1');

Istaan прав, я не догнал с первого раза..
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Online Online

Сообщений: 7768



« Ответ #25 : 23.05.2016, 17:34:55 »

Вы выше написали не то. Вы пишите о 'gallery_photos', а я о 'gallery_albom'. Но на странице gallery_photos. Делаете такой запрос? Если да, то какая разница по чем его делать - по id или по алиасу? Делайте по алиасу, и ид после запроса уже будет у вас. А gallery_photos отбирайте уже по ид, как и сейчас
Записан
john.deff
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 112



« Ответ #26 : 23.05.2016, 19:22:42 »

Вы выше написали не то. Вы пишите о 'gallery_photos', а я о 'gallery_albom'. Но на странице gallery_photos. Делаете такой запрос? Если да, то какая разница по чем его делать - по id или по алиасу? Делайте по алиасу, и ид после запроса уже будет у вас. А gallery_photos отбирайте уже по ид, как и сейчас

вопрос решен!
по алиасу выборку из БД не делаю, просто URL формирую такой на конкретный альбом на странице списка альбомов:
Код:
index.php?option=com_gallery&view=albom_view&id='.$item->id.":".$item->alias
а роутер от Istaan уже делает такую ссылку: site.ru/gallery/ID-имяальбома.html
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Online Online

Сообщений: 7768



« Ответ #27 : 23.05.2016, 19:52:19 »

понятно Azn
Записан
john.deff
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 112



« Ответ #28 : 25.05.2016, 09:16:26 »

Однако! в продолжение темы!
вот есть 2 таких URL
Код:
site.ru/index.php?view=object_list&id_category=kakaya-to-kategoryya
site.ru/index.php?view=object_view&id_category=kakaya-to-kategoryya&id=21:imya-obyekta
надо чтоб ссылка была в таком виде:
site.ru/mycomp/kakaya-to-kategoryya.html
site.ru/mycomp/kakaya-to-kategoryya/21-imya-obyekta.html

Роутер не работает:
Код:
function MycompBuildRoute( &$query )
{
    $segments = array();
    if( isset($query['view']) ){       unset($query['view']); }
    if( isset($query['task']) ){       $segments[] = $query['task'];        unset($query['task']); }
    //if( isset($query['id_category']) ){$segments[] = $query['id_category']; unset($query['id_category']); }
    if( isset($query['id']) ){         $segments[] = $query['id'];          unset($query['id']); }
    if( isset($query['limitstart']) ){ unset($query['limitstart']); }

    //echo "<pre>"; print_r($segments); echo "</pre>";
    return $segments;

}
function MycompParseRoute( $segments )
{
    $vars  = array();
    $count = count($segments);
    $menu  = JMenu::getInstance('site')->getActive();
    $view  = isset($menu->query['view'])? $menu->query['view'] : '';

    if( $view === 'object_list' && $count == 1 ){
        $vars['view'] = 'object_view';
        //$vars['id_category'] = $segments[0];
        $vars['id'] = $segments[0];
        return $vars;
        //echo "<pre>"; print_r($vars); echo "</pre>";
    }

}

и даже отследить ошибки-то невозможно  Sad
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Online Online

Сообщений: 7768



« Ответ #29 : 25.05.2016, 10:12:11 »

что подразумевается под "Роутер не работает"? фатальная ошибка? или не получает управление?
Записан
Страниц: [1] 2  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet