Ответы пользователя по тегу Kohana
  • Почему не получается сохранить параметры запроса в Kohana ORM?

    Пример

    $posts = ORM::factory("post") -> reset(false); /// Вот оно!
    $posts = $posts -> where("published","=",1);
    // Дальше накручиваем фильтров
    if(......){
       $posts = $posts->where( ..........);
    }
    .........................
     
    $count = $posts - >count_all();
     
    // Теперь ничего не теряется
    $posts = $posts -> limit(10)->offset(30)-> find_all();
    Ответ написан
  • Что переместить в модель Kohana?

    Учитывая, что в приведенном выше коде не используется query builder ни от Database ни от ORM (что одно и то же с точки зрения query builder, практически), то в модель ORM, которая наследуется от ORM - перемещать нечего.

    Проблема глубже - она в вашем понимании.
    Модель в бизнес логике это не только ORM и прочие способы доступа к БД и харнилищам, это полное описание бизнес логики.
    По сути classes в Кохане можно использовать для хранения иерархии просто классов, а папку Model для простых и ORM моделей.
    Вам надо логику перемещать в простые классы, которые следует создавать по соображениям сущности, которую реализует класс. Тогда будет иерархия классов, взаимодействие объектов, а в контроллере просто их вызов.

    Еще раз, главный посыл - модель это не только доступ в БД. :)

    В модели БД можно выносить кастомные sql запросы или какую-то пред или пост обработку данных.

    Почитайте про ООП и Паттерны.

    UPD.

    Отрефакторил код. Написал бы как-то так. У вас запутно все. У меня проще.
    <?php
    
    defined('SYSPATH') or die('No direct script access.');
    
    class Controller_Products extends Controller_Base
    {
    
        public function action_index()
        {
            // пагинация
            $count      = ORM::factory('product')->count_all();
            $pagination = Pagination::factory(array('total_items' => $count));
            $products   = ORM::factory('product')
                    ->limit($pagination->items_per_page)
                    ->offset($pagination->offset)
                    ->find_all();
    
            $content = View::factory('prodAll')
                    ->set('products', $products);
    
            //используется в шаблоне?
            $content->pagination = $pagination;
    
            $this->template->title       = 'Все товары';
            $this->template->description = 'Список всех товаров';
            $this->template->content     = $content;
        }
    
        public function action_cart()
        {
    
            $content = View::factory('cartView');
    
            $content->inCart = FALSE;
            $content->inCart = $this->session->get('product2');
    
            $this->template->title       = 'Корзина покупок';
            $this->template->description = 'Список ваших товаров';
            $this->template->content     = $content;
        }
    
        public function action_product()
        {
            //узнаем id материала
            $id   = $this->request->param('id');
            $post = $this->request->post();
    
            // получаем данные из таблицы "products"
            $product = ORM::factory('product', $id);
            $content = View::factory('prodView')
                    ->set('product', $product);
    
            $this->template->title   = $product->title;
            $this->template->content = $content;
            $content->inCart         = FALSE;
    
            if (isset($post['Submit'])) {
                $this->processOrder($post, $product);
    
                Controller::redirect('main/ordered');
            }
    
            if (isset($post['InCart'])) {
                $this->session->set('product2', $product->name);
            }
        }
    
        /**
         * 
         * @param array $post
         * @param Model_Product $product
         */
        protected function processOrder($post, $product)
        {
            $clientName   = Arr::get($post, 'Name', '');
            $clientPhone  = Arr::get($post, 'Phone', '');
            $clientAdress = Arr::get($post, 'Adress', '');
            $orderNumber  = Arr::get($post, 'Number', '');
    
            $post = array(
                'name'          => $product->name,
                'number'        => $orderNumber,
                'url'           => $product->url,
                'client_name'   => $clientName,
                'client_phone'  => $clientPhone,
                'client_adress' => $clientAdress
            );
    
            ORM::factory('order')
                    ->values($post)
                    ->save();
        }
    
    }
    Ответ написан