Kohana Реализация полноценного чпу на сайте, kohana

ws17

Новичок
Здравствуйте.
Версия коханы последняя.

В категории есть подкатегории, вид их такой.
сайт.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();
    }
}
но это я так понимаю не все, помогали делать, и сделана таблица в бд в категориях ali
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Автор, задай (оформи) вопрос нормально, пожалуйста, со знаком вопроса на конце и человеческими формулировками, а

не

так

чтобы

все

было

через

строчку.

Иначе снесу, извиняй.
 

ws17

Новичок
Обновил тему, добавил код, может кто поможет и подскажет.
 

edwardgorbachev

Новичок
Как вариант можно использовать лямбда-роутинг и запросы к базе и на основании этого задавать контроллер и параметры.

http://kohanaframework.org/3.2/guide/kohana/routing#lambdacallback-route-logic

Хотя в доке по 3.3 версии этого момента нет... Может они что-то поменяли в этом деле - проверить не могу.
 

edwardgorbachev

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

PHP:
Route::set('category', function($uri)
    {
        $db = Database::instance();

        $uri_segments = explode('/', $uri);

        $product = FALSE;

        // нужно введение доп. логики для распарсивания uri
        $alias = $uri_segments[0];
        $cat = ORM::factory('category')->where('alias','=',$alias)->or_where('id','=',$alias)->find();

        if (!empty($uri_segments[1]) && !empty($cat))
        {
            $product = '...'; // логика запроса в БД на продукт
        }

        if (!empty($cat) && !empty($product))
        {
            return array(
                'controller' => 'category',
                'action'    => 'view',
                'id'        => $alias
            );
        }
        elseif (!empty($cat) && empty($product))
        {
            return array(
                'controller' => 'category',
                'action'    => 'product',
                'id'        => $alias // подставь нужные тебе параметры для передачи в контроллер
            );
        }
    }
);
 

ws17

Новичок
Большое спасибо уважаемый, я извиняюсь за свою не компетентность, хотелось бы по порядку, я так понимаю этот код вставить нужно в bootstrap.php, это редирект с какой то проверкой ?
 

ws17

Новичок
где посмотреть $product = '...'; // логика запроса в БД на продукт

кусок кода это не оно ? где можно посмотреть.
Код:
$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')
'id' => $alias // подставь нужные тебе параметры для передачи в контроллер

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