Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 28 мар 2024, 20:56

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Первое знакомство новичка
СообщениеДобавлено: 24 дек 2013, 18:31 
Не в сети
Новичок
Аватара пользователя

Зарегистрирован: 22 дек 2013, 17:11
Сообщения: 28
Добрый день.
С Kohana начал только знакомиться. Вот сделал сайт вызитки вроде всё получилось и роуты и мультиязычность.
Теперь стоит 2 задачи:
1. Из БД выводить все и одну запись
Контролер:
Код:
class Controller_Page extends Controller_Temp
{
   //News All
   public function action_news()
   {
      $section = '4';
      $articles = array();
            
      $content = View::factory('/pages/v_news')
            ->bind('articles', $articles);
            
      $articles = Model::factory('Article')->get_all($section);
      
      $this->template->seo_title = __("lang_news");
      $this->template->content = $content;
   }
   //News All

   //News Details
   public function action_news_details()
   {
        $id = $this->request->param('id');
            
      $content = View::factory('/pages/v_news_details')
            ->bind('article', $article);
            
      $article = Model::factory('Article')->get_one($id);
      
      $this->template->seo_title = $article['title'];
      $this->template->content = $content;
   }
   //News Details
}

Модель:
Код:
class Model_Article extends Model
{
    protected $_tableArticles = 'articles';

   //Get all articles
    public function get_all($section = '')
    {
        $query = "SELECT * FROM ". $this->_tableArticles ." WHERE `status` = '1' AND `section` = '".$section."' ORDER BY `id` DESC";
 
        return DB::query(Database::SELECT, $query)
                   ->execute();
    }


   //Get one article
    public function get_one($id = '')
    {
      $query = "SELECT * FROM ". $this->_tableArticles ." WHERE `id` = :id LIMIT 1";
 
        $query = DB::query(Database::SELECT, $query, FALSE)
                         ->param(':id', (int)$id)
                         ->execute();
 
        $result = $query->as_array();
      
        if($result)
            return $result[0];
        else
            return FALSE;
    }
}


2. Из БД выводить запиви по POST запросу
Контролер:
Код:
class Controller_VehicleVin extends Controller_Temp {
   
   //Vehicle VIN
   public function action_get()
   {
      if($_POST) {
         $search_vehicle_vin = $_POST['search_vehicle_vin'];
      
      $vehiclevin = Model::factory('Vehiclevin')
               ->get_vin_data($search_vehicle_vin);
      }
      
      $content = View::factory('/pages/v_vehicle_vin')
            ->bind('vehiclevin', $vehiclevin);
      
      $this->template->seo_title = 'Vehicle VIN';
      $this->template->content = $content;
   }
   //Vehicle VIN

}

Модель:
Код:
class Model_Vehiclevin extends Model
{
   
   //Vehicle VIN Table
   protected $_table_name_vin = 'base_for_vin';
   
   //Photos Table
   protected $_table_name_photos = 'base_for_vin_photos';
   
   //Vehicle VIN
   public $search_vehicle_vin;
   
   //Get Details Information
   public function get_vin_data($search_vehicle_vin = '')
   {
      $query = "SELECT * FROM ". $this->_table_name_vin ." WHERE `vin` = '".$search_vehicle_vin."' LIMIT 1";
 
        $query = DB::query(Database::SELECT, $query, FALSE)
                         ->execute();
 
        $result = $query->as_array();
      
        if($result)
            return $result[0];
        else
            return FALSE;
   }
   
   
   //Get Photos
   public function get_photos_data()
   {
      $base_id = $this->get_vin_data();
      
        $query = "SELECT * FROM ". $this->_table_name_photos ." WHERE `base_id` = '".$base_id."'";
 
        return DB::query(Database::SELECT, $query)
                   ->execute();
   }
   
}


Вопросы:
1. Правильно ли я реализвал всё в обоих задачах?
2. Со стороны безопасности, у меня сейчас SQL Injection, при переписывании ORM и подстановки валидации думаю пропайдёт она да?
3. Где я указывал в запросе LIMIT 1, там должно быть $result = $query->as_array(); ?
4. Подскажите как подключить валидацию
5. Подскажите как переписать под ORM

спс.Ув.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первое знакомство новичка
СообщениеДобавлено: 25 дек 2013, 06:36 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
Цитата:
1. Правильно ли я реализвал всё в обоих задачах?

Нужно избегать повторяющихся однотипных действий и выносить их в базовый класс.
Например, автоматически генерировать title и content (см код Controller_Temp далее).
Стараться писать в стиле Коханы http://kohanaframework.org/3.3/guide/kohana/conventions .

Цитата:
2. Со стороны безопасности, у меня сейчас SQL Injection, при переписывании ORM и подстановки валидации думаю пропайдёт она да?

Database экранирует данные.

Цитата:
4. Подскажите как подключить валидацию

http://kohanaframework.org/3.3/guide/ko ... validation
https://github.com/WinterSilence/Kohana ... edback.php

Цитата:
5. Подскажите как переписать под ORM

http://kohanaframework.org/3.3/guide/or ... validation
http://kohanaframework.su/database/orm_entering

Код:
class Controller_Temp extends Kohana_Controller_Temp {

   /**
    * @var mixed  Template variable 'seo_title'
    */
   protected $_title = NULL;

   /**
    * @var mixed  Template variable 'content'
    */
   protected $_content = NULL;

   /**
    * Called after action
    */
   public function after()
   {
      // or: if ( ! $this->template instanceof View)
      if ($this->auto_render !== TRUE)
      {
         return parent::after();
      }
      
      if (is_null($this->_title) OR is_null($this->_content))
      {
         // Controller_Page_Car - action_info(), path = array('page'+'s', 'car'+'s', 'info');
         $path = array(
            Inflector::plural($this->request->directory(), 2),
            Inflector::plural($this->request->controller(), 2),
            $this->request->action()
         );
      }
      
      if (is_null($this->_title))
      {
         // title = 'Pages - cars - info'
         $this->_title = UTF8::ucfirst(implode(' - ', $path));
      }
      
      if (is_null($this->_content))
      {
         // content = 'pages/cars/info'
         $this->_content = View::factory(implode(DIRECTORY_SEPARATOR, $path));
      }
      
      // Sets general template variables
      $this->template->seo_title = $this->_title;
      $this->template->content = $this->_content;
      
      parent::after();
   }
}

class Controller_Article extends Controller_Temp
{
   // Article info
   // Default: template = 'views/articles/index.php', title = 'Articles - info'
   public function action_info()
   {
      $id = $this->request->param('id', 0);
      $article = Model::factory('Article')->find($id);
      
      $this->_title   = Arr::get($article, 'title');
      $this->_content->article = $article;
   }

   // List of articles
   // Default: template = 'views/articles/list.php', title = 'Articles - list'
   public function action_list()
   {
      $section = $this->request->param('section', 4);
      $this->_content->articles = Model::factory('Article')->find_all($section);
   }
}

class Model_Article extends Model_Database {

   protected $_table = 'articles';

   // Gets list of articles
   public function find_all($section = 0)
   {
      return DB::select()
         ->from($this->_table)
         ->where('status', '=', 1)
         ->where('section', '=', (int) $section)
         ->order_by('id', 'DESC');
         ->execute($this->_db);
   }

   // Get article by id
   public function find($id = 0)
   {
      return DB::select()
         ->from($this->_table)
         ->where('id', '=', (int) $id)
         ->execute($this->_db);
   }
}

class Controller_Vehicle_Vin extends Controller_Temp {
   // Search by vin
   // Default: template = 'views/vehicles/vin/index.php', title = 'Vehicles - vin - search'
   public function action_search()
   {
      if ($this->request->method() === Request::POST)
      {
         $vin = $this->request->post('vehicle_vin');
         $this->_content->vehicle = Model::factory('Vehicle_Vin')->find($vin);
      }
   }
}

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первое знакомство новичка
СообщениеДобавлено: 26 дек 2013, 23:36 
Не в сети
Новичок
Аватара пользователя

Зарегистрирован: 22 дек 2013, 17:11
Сообщения: 28
Завтра попробую переписать всё через ORM втом примере в котором вы показали думаю всё ясно.
если особо не побеспокою отпишу ещё ))

спс.Ув.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group