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

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 13 ноя 2018, 10:39

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: расширил ORM (SQLite)
СообщениеДобавлено: 23 июн 2013, 08:11 
Не в сети
Новичок

Зарегистрирован: 21 июн 2013, 00:44
Сообщения: 15
Написал для себя модель расширяющую класс ORM для комфортной разработки с использованием SQLite
Проверяет наличие БД и создает при необходимости таблицу и необходимой структурой
Гарантирована работа с SQLite, с другими типами не должна работать и не работает в текущем исполнении
Дорабатывать модель в планах нет, выкладываю как идею:
Код:
<?php defined('SYSPATH') or die('No direct script access.');

// эксперименты с созданием базы с нуля

class Model_xc_ORM extends ORM
{   
   private $_config_database = array();
   private $_mask = array(); // права директории и файла
   private $_path_parts = array();
   
   private function config_database()
   {
      $this->_config_database =
         Kohana::$config->load('database');
      
      $_ = explode(':',$this->_config_database[$this->_db_group]["connection"]["dsn"]);
      $this->_path_parts = pathinfo($_[1]);   
      $this->_path_parts['path'] = $_[1];   
      // var_dump($this->_path_parts);
   }

   // проверка существования бд и создание при необходимости
   public function control($data = FALSE)
   {
      $this->config_database();

      $this->_mask['old'] = umask(0); // На аргумент $mode umask() влияет текущее значение umask
      // проверка существования файла бд
      if ( ! is_file($this->_path_parts['path']))
      {
         return
         $this->_create_db();
      }


      // проверка таблицы
      try
      {
         $this->find();
      }
      catch (Exception $e)
      {
         $e = explode(":", $e->getMessage());

         if ($e[2] == ' 1 no such table')
         {
            return $this->_create_table();
         }
         else
         {
            Kohana::$log->add(Log::CRITICAL, $e->getCode()."\n\r".__FILE__.':'.__LINE__);
            return ('Неожиданная ситуация [] '.$e->getMessage().' [] '.$e->getCode());
         }
      }

      $this->clear();
      // umask($this->_mask['old']);
      return TRUE;
   }

   // создание бд
   private function _create_db($data = FALSE)
   {
      // если файл базы не создан
      if ( ! is_file($this->_path_parts['path']))
      {         
         if ( ! is_dir($this->_path_parts['dirname'])
         AND ( ! mkdir($this->_path_parts['dirname'], 0775, TRUE))) // оператор сравнения используем имменно AND
         {
            return 'Ошибка! Директория ['.$this->_path_parts['dirname'].'] не создана';   
         }

         try
         {
            $this->_create_file();

            $_create_table = $this->_create_table();
            
            if($_create_table !== TRUE)
               return
               ('Была обнаружена исправимая ошибка, меры устранения приняты, '
               .'<br /><a href='.$_SERVER["REQUEST_URI"].'>повторите попытку сейчас</a>.'
               .'<br />Если это сообщение не пропадает - обратитесь к администратору.');
            else
            {
               return $_create_table;
            }

         } catch (Exception $e) {
            return 'Ошибка! Файл ['.$this->_path_parts['basename'].'] не доступен для записи';
         }

      }
      return 'Ошибка!';
   }
   // создание таблицы
   private function _create_file()
   {
      fclose(fopen($this->_path_parts['path'], 'w'));
      chmod($this->_path_parts['path'],0664);
   }
   // создание таблицы
   private function _create_table()
   {
      $pdo = new PDO($this->_config_database[$this->_db_group]["connection"]["dsn"]);
      $query = $pdo->query($this->_create_table_query());
      
      if ( ! $query)
         return 'Ошибка! Таблица ['.$this->_table_name.'] не создана '.$this->_create_table_query();
      
      return TRUE;
   }

   private function _create_table_query()
   {
      $_table_name = $this->_table_name;
      $_primary_key = $this->_primary_key;
      $_table_columns = $this->_table_columns;

      $type = array(
         'data_type' => array(
            'int'       => 'INTEGER',
            'integer'    => 'INTEGER',
            'varchar'    => 'TEXT',
            'bool'       => 'NUMERIC',
            'boolean'    => 'NUMERIC',
            'float'    => 'REAL',
            'text'       => 'TEXT',
         ),
         'is_nullable' => array(TRUE => 'NULL', FALSE => 'NOT NULL', ),
         // 'autoincrement' => array(TRUE => 'AUTOINCREMENT', FALSE => '', ),
         // 'primary' => array(TRUE => 'PRIMARY KEY', FALSE => '', ),
      );

      $sql = "CREATE TABLE $_table_name (";
      foreach ($_table_columns as $ColumnName => $ColumnType)
      {
         $sql .= "$ColumnName ";
         foreach ($ColumnType as $data_type => $data_typeV)
         {
            $data_type = strtolower($data_type);
            $sql .= $type[$data_type][$data_typeV]." ";
         }
         $sql .= ",";
      }
      $sql .= "PRIMARY KEY ($_primary_key)";
      $sql .= ");";

      return
         $sql;
   }

} //end of file

как пользоваться
1. Создаем модель
Код:
<?php defined('SYSPATH') or die('No direct script access.');

class Model_DB_Product extends Model_xc_ORM
{   
   protected $_primary_key = 'id_product';
   protected $_db_group = 'products'; //конфигурация базы данных

   protected $_table_name = 'products'; //
   protected $_table_columns =
            array(
               'id'            => array('data_type' => 'int',      'is_nullable' => FALSE),
               'id_product'      => array('data_type' => 'int',      'is_nullable' => FALSE),
               'id_manufacturer'   => array('data_type' => 'varchar',   'is_nullable' => FALSE),
               'available'         => array('data_type' => 'bool',      'is_nullable' => TRUE),    // наличие  TRUE, NULL - уведомить, FALSE
               'name'            => array('data_type' => 'varchar',   'is_nullable' => TRUE),    // наименование
               'price'            => array('data_type' => 'float',   'is_nullable' => TRUE),   // цена
               'description'      => array('data_type' => 'text',      'is_nullable' => TRUE),    // описание
               'features'         => array('data_type' => 'text',      'is_nullable' => TRUE),    // характеристики

               // 'href'            => array('data_type' => 'varchar',   'is_nullable' => TRUE),
            );

   public function rules()
   {
      return
      array(
         'id_product' => array(
            array('not_empty'), // ( ! empty() )
            array('digit', array(':value', TRUE)), // целое число , TRUE для совместимости с UTF-8
         'id_manufacturer' => array(
            array('not_empty'), // ( ! empty() )
            array('alpha', array(':value', TRUE)), // только из символов алфавита , TRUE для совместимости с UTF-8
         ),
      );
   }

} //end of file
2. в контроллере
Код:
      $product = ORM::factory('DB_Product');
      // проверка существования бд
      $control =  $product->control();
      if ($control !== TRUE)
      {
         var_dump($control);
         die();
      }

предложения и замечания принимаются ))


Последний раз редактировалось -JSergRu- 24 июн 2013, 14:00, всего редактировалось 6 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: расширил ORM
СообщениеДобавлено: 23 июн 2013, 14:05 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
1. мог бы не изобретать велосипед, а просто погуглить
2. в рабочей версии данный код не нужен, а в тестовой проще через phpmyadmin накидать

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: расширил ORM
СообщениеДобавлено: 24 июн 2013, 02:21 
Не в сети
Новичок

Зарегистрирован: 21 июн 2013, 00:44
Сообщения: 15
WinterSilence писал(а):
1. мог бы не изобретать велосипед, а просто погуглить

Ссылку в студию! )


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

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
-JSergRu- > "mysql php crud scaffolding",я думал первых 20 ссылок тебе хватит

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: расширил ORM
СообщениеДобавлено: 24 июн 2013, 04:34 
Не в сети
Новичок

Зарегистрирован: 21 июн 2013, 00:44
Сообщения: 15
разве mysql php crud scaffolding это не есть сам ORM?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: расширил ORM (SQLite)
СообщениеДобавлено: 24 июн 2013, 10:31 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
-JSergRu-речь то была не об этом, а о функции добавления в бд

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: расширил ORM (SQLite)
СообщениеДобавлено: 24 июн 2013, 11:04 
Не в сети
Новичок

Зарегистрирован: 21 июн 2013, 00:44
Сообщения: 15
приведенный пример расширения справляется с функцией добавления в бд )
кроме того создает директорию и файл базы при необходимости
впрочем, если кто-нибудь захочет заменить ORM, то те 20 ссылок будут актуальны


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

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


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

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


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

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