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

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

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

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

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

newbies



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.
Версия коханы последняя.
 
В категории есть подкатегории, вид их такой.
сайт.ru/category/view/1
сайт.ru/category/view/2
сайт.ru/category/view/3
 
как убрать, /category/view/
а id категории 1-2-3, изменить на название категории, допустим название категории кирпичи, как сделать так.
сайт.ru/kirpichi
 
А так же в этих категориях есть товар.
 
сайт.ru/category/product/7417
 
как убрать это /category/product/,  а сделать что бы там было название категории в которой товар, допустим сайт.ru/kirpichi/7417
 
а так же как заменить id товара на правильное название, допустим это 7417 заменить на  bigkirpich
 
и получить такой вариант: сайт.ru/kirpichi/bigkirpich
 
 
На данный момент небольшая часть чпу уже сделана, категория выводиться, название.
сайт.ru/category/view/kirpichi
 
но хотелось бы убрать category/view/
 
/application/classes/controller/index
 
category.php
 
Добавлено:

Код:
 
    public function action_view()
    {
        $alias = $this->request->param("id");
        $cat = ORM::factory('category')->where('alias','=',$alias)->or_where('id','=',$alias)->find();
        $id = $cat->id;
 
        $settings = ORM::factory('setting')->find();
        if($cat->products>1){
            if(empty($cat->id)){
                $this->request->redirect();    
            }
            $products = DB::query(Database::SELECT, "SELECT image,prname,price,products.id,full_name FROM `products` LEFT JOIN `images` ON products.image_id = images.id WHERE status = 0 AND category = $id ORDER BY products.price ASC")->execute()->as_array();
            $content = View::factory('index/main/v_cat_ro')
                ->bind('cat',$cat)
                ->bind('settings',$settings)
                ->bind('products',$products);
        }else{
            $cats = ORM::factory('category')->where('parent_id','=',$id)->find_all();    
            $content = View::factory('index/main/v_cats')
                ->bind('cats',$cats)
                ->bind('settings',$settings)
                ->bind('id', $id);
        }
        $this->template->site_name = $cat->cat_title.' '. $settings->title;
        $this->template->description = $cat->cat_des.' '. $settings->description;
        $this->template->keywords = $cat->cat_keys.' '. $settings->keywords;
        
        $this->template->content = $content;
    }
    
    public function action_views()
    {
        $alias = $this->request->param("id");
        
        $cat = ORM::factory('category')->where('alias','=',$alias)->or_where('id','=',$alias)->find();
        $id = $cat->id;
        $settings = ORM::factory('setting')->find();
        if($cat->parent_id != 0){
            $cats = ORM::factory('category')->where('parent_id','=',$cat->parent_id)->find_all();
        }    
        else
        {
            $cats = array();
        }
        $products = DB::query(
            Database::SELECT, "SELECT image,prname,price,products.id FROM  
                `products` LEFT JOIN `images` ON products.image_id = images.id  
                WHERE status = 1 AND category = $id  
                ORDER BY products.sorts ASC")->execute()->as_array('id');
        if(is_array($products))
        {
            foreach($products as $product){
                $pid = $product['id'];
                $options = DB::query(Database::SELECT, "SELECT * FROM `optionprice` WHERE product_id = $pid ORDER BY `id` ASC")->execute()->as_array();
                $products[$pid]['option_price'] = $options;
            }
        }
        $content = View::factory('index/main/v_subcats')
            ->bind('cat',$cat)
            ->bind('settings',$settings)
            ->bind('cats',$cats)
            ->bind('products',$products)
            ->bind('id', $id);
        
        $this->template->site_name = $cat->cat_title.' '. $settings->title;
        $this->template->description = $cat->cat_des.' '. $settings->description;
        $this->template->keywords = $cat->cat_keys.' '. $settings->keywords;
        
        $this->template->content = $content;
    }
        
    public function action_product()
    {
 
        $id = (int)$this->request->param("id");
        $product = ORM::factory('product')->where('id','=',$id)->find();
        $image = ORM::factory('image')->where('id','=',$product->image_id)->find();
        $images = ORM::factory('image')->where('product_id','=',$product->id)->find_all();
        $settings = ORM::factory('setting')->find();
        
        $options = DB::query(Database::SELECT, "SELECT * FROM `optionprice` WHERE product_id = $id ORDER BY `id` ASC")->execute()->as_array();
        $content = View::factory('index/main/view_product')
                ->bind('image',$image)
                ->bind('images',$images)
                ->bind('options',$options)
                ->bind('product',$product);
        $this->template->site_name = $product->prtitle.' '. $settings->title;
        $this->template->description = $product->prdes.' '. $settings->description;
        $this->template->keywords = $product->prkeys.' '. $settings->keywords;
        
        $this->template->content = $content;
    }
    
    public function action_test()
    {
        $id = (int) $this->request->param('id');
        $cat = ORM::factory('category', $id);
        $cat->delete();
    }
    
    public function action_test1()
    {
        $id = (int) $this->request->param('id');
        $products = ORM::factory('product', $id);
        $products->delete();
    }
}
 

 
но это я так понимаю не все, помогали делать,  и сделана таблица в бд в категориях alias.

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

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

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
/application
bootstrap.php
 
роуты тут, я так понимаю.
 
Добавлено:
сделал что бы поле при добавлении сохраняло и переводило транслитом !
но на выводе  не выводит, выдает ошибку, видимо я не так код сформировал.

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

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

Цитата:
роуты тут, я так понимаю.  

я не занимался данным фреймворком, говорю как это в принципе работает.
получили query строку, разбили на нужные куски, по ним ищем/выводим что хочется.
 

Цитата:
видимо я не так код сформировал

телепатов ищем?  
 
Добавлено:
Читайте
http://kohanaframework.org/3.0/guide/kohana/routing
 
особенно пример

Цитата:
You can also use a less restrictive regex to match unlimited parameters, or to ignore overflow in a route. In this example, the url foobar/baz/and-anything/else_that/is-on-the/url would be routed to Controller_Foobar::action_baz() and the "stuff" parameter would be "and-anything/else_that/is-on-the/url". If you wanted to use this for unlimited parameters, you could explode it, or you just ignore the overflow

 
этот путь должен быть последним, конечно же, чтобы "цеплять" то, для чего нет других существующих путей.

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Запутался я с роутами.
 
есть папка
classes\Controller\index\pages
в ней есть фаил сontact.php  
 
в файле код:

Код:
 
<?php defined('SYSPATH') or die('No direct script access.');
 
class Controller_Index_Pages_Contact extends Controller {
    
        public function action_contacts()
    {
        $this->response->body('hello, contacto!');
    }
 
}
 
 

 
Для теста я шаблон не делал, пытаюсь вывести что бы вывод был не такой
http://kohana/page/contact/
 
в боттстрап роут
Route::set('default', '<controller>(/<action>(/<id>))')
->defaults(array(
'directory'  => 'index/pages/',
'controller' => 'contact',  
'action'     => 'contacts',
));
 
щас выводит так http://kohana/contact/
 
Отлично работает.
 
А как сделать что бы было как тут, http://kohanaframework.su/advanced/route_p1
 
На локалке то работает, а вот на хостинге, где норма сайт, не работает.
 
Я там мутил с роутами, обновляю страницу и сайт обновляеться, рефрешь идет.
 
 
Там так идет: /classes/controller/index
фаил page.php
class Controller_Index_Page extends Controller_Index {
 
в нем акшион  

Код:
 
    public function action_contacts()
    {    
        $captcha = Captcha::instance();
        $this->template->scripts[] = 'media/js/сайт/jquery.validate.js';
        $alias = 'contacts';
        $page = ORM::factory('page')->where('alias','=',$alias)->find();
        
        if(empty($page->id)){
            $this->request->redirect();    
        }
 
        $content = View::factory('index/main/'.$alias)
            ->bind('page',$page)
            ->bind('captcha',$captcha);
        $this->template->content = $content;
    }
 

 
На данный момент ссылка такая сайт.ru/page/contacts
я хочу сделать через роутер такую сайт.ru/contacts
не выходит.
 
в боотстрапе, если ставлю так то на главной странице грузит страницу контактов
Route::set('default', '(<controller>(/<action>(/<id>)))')
    ->defaults(array(
            'directory'  => 'index',
            'controller' => 'page',
            'action'     => 'contacts',
    ));
 
а если так: то рефрешит страницу и ничего не грузит. без прерывное обновление
Route::set('default', '<controller>(/<action>(/<id>))')
    ->defaults(array(
            'directory'  => 'index',
            'controller' => 'page',
            'action'     => 'contacts',
    ));
 
Где моя ошибка ? подскажите.

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

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

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

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

Цитата:
я хочу сделать через роутер такую сайт.ru/contacts

запрашиваемый контроллер получается contacts, а не нужный вам page
 
если сделать так, то будет работать для /contacts

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

 
если же в общем виде, то  

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

 
а уже в методе action_getPage получаете $this->request->param('page'); и ищете в базе, что выводить по этому URL
 
ps: возможно есть где то опечатка, так как я не пользуюсь данным фреймворком. пишу то, что видно с первого взгляда на него.

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
если ставлю как вы посоветовали то  главная страница сайта !  обновляеться , как буд то бы я зажал  f5
 
видимо там где то роутер другой мешает.
 
Route::set('default', '(<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'index',
        'controller' => 'main',
        'action'     => 'index',
    ));    
    
    
Route::set('default', 'contacts')  
    ->defaults(array(
            'directory'  => 'index',
            'controller' => 'contacts',
            'action'     => 'contacts',
    ));
 
/classes/controller/index
отдельный фаил для  формы сделал контактов, в папке contacts.php
 
 
я пока очень жутко путаюсь в этих роутерах, надо  сто раз проделать что то подобное и запомнишь в голове выстроиться структура и все.

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

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

Цитата:
видимо там где то роутер другой мешает.  

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

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



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

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

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

Цитата:
а что вместо писать ?

вместо чего, default ? это просто название пути, которое, обычно, должно быть уникальным.
используется для генерации URL с данным путем внутри самого фреймворка.
 
я же писал - читайте внимательнее
http://kohanaframework.org/3.0/guide/kohana/routing#creating-urls-and-links-using-routes

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



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

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

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

Цитата:
вопрос, как быть со старыми ссылками ?  как убрать их

убрать откуда? ну почему за вас должны додумывать фразу до конца?
 
из поисковика? выдавать на них 404, уйдут со временем.
либо ускорить, как тут https://support.google.com/websearch/troubleshooter/3111061?hl=ru
 

Цитата:
я так понимаю что как то так же через роутер можно

я же все написал.. только данный метод будет несовместим с
Цитата:
Route::set('default', '(<controller>(/<action>(/<id>)))')  

так как должен его заменить, а не работать вместе с ним, иначе роутер не знает что именно хотите сделать.

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я и сделал для статистических страниц
 

Код:
 
     Route::set('contacts', 'contacts')    
     ->defaults(array(  
             'directory'  => 'index',  
             'controller' => 'page',  
             'action'     => 'contacts',  
     ));
      
     Route::set('wholesale', 'wholesale')    
     ->defaults(array(  
             'directory'  => 'index',  
             'controller' => 'page',  
             'action'     => 'wholesale',  
     ));
      
          Route::set('addresses', 'addresses')    
     ->defaults(array(  
             'directory'  => 'index',  
             'controller' => 'page',  
             'action'     => 'addresses',  
     ));
 

      
 
ссылки теперь без page
 
теперь осталось как то решить скрыть сайт.ru/category/view/matrasyi
вот это /category/view/
 
Добавлено:
в той же папке /application/classes/controller/index
фаил category.php
 
для него в бутстрапе делал

Код:
 
     Route::set('category', 'category')    
     ->defaults(array(  
             'directory'  => 'index',  
             'controller' => 'category',  
             'action'     => 'category',  
     ));
 

 
не срабатывает не выводит без /category/
 
тут уже по сложнее.

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

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

Цитата:
не срабатывает не выводит без /category/

я все уже написал, что нужно делать. не вижу смысла повторяться.

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
то есть без /category/   нельзя ? не совсем вас понял.

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

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

Цитата:
не совсем вас понял.


Цитата:
если же в общем виде, то  
 
Код:
Route::set('default', '<page>', array('page' => '.*'))  
    ->defaults(array(  
            'directory'  => 'index',  
            'controller' => 'page',  
            'action'     => 'getPage',  
    ));
 
 
а уже в методе action_getPage получаете $this->request->param('page'); и ищете в базе, что выводить по этому URL  


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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я так понимаю мне нужно создать акшион  и назвать action_getPage
 
Добавить туда строку  
$this->request->param('page');
 
и выйдет  что то типо того.
 
/application/classes/controller/index
page.php
 
все правильно ?

Код:
 
public function action_getPage()
{
$this->request->param('page');
}
 

 
в бд есть таблица pages  в ней есть таблицы другие.
 

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

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

Цитата:
все правильно ?  

нет, это правило несовместимо с
Цитата:
Route::set('default', '(<controller>(/<action>(/<id>)))')  

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

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



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

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

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

Цитата:
Приведите пример, не совсем понимаю

написать путь для  
/products/и-тут-что-угодно/и-как-хочется
 
тогда путь будет срабатывать только для URI начинающегося с /products/, а остальной путь будет идентификатором, по которому ищется информация для вывода.
он не будет перехватывать все и не будет в конфликте с default путем.

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 09:39 09-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