Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Получение данных из адресной строки

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Specter
Отправлено: 09 Августа, 2014 - 12:37:25
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




Добрый день.
есть правила формирование урлов:
(:id)-(:slug) или например (:slug)-(:id), или просто (:slug) или просто (:id)
т.е. урлы будут такими
1-news-rusiia
или
news-russia-1
или
news-rusiia
или
1
Проблема заключается в том, как вытянуть (:slug) и (:id).
Делаю так
PHP:
скопировать код в буфер обмена
  1.  
  2. $uri = 'тут значение адресной строки';
  3. $pattern = $this->routes_rules['category']; // получаем шаблон для формирования ссылки
  4. $pattern = str_replace(':id', '[0-9]+', str_replace(':slug', '[a-zA-Z0-9_-]+', $pattern)); // делаем регулярку
  5.  preg_match ('#^'.$pattern.'$#', $uri, $matches);
  6. // в $matches теперь массив
  7.  

Тут я в тупике, подскажите более рациональное решение, чем плодить кучу условий по проверке.
Исходя из шаблона формирования урлов в $matches[1] или $matches[2] будут всегда разные данные. Поэтому я не могу точно сказать что находится в массиве.
Таким образом сложно получить на выходе :
$id, $slug
Подскажите как решть данную проблему.

(Отредактировано автором: 09 Августа, 2014 - 12:38:16)

 
 Top
Object
Отправлено: 09 Августа, 2014 - 12:59:25
Post Id


Гость


Покинул форум
Сообщений всего: 67
Дата рег-ции: Авг. 2010  


Помог: 3 раз(а)




Specter пишет:
Поэтому я не могу точно сказать что находится в массиве.
Значит это кривая реализация. Чтобы не иметь гемора, нужно четко структурировать Ваши урлы.

Вот основы роутинга в MVC:

(Отредактировано автором: 09 Августа, 2014 - 13:02:11)

 
 Top
Specter
Отправлено: 09 Августа, 2014 - 13:27:36
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




Object пишет:
Specter пишет:
Поэтому я не могу точно сказать что находится в массиве.
Значит это кривая реализация. Чтобы не иметь гемора, нужно четко структурировать Ваши урлы.

Вот основы роутинга в MVC:


Наверное меня неправильно поняли. Допустим в админке я выбрал шаблон формирование урлов (:id)-(:slug), все ссылки поменяли вид на данный шаблон. Но чтобы избежать дублирования страниц мне необходимо проверить значения id и slug на предмет принадлежности к одной и той же записи.
Что вы понимаете под "четко структурировать Ваши урлы."?
Я хочу иметь возможность менять урлы, но с привязкой к конкретному контролеру/методу.

(Отредактировано автором: 09 Августа, 2014 - 13:33:06)

 
 Top
Object
Отправлено: 09 Августа, 2014 - 14:22:28
Post Id


Гость


Покинул форум
Сообщений всего: 67
Дата рег-ции: Авг. 2010  


Помог: 3 раз(а)




Ну тогда нужно в каких-то конфигах описывать в каком шаблоне, что за чем следует. У Вас же не будет несколько шаблонов работать одновременно. Например в одном шаблоне первым идет контроллер, потом метод, потом параметры, а в другом наоборот, сначала метод потом контроллер. Хотя везде сначала идет контроллер потом метод. Как может быть метод без контроллера?
 
 Top
Specter
Отправлено: 09 Августа, 2014 - 14:39:56
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




Object пишет:
Ну тогда нужно в каких-то конфигах описывать в каком шаблоне, что за чем следует. У Вас же не будет несколько шаблонов работать одновременно. Например в одном шаблоне первым идет контроллер, потом метод, потом параметры, а в другом наоборот, сначала метод потом контроллер. Хотя везде сначала идет контроллер потом метод. Как может быть метод без контроллера?

Правила динамически цепляются при инициализации. С этим проблем нет. Все структурировано.
Мне нужно получить значения id и slug, исходя из правил роутинга, чтобы получить данные из бд.
Грубо говоря мне нужно получить значения id и slug.
Есть какое либо правило в переменной.
Правило мб: (:id)-(:slug), или (:slug)-(:id), или (:slug), или (:id)
Мы знаем это правило.
Есть значение урла, сформированного исходя из этого правила.
Например правило (:id)-(:slug) -> урл: 22-news-nokia
В переменную $id нужно получить 22, а в $slug = news-nokia
Другой вариант, правило (:slug) -> урл:news-nokia
В $id = null; $slug = news-nokia

(Отредактировано автором: 09 Августа, 2014 - 14:48:12)

 
 Top
Object
Отправлено: 09 Августа, 2014 - 22:36:18
Post Id


Гость


Покинул форум
Сообщений всего: 67
Дата рег-ции: Авг. 2010  


Помог: 3 раз(а)




А зачем вообще это нужно, менять параметры местами?
 
 Top
DelphinPRO
Отправлено: 09 Августа, 2014 - 22:47:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Если у вас готовая система, то в ней должны быть штатные методы для получения этих данных.

Ну и если хочется руками, то для правила (:id)-(:slug)



как-то так. Возможно регулярка неточная, но смысл должен быть понятен


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Specter
Отправлено: 10 Августа, 2014 - 15:52:41
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




DelphinPRO пишет:
Если у вас готовая система, то в ней должны быть штатные методы для получения этих данных.

Ну и если хочется руками, то для правила (:id)-(:slug)



как-то так. Возможно регулярка неточная, но смысл должен быть понятен

А если захочется (:slug)-(:id) ?
Я получаю все данные исходя из руглярки
PHP:
скопировать код в буфер обмена
  1. $pattern = str_replace(':id', '[0-9]+', str_replace(':slug', '[a-zA-Z0-9_-]+', $pattern));     
  2. preg_match ('#^'.$pattern.'$#', $uri, $matches);
  3.  

но в matches я не могу четко определить, есть ли id, есть ли slug и т.п.
 
 Top
DelphinPRO
Отправлено: 10 Августа, 2014 - 17:27:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Извиняюсь, невнимательно прочел. Вы и так регами парсите.
Но всё же - что насчет штатных средств системы?
(Добавление)
В регулярках можно использовать квантификаторы (или как они там называются) типа "либо есть, либо нет" для подмаски. Плюс есть возможность использовать именованные подмаски.
Попозже, если не забуду, накидаю примерчик.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Specter
Отправлено: 10 Августа, 2014 - 17:32:53
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




DelphinPRO пишет:
Извиняюсь, невнимательно прочел. Вы и так регами парсите.
Но всё же - что насчет штатных средств системы?

Я использую Codeigniter.
Штатный роутинг имеет вид /controller/method/var/var и т.д.
Реализация роутинга идет чере /controller/method/.
Данная реализация меня не устраивает.
Пока остановился на таком костыле
PHP:
скопировать код в буфер обмена
  1.  
  2.                 $uri = $this->uri->uri_string();
  3.                
  4.                 $pattern = $this->routes_rules['category'];
  5.                 $pattern = str_replace(':id', '[0-9]+', str_replace(':slug', '[a-zA-Z0-9_-]+', $pattern));     
  6.                
  7.                 preg_match ('#^'.$pattern.'$#', $uri, $matches);
  8.  
  9.  
  10.                 if(count($matches) > 2){
  11.                         if(is_numeric($matches[1])){
  12.                                 $id = $matches[1];
  13.                                 $slug = $matches[2];
  14.                         }else{
  15.                                 $id = $matches[2];
  16.                                 $slug = $matches[1];
  17.                         }
  18.                 }else{
  19.                         if(is_numeric($matches[1])){
  20.                                 $id = $matches[1];
  21.                                 $slug = null;
  22.                         }else{
  23.                                 $id = null;
  24.                                 $slug = $matches[1];
  25.                         }
  26.                 }
  27.  

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

(Отредактировано автором: 10 Августа, 2014 - 17:33:56)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB