Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Помогите реализовать чпу в kohane

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3

Открыть новую тему     Написать ответ в эту тему

newbies



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я хотел вообще убрать /products/
/products/ это когда мы заходим где товар какой ни будь.
так вот оно лишнее, нужно что бы было  /название раздела/название продукта/
если зашли в продукт.
на данный момент для id категории мне чпу сделали, помогли, там вместо id  номера категории, название категории.
 
для товара я сам не смог сделать, глядя на код тот что для категорий, товар то же по id идет.
а хотелось бы что бы  не id был в конце ссылки, а название товара, типа kirpich.
 
Ну и по мимо этого выпрямить ссылки.
 
захожу в каталог, там идут подразделы.
вид ссылки такой; сайт.ru/category/view/kirpich
вот это лишнее, category/view/ в ссылке, убрать бы. сделать ссылку более прямую.
сайт.ru/kirpich
 
а если там зашли в какой ни будь подраздел то так:
сайт.ru/kirpich/beliy/
 
а если в какой ни будь товар то так
сайт.ru/kirpich/beliy/beliyoblichivacnyu
 
вот это чпу будет, то что надо и понятно.

Всего записей: 2112 | Зарегистр. 23-06-2006 | Отправлено: 09:49 09-12-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
newbies

Цитата:
вот это чпу будет, то что надо и понятно.

тогда читайте пару постов ранее и вникайте.
 
в принципе можно отливливать REQUEST_URI в основном контроллере

Код:
Route::set('default', '(<controller>(/<action>(/<id>)))')  
    ->defaults(array(  
        'directory'  => 'index',  
        'controller' => 'main',  
        'action'     => 'index',  
    ));    

 
если нет реального контроллера или действия, то вызывается action_index контроллера main
в нем уже брать REQUEST_URI и проверять, есть ли нужная категория в базе.
а если URI состоит из двух частей (разделенных /), то есть ли категория и товар.
 
все, дальше сами - весь смысл я рассказал.

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 09:58 09-12-2014
newbies



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я смотрю вы не слабо разбираетесь, можете в этом деле помочь, конечно за материальную поддержку.

Всего записей: 2112 | Зарегистр. 23-06-2006 | Отправлено: 15:31 09-12-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
newbies

Цитата:
можете в этом деле помочь, конечно за материальную поддержку

у меня нет финансовых проблем, чтобы тратить время на это...
 
подсказал же уже.

Цитата:
вызывается action_index контроллера main  

в нем берете строку запроса, делите (explode) по /, ну а далее считаете как решите - первый элемент массива это название категории, второй и третий - описание товара.
 
по ним и ищете в базе то, что запросили, ну и выводите соответствующую информацию.

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 23:04 09-12-2014
newbies



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Так я не понимаю, мне бы пример увидеть что и где, я сразу пойму.
 
main который тут ? l/application/classes/controller/index
 
там такое

Код:
 
class Controller_Index_Main extends Controller_Index {
 
    public function action_index()
    {
        $categories = ORM::factory('category')->where('parent_id','=',1)->and_where('show_cat','=',1)->find_all();
                                            
        $content = View::factory('index/main/v_cat')
            ->bind('categories',$categories);
 
        $this->template->content = $content;
    }
}
 

Всего записей: 2112 | Зарегистр. 23-06-2006 | Отправлено: 01:51 10-12-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
newbies

Цитата:
там такое  

нет, я все же почитал.. можно сделать так
http://stackoverflow.com/questions/12580715/load-default-action-and-controller-if-none-were-found
это все проще решается не теоретически, а опытом, но мне не хочется ставить данный фреймворк
 
так что, можно, видимо, разместить

Цитата:
Route::set('default', '<page>', array('page' => '.*'))  
    ->defaults(array(  
            'directory'  => 'index',  
            'controller' => 'page',  
            'action'     => 'getPage',  
    ));

после
Цитата:
Route::set('default', '(<controller>(/<action>(/<id>)))')  
    ->defaults(array(  
        'directory'  => 'index',  
        'controller' => 'main',  
        'action'     => 'index',  
    ));    

и отлавливать все, что не было обработано ранее.
 
сорри за столько вариантов, ну не использую я его. мне symfony и laravel больше нравятся.
 
пробуйте.
в контроллере page, метод action_getPage и в нем (исходя из http://kohanaframework.org/3.0/guide/api/Request )
 
$uri = Request::detect_uri();
 
после чего explode('/', $uri) и анализ элементов массива.

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 02:13 10-12-2014
newbies



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
symfony и laravel - они проще ?   это готовые системы или так же язык программирования и все сам с нуля пишешь и делаешь.
 
на каких языках эти системы ? ну понятно что php
 
Ох тут понаписано, то делать то, __http://kohanaframework.org/3.0/guide/api/Request
 
Вообщем сделал  в page   акшион
 
public function action_getPage()
{
$uri = Request::detect_uri();
        
}
 
я так понимаю что что то еще добавить нужно. пока не разобрался.
 
в боотстрап добавил ниже дефолтного роута  
 

Код:
 
Route::set('default', '<page>', array('page' => '.*'))    
     ->defaults(array(    
             'directory'  => 'index',    
             'controller' => 'page',    
             'action'     => 'getPage',    
     ));
 

 
щас пробовал, ниже нельзя, ошибка, поставил так.
 

Код:
 
 
Route::set('default', '<page>', array('page' => '.*'))    
     ->defaults(array(    
             'directory'  => 'index',    
             'controller' => 'page',    
             'action'     => 'getPage',    
     ));
 
    
Route::set('default', '(<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'index',
        'controller' => 'main',
        'action'     => 'index',
    ));    
 

 
по ссылке нашел ( $uri = Request::detect_uri(); )
там код !  что с ним делать я не понял.  
__http://kohanaframework.org/3.0/guide/api/Request
 
что то тут смотреть нужно, я так понимаю.
 

Код:
 
// Get the path from the base URL, including the index file
        $base_url = parse_url(Kohana::$base_url, PHP_URL_PATH);
 
        if (strpos($uri, $base_url) === 0)
        {
            // Remove the base URL from the URI
            $uri = (string) substr($uri, strlen($base_url));
        }
 
        if (Kohana::$index_file AND strpos($uri, Kohana::$index_file) === 0)
        {
            // Remove the index file from the URI
            $uri = (string) substr($uri, strlen(Kohana::$index_file));
        }
 

 
вот на русском нашел, http://kohana3.ru/request/
 
но пока не понял, что я этим акшионом получу, мне там нужно прописать код, который будет отлавливать  ссылку и переенаправлять, допустим сай.ру/page/contacts  отлавливает и через код перенаправляет и переделывает ссылку в сай.ру/contacts   убирая из ссылки /page/
 
правильно ли я мыслю ?

Всего записей: 2112 | Зарегистр. 23-06-2006 | Отправлено: 02:54 10-12-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
newbies
сказал же - не повторять названия путей.
 

Цитата:
там код !  что с ним делать я не понял.  

я же написал, ну что тут непонятного?
 

Цитата:
$uri = Request::detect_uri();  
 
после чего explode('/', $uri) и анализ элементов массива.

 
проще говоря
$arr = explode('/', Request::detect_uri());
var_dump($arr);
 
и смотреть что и в каком элементе массива, что вы определите как категорию, как продукт и его описание. по ним и искать уже в базе что выводить посетителю.
 

Цитата:
щас пробовал, ниже нельзя, ошибка, поставил так.  

нет смысла, не дойдет до следующего пути никогда.

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 03:00 10-12-2014 | Исправлено: Mavrikii, 03:02 10-12-2014
newbies



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
не дойдет,  так и что делать, если ошбки, если выше дефолтного роутера ставлю.
 
я так понимаю акшион должен выглядеть так.
 

Код:
 
public function action_getPage()
{
$uri = Request::detect_uri();
$arr = explode('/', Request::detect_uri());  
var_dump($arr);        
}
 

 
а что тут определять то !
 
и так понятно что убрать нужно, вот только как реализовать до сех пор не пойму.
и что этот метод будет находить то?   перехватывать  урл и обрабатывать его и убирать то что я хочу убрать в урле ?  
 
вот и ошибка
__http://clip2net.com/s/38smrAf
 
это если я ставлю так.
 

Код:
 
Route::set('default', '(<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'index',
        'controller' => 'main',
        'action'     => 'index',
    ));    
    
    Route::set('default', '<page>', array('page' => '.*'))    
     ->defaults(array(    
             'directory'  => 'index',    
             'controller' => 'page',    
             'action'     => 'getPage',    
     ));
 

 
Добавлено:
Чо делает данный метод ? что он определяет и где мне он что покажет то !

Всего записей: 2112 | Зарегистр. 23-06-2006 | Отправлено: 03:20 10-12-2014 | Исправлено: newbies, 03:21 10-12-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
newbies

Цитата:
это если я ставлю так.  

я уже поставил и смотрю. нет, не может она автоматически передать в следующий путь если контроллер не найден, так что там проблем больше. запрос этой фичи есть, но значит так и не реализовали, похоже.
 
 
Добавлено:
Ну все, разобрался. Все отлично работает.
Проще всего перехватить обработку 404 ошибки.
http://kohanaframework.org/3.3/guide/kohana/tutorials/error-pages
 
тогда создается в папке classes/HTTP/Exception/ файл 404.php
в котором, к примеру
 

Код:
<?php
class HTTP_Exception_404 extends Kohana_HTTP_Exception_404 {
 
    /**
     * Generate a Response for the 404 Exception.
     *
     * The user should be shown a nice 404 page.
     *
     * @return Response
     */
    public function get_response()
    {
           $uri = Request::detect_uri();
           var_dump(explode('/', $uri));
           exit;
    }
}
 

 
и все. если нет никакого контроллера для пути заданного в бутстраппере, то вызывается 404 ошибка, в которой берется строка запроса, разбивается на части и ищется.
 
так "сложно" именно из за
Цитата:
Route::set('default', '(<controller>(/<action>(/<id>)))')  
    ->defaults(array(  
        'directory'  => 'index',  
        'controller' => 'main',  
        'action'     => 'index',  
    ));    

который уже захватывает любой URI и если нет соответствующего контроллера или метода для него, выдает 404 ошибку.
 
либо нужно использовать свой путь для захвата всех запросов, но в нем придется анализировать если запрос к существующему контроллеру, есть ли в нем запрашиваемый метод и тд и тп. если есть - вызывать их, если нет, делать как в примере, что я привел - получать REQUEST_URI, разбивать на куски, искать в базе соответствие данному URI и если нет, то бросить 404 ошибку, а если есть, то выдать содержимое с информацией.

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 03:29 10-12-2014 | Исправлено: Mavrikii, 03:58 10-12-2014
newbies



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
То есть этот метод 'getPage'. не доделали и не стоит  его смотреть, так как пользы от него не какой.
 
У меня т ам немного чпу есть, с товаром.
Раньше название товаров были id.
Сделали чпу, давно еще, щас название товара как надо. вместо  id там название заголовка но не на русском, а на англ.
 
Как мне сделали, в бд добавили базу,  при добавлении или редактирование категории в админке, добавили новое поле алиас, туда копируем заголовок категории, и он автоматом, переводит, там транслит стоит, ну и записывает в бд. после чего  в классе  в разделе категории, немного  добавили кода, могу скинуть.
 
Раньше было так:  
site.ru/category/view/5
циферка 5 это название категории.
а щас так.
site.ru/category/view/kirpichi
 
Я пытался так же для продукта сделать, для товаров,  но не вышло ! сделал что бы поле записывалось в базу ! так же  добавил  поле импут при  редактирование и сохранении и что бы транслит срабатывал.
 
Но вывести и заменить не вышло.
 
ну и вообще на данный момент я пытаюсь убрать из ссылки /category/view/
 
Добавлено:
http://kohanaframework.org/3.3/guide/kohana/tutorials/error-pages   это вроде бы модуль который ставить нужно  да ?
 
если ссылки нет, то он показывает 404. у меня что то подобное стоит, если ссылки нет то перенаправляет на главную.
 
А щас то он зачем ? что он даст то ! не совсем понял.
 
Это же просто выдает 404 если нет страницы.

Всего записей: 2112 | Зарегистр. 23-06-2006 | Отправлено: 03:56 10-12-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
newbies

Цитата:
ну и вообще на данный момент я пытаюсь убрать из ссылки /category/view/

я написал выше все. сложности из за того, что нужно определить - либо это запрос к существующему контроллеру и действию, либо же к данным о товаре/категории из базы
 
Добавлено:

Цитата:
А щас то он зачем ? что он даст то ! не совсем понял.

да елки палки.. ну я устал уже повторять то.
 
ну вот пошли вы на сайт  
http://site/stroka
 
откуда фреймворк знает, попадает ли stroka в существующие контроллеры или это название категории товара?
 
в роутере это попадет сюда

Цитата:
Route::set('default', '(<controller>(/<action>(/<id>)))')  

<controller> станет равным "stroka", но если такого контроллера нет, то фреймворк кинет 404 ошибку. и все, дальнейшие пути перебираться не будут (что многие люди запрашивали, как метод fall_through(), но видимо так и не было реализовано).
 
в перехвате 404 сообщения вы берете REQUEST_URI, разбиваете по /, получаете массив из одного элемента "stroka"
так как элемент один, то знаете, что это категория - делаете поиск по ней в базе.
если ничего нет, выдаете 404 (переадресация на домашнюю страницу очень и очень плохо)
если есть - выдаете нужную информацию.
 
если после разбития будет 2 элемента (например URI /stroka/product), то первый будет "stroka", второй "product", то есть вам нужно уже искать по категории и названию товара - ищете в базе.
если ничего нет, выдаете 404 и сообщение, что не найдено
если есть - отображаете информацию.
 
ps:
Цитата:
var_dump(explode('/', $uri));
сделал специально, чтобы сами посмотрели как массив выглядит.
если $uri будет как /stroka, то элемента в массиве будет 2 - первый пустой, а второй будет "stroka".
можно сделать ltrim и удалить ее заранее, либо считать уже количество элементов с учетом этого пустого первого - все на ваше усмотрение.
 

Цитата:
это вроде бы модуль который ставить нужно  да

какой модуль? это переопределение класса обрабатыващего 404 ошибки.

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 04:00 10-12-2014 | Исправлено: Mavrikii, 04:12 10-12-2014
newbies



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
site/stroka   ну да если набрать и нет роутера, то он  направит на главную страницу, так как нет такой странице и будет использовать дефолтный роутер.
а что даст понять что он кинет на 404 ? на данный момент если ссылки нет такой то он перенаправляет на главную и все, переадресация есть.
 
 
сделал: classes/HTTP/Exception/ файл 404.php
папки создать так же с большой буквы как написали ?
 
404.php   запихал код там щас так.
 

Код:
 
 
<?php class HTTP_Exception_404 extends Kohana_HTTP_Exception_404 {  
   
public function get_response()  
{  
$uri = Request::detect_uri();  
var_dump(explode('/', $uri));  
exit;  
}  
}
 

 
что я этим добился я не понял )))))))))))))))))))))))
 
 

Всего записей: 2112 | Зарегистр. 23-06-2006 | Отправлено: 04:11 10-12-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
newbies

Цитата:
что я этим добился я не понял

значит думайте - я подробно все описал. слишком подробно.
 

Цитата:
на данный момент если ссылки нет такой то он перенаправляет на главную и все, переадресация есть.

я же написал - нельзя так делать! мало того, что для поисковиков плохо.
так еще и при каждой отсутствующей картинке/css/js или иному файлу вы грузите сервер отображением домашней страницы.
поэтому в том же месте неплохо бы смотреть расширение файла в запросе (если есть), чтобы не делать лишних запросов в базу данных и меньше грузить сервер.

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 04:13 10-12-2014 | Исправлено: Mavrikii, 04:16 10-12-2014
newbies



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
все понял что через ошибку 404 мы увидим какие то пути, выходит что мне щас стандартную переадресацию нужно выключить что бы срабатывал этот метод  то что выше написали.
 
а как он будет срабатывать, его наверное где то вписать нужно по мимо того что мы создали фаил.

Всего записей: 2112 | Зарегистр. 23-06-2006 | Отправлено: 04:14 10-12-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
newbies

Цитата:
а как он будет срабатывать, его наверное где то вписать нужно по мимо того что мы создали фаил

нет, фреймворк автоматически смотрит папки, который дополняют его родные классы.

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 04:15 10-12-2014
newbies



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в боотстрайпе
я закомментировал строку
 
//set_exception_handler(array('Exceptionhandler', 'handle'));
 
это и есть запуска модуля если нет страницы, то идет переадресация.
 
щас если вводишь ту страницу которой нет, то он выводит ошибку.

Всего записей: 2112 | Зарегистр. 23-06-2006 | Отправлено: 04:15 10-12-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
newbies

Цитата:
//set_exception_handler(array('Exceptionhandler', 'handle'));  

какая версия Kohane?

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 04:17 10-12-2014
newbies



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ввел я site.ru/textinggg
и вижу я такую ошибку.
 

Код:
 
HTTP_Exception_404 [ 404 ]: The requested URL 404/index was not found on this server.
SYSPATH/classes/kohana/request/client/internal.php [ 94 ]
89             // Initiate response time
90             $this->_response_time = time();
91  
92             if ( ! class_exists($prefix.$controller))
93             {
94                 throw new HTTP_Exception_404('The requested URL :uri was not found on this server.',
95                                                     array(':uri' => $request->uri()));
96             }
97  
98             // Load the controller using reflection
99             $class = new ReflectionClass($prefix.$controller);
 

 
Добавлено:
версия последняя ! та что на офф сайте последняя вышла.

Всего записей: 2112 | Зарегистр. 23-06-2006 | Отправлено: 04:18 10-12-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
newbies

Цитата:
та что на офф сайте последняя вышла.

значит все должно работать. проверить еще что в init функции не сказано 'errors' => false
все подробности тут, проверил и работает
http://kohanaframework.org/3.3/guide/kohana/tutorials/error-pages#extending-the-httpexception-classes

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 04:19 10-12-2014
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3

Компьютерный форум Ru.Board » Интернет » Web-программирование » Помогите реализовать чпу в kohane


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru