И снова про ЧПУ

_et

Новичок
Неа.

не получается подцепить нужную новость.

Помогите пожалуйста.
Как в кейсе item построить запрос, что бы все работало?
в БД есть поля: id, url, title...
в поле url лежит текст в виде nazvanie-novosti
 

Alien85

I like my cat
Мое мнение, постраничную навигацию делать так: /news/?page=2 или /news/?start=30
Так красивее смотрится и не сливается с названием новости: /news/moya-novost.html
Сам на эту тему думал несколько дней. Да и получить ?page=2 куда легче, чем вытягивать из: /news/page2
Самое смешное когда вы сделаете рубрику новостей, что тогда будет?
/news/auto/page3 - один раздел
/news/page2 - все новости
Смотрится отвратительно и поисковики не поймут.
 

craz

Нестандартное звание
Неа.

не получается подцепить нужную новость.

Помогите пожалуйста.
Как в кейсе item построить запрос, что бы все работало?
в БД есть поля: id, url, title...
в поле url лежит текст в виде nazvanie-novosti
че не получается то? тут уже код смотреть надо, а не просто трендеть))) хотя я могу и просто трендеть) только вам врядли получиться помочь)
 

_et

Новичок
Не получается то, что не могу понять как подцепить нужную новость и как будет на нее выглядеть ссылка

вот кейс полной новости
PHP:
	case 'item':

		$query = mysql_query("SELECT * FROM ".TABLE_NEWS." WHERE ??? ");
		$row = mysql_fetch_array($query);
		
		$navigation->new_item($row['title'], null, null, 'parent');

		$smarty->assign('AUTHOR',	$row['author']);
		$smarty->assign('TITLE',	$row['title']);
		$smarty->assign('DATA',		$row['data']);
		$smarty->assign('ID',		$row['id']);
		$smarty->assign('TEXT',		$row['text']);
		$smarty->assign('URL',		$row['url']);

		$main_content=$smarty->fetch(MODULES.'news/news.tpl');
		break;

полный код страницы news.php дан тут
 

craz

Нестандартное звание
Не получается то, что не могу понять как подцепить нужную новость и как будет на нее выглядеть ссылка

вот кейс полной новости
PHP:
	case 'item':

		$query = mysql_query("SELECT * FROM ".TABLE_NEWS." WHERE ??? ");
		$row = mysql_fetch_array($query);
		
		$navigation->new_item($row['title'], null, null, 'parent');

		$smarty->assign('AUTHOR',	$row['author']);
		$smarty->assign('TITLE',	$row['title']);
		$smarty->assign('DATA',		$row['data']);
		$smarty->assign('ID',		$row['id']);
		$smarty->assign('TEXT',		$row['text']);
		$smarty->assign('URL',		$row['url']);

		$main_content=$smarty->fetch(MODULES.'news/news.tpl');
		break;

полный код страницы news.php дан тут
tpl дай посмотреть

PHP:
$query = mysql_query("SELECT * FROM ".TABLE_NEWS." WHERE ??? ");
WHERE id = "$url->id" - вот как получить $url(id) $url[id] $url->id - вам и надо сделать

если это id

PHP:
$query = mysql_query("SELECT * FROM ".TABLE_NEWS." WHERE ??? ");
WHERE title = "$url->titlenews" вот как получить $url(titlenews) $url[titlenews] $url->titlenews - вам и надо сделать

если это название новости
 

_et

Новичок
Что-то не получается с id = "$url->id"
Вот так выводит, но только первую строку из БД - id = '".$url[2][id]."'
при этом перехожу по ссылке /news/item/любое_id

может я че не так делаю? Вы уж простите меня)

вот news.tpl - правда тут пока все в куче. нет разделения на список и полную...
PHP:
<table border="1" cellpadding="5" cellspacing="1" width="100%">
	<tr>
		<td>{$TITLE}</td>
		<td>{$AUTHOR} | {$DATA}</td>
		<td>{$TEXT}</td>
	</tr>
</table>

<!-- список -->
<table border="1" cellpadding="5" cellspacing="1" width="100%">
{foreach name=aussen item=content_data from=$module_content}
	<tr>
		<td><a href="/news/{$content_data.URL}">{$content_data.TITLE}</a></td>
		<td>{$content_data.AUTHOR} | {$content_data.DATA}</td>
		<td>{$content_data.TEXT}</td>
	</tr>
{/foreach}
</table>
 

craz

Нестандартное звание
это вопрос парсинга url

его можно спарсить в объект: будет $url->id
его можно получить в массиве: $url["id"]
и его в конце концов можно доставать функцие и каждый раз парсить будет что-то типа $request->url($paramName) где $request - это объект класса обрабатывающий ваш запрос.
 

_et

Новичок
Я буду признателен, если поделитесь готовым примером.
Для меня такие очевидные вещи пока не очень очевидны)
 

craz

Нестандартное звание
Я буду признателен, если поделитесь готовым примером.
Для меня такие очевидные вещи пока не очень очевидны)
тут я как бы пас - для вас очевидным кодом я не обладаю так как сам использую сторонний роутинг, если есть желания разбираться "правильный" реквест),
но выше уже Духовность писал(он пишет такие вещи сам), попросите его дать готовую обертку к $_SERVER['REQUEST_URI'];
 

Alien85

I like my cat
Есть еще один вариант распарсить url:
PHP:
// Парсинг
$list = explode('?', $url);
$url = $list[0];
$params = ( isset( $list[1] ) ) ? $list[1] : '';

$getUrl= explode('/', $url);

// Если массив $_GET не существует
$params = explode('&', $params);
$getVar = array();
foreach( $params as $v ) {
    $v = explode('=', $v);
    if ( count( $v ) == 2 ) $getVar[ $v[0] ] = $v[1];
}
// ===========
все это пихаем в отдельный класс URL.
Теперь из $getUrl достаем по одной строчке:
например, есть url: /pages/auto/chevrolet.html
1. Главный модуль на сайте, который запускается первым - получает URL::Get(): 'pages', дальше он запускает модуль pages
2. Модуль pages - получает $section = URL::Get(): 'auto' и $query = URL::Get(): 'chevrolet.html'
3. Если $query == false: $query = $section; $section = false;

вот, как-то так, осталось создать этот метод. Важно сделать метод URL::Get() без параметров!
 

_et

Новичок
Все бы хорошо, только нубам вроде менять не понятно.

Есть index.php
PHP:
$url = preg_replace("/\/+/",'/',$_SERVER['REQUEST_URI']);
$url = preg_replace("/^\/(.*)\/?$/U",'\\1',$url);
$url = preg_replace("/^(.*)\?.*$/U",'\\1',$url);
$url = explode("/", $url);

switch ($url[0])
{
    case 'news':
        include "news.php";
    break;

    default:
        include "index.php";
}
Есть news.php
PHP:
switch ($url[1])
{
    case 'item':

// ЭТО ПОЛНАЯ НОВОСТЬ

        $query = mysql_query("SELECT * FROM ".TABLE_NEWS." WHERE ??? ");
        $row = mysql_fetch_array($query);
        
        $navigation->new_item($row['title'], null, null, 'parent');

        $smarty->assign('AUTHOR',    $row['author']);
        $smarty->assign('TITLE',    $row['title']);
        $smarty->assign('DATA',        $row['data']);
        $smarty->assign('ID',        $row['id']);
        $smarty->assign('TEXT',        $row['text']);
        $smarty->assign('URL',        $row['url']);

        $main_content=$smarty->fetch(MODULES.'news/news.tpl');
        $smarty->assign('main_content',$main_content);
        break;

    default:

// ЭТО СПИСОК НОВОСТЕЙ

        $res = newsAll();
 
        $module_content = array();

        while($row = mysql_fetch_array($res))
        {
            $module_content[] = array
            (
                'AUTHOR'    => $row['author'],
                'TITLE'        => $row['title'],
                'DATA'        => $row['data'],
                'ID'        => $row['id'],
                'TEXT'        => $row['text'],
                'URL'        => $row['url']
            );
        }

// Уберем постраничность, чтобы кода меньше было

        $smarty->assign('module_content',$module_content);
        $main_content=$smarty->fetch(MODULES.'news/news_list.tpl');

        $smarty->assign('main_content',$main_content);
}
Есть .htaccess
PHP:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php [L,QSA]
Что тут можно сделать, чтобы в case 'item': получить значение, которое сунуть в where, чтобы вывести нужную новость?
Может кто приведет готовый вариант? Конечно, если будет время на реализацию!
Просто сам ну никак не могу понять.
 

Alien85

I like my cat
PHP:
$url = preg_replace("/\/+/",'/',$_SERVER['REQUEST_URI']);
$url = preg_replace("/^\/(.*)\/?$/U",'\\1',$url);
$url = preg_replace("/^(.*)\?.*$/U",'\\1',$url);
Для чего это написано?

PHP:
$url = explode("/", getenv('REQUEST_URI'));
этого хватит.

далее в news.php нужно switch заменить на if-else:
PHP:
$urlQuery = ( isset( $url[1] ) ) ? $url[1] : false;
if ( $query == false ) {
    // ЭТО СПИСОК НОВОСТЕЙ
} else {
    $q = sprintf("SELECT * FROM ".TABLE_NEWS." WHERE `url` LIKE '%s' LIMIT 1",
            mysql_real_escape_string( $urlQuery ));
    $query = mysql_query($q);

    $row = mysql_fetch_array($query);
    if ( count( $row ) == 0 ) {
        // Страница не найдена
    } else {
        // ЭТО ПОЛНАЯ НОВОСТЬ
    }
}
 

AmdY

Пью пиво
Команда форума
http://phpfaq.ru/easy/index.php?code простой пример, обрати внимание, что подключается сторонний файл, а не городится всё в одном скрипте, только в случае подключения скрипта readfile нужно заменить на require
 

_et

Новичок
Alien85, огромное спасибо! Работает.
только не if ( $query == false )
а if ( $urlQuery == false )

А если будет тройная вложенность, как тогда сделать?
т.е. если будет news/категория/название

Кстати с $url = explode("/", getenv('REQUEST_URI'));
открывается всегда главная.
 

_et

Новичок
И еще вопрос.
А если три пункта

как тогда условие стоить?

PHP:
if (..)
{
  вывод спсика новостей
}
esleif (...)
{
  вывод полной новости
}
else
{
   и добавление
}
 

Alien85

I like my cat
_et, да действительно, забыл про первое вхождение $url = explode("/", getenv('REQUEST_URI'));
сделай так:
PHP:
$tmp = array();
$url = explode("/", getenv('REQUEST_URI'));
foreach( $url as $v )
    if ( $v != false ) $tmp[] = $v;
$url = $tmp;
Далее, с тройной вложенностью я где-то уже писал, вот код:
PHP:
$urlQuery = ( isset( $url[2] ) ) ? $url[2] : false;
$urlSection = ( isset( $url[1] ) ) ? $url[1] : false;
if ( $urlQuery == false ) {
    $urlQuery = $urlSection;
    $urlSection = false;
}
 

Alien85

I like my cat
Так-то тут вообще дофига кода получается. Ну ладно.
PHP:
$q = sprintf("SELECT * FROM ".TABLE_NEWS." WHERE `url` LIKE '%s' LIMIT 1",
    mysql_real_escape_string( $urlQuery ));
$query = mysql_query($q);
меняем на:
PHP:
$sub = ( $urlSection != false )
    ? sprintf("`section`=%s", mysql_real_escape_string( $urlSection ))
    : '';
$q = sprintf("SELECT * FROM ".TABLE_NEWS." WHERE %s `url` LIKE '%s' LIMIT 1",
    $sub , mysql_real_escape_string( $urlQuery ));
$query = mysql_query($q);
 

Alien85

I like my cat
дальше нужно знать, статьи без подразделов будут или нет?
 
Сверху