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

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 05 июл 2025, 03:56

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




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: 16 июл 2012, 01:20 
Не в сети
Бывалый

Зарегистрирован: 11 июл 2012, 00:30
Сообщения: 31
Вот собственно экшен, кохану изучаю около 4 дней, так что толком еще ничего не знаю. Что тут можно улучшить ? Что сейчас плохо сделано ?В дванном примере как я понимаю нужно сдеать транзакцию, но как ее делать в кохане я не знаю =( . Кому не не лень, пожалуйста помогите =)
Код:
    public function action_add() {
        //Получаем все поджанры
        $incats = ORM::factory('incat')->find_all();
       
        if (isset($_POST['submit'])) {
            $data = Arr::extract($_POST, array('name', 'original_name', 'year', 'time', 'description', 'image', 'url'));
            $video = ORM::factory('video');
            $video->values($data);
           
            $cat = Arr::extract($_POST, array('incats'));
            $video_incats = ORM::factory('cat');
               
            try {
                $video->save();
                $last_id = $video->id;

                foreach ($cat['incats'] as $incat_id) {
                    $video_incats->values(array('video_id' => $last_id, 'incat_id' => $incat_id));
                    $video_incats->save();
                    $video_incats->clear();
                }         
                $this->request->redirect('admin/news');
            }
            catch (ORM_Validation_Exception $e) {
                $errors = $e->errors('validation');
            }
        }
       
        $content = View::factory('index/video/v_video_add')
                ->bind('errors', $errors)
                ->bind('data', $data)
                ->bind('incats', $incats);

        // Вывод в шаблон
        $this->template->page_title .= ':: Добавить';
        $this->template->block_center = array($content);
    }


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 июл 2012, 04:56 
Не в сети
Новичок
Аватара пользователя

Зарегистрирован: 23 июн 2012, 10:16
Сообщения: 22
Со всего что я начитал могу сказать одно
$_POST['submit'] всегда иссет:) Не знаю может мну тут какашками закидают, но яб тебе посоветовал проверять либо так:
!empty($_POST)
Либо так:
Request method == post
empty естесно быстрее писать.

_________________
:)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 июл 2012, 08:07 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
На счет post, да. Думаю "по феншую" так проверять правильно: if ($this->request->method() == HTTP_Request::POST) {...}
Зачем $last_id, если она в одном месте используется? Можно сразу туда вписать.
И, наверное, категории и подкатегории нужно объединить в одну таблицу с полем parent_id, если правильно понял мысль.
Какая связь таблиц каткгории-видео, многие-ко-многим? Если да, то нужно в модели это прописать и сделать не в цикле, там явно что-то не то)

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 июл 2012, 12:09 
Не в сети
Бывалый

Зарегистрирован: 11 июл 2012, 00:30
Сообщения: 31
AmberLEX писал(а):
На счет post, да. Думаю "по феншую" так проверять правильно: if ($this->request->method() == HTTP_Request::POST) {...}
Зачем $last_id, если она в одном месте используется? Можно сразу туда вписать.
И, наверное, категории и подкатегории нужно объединить в одну таблицу с полем parent_id, если правильно понял мысль.
Какая связь таблиц каткгории-видео, многие-ко-многим? Если да, то нужно в модели это прописать и сделать не в цикле, там явно что-то не то)

У меня на данном этапе связи нет, т.к. считаю что здесь она не нужна, не вижу смысла, а при выборке буду использовать многие-ко-многим.-Если да, то нужно в модели это прописать и сделать не в цикле, там явно что-то не то) , а как сделать, можно пример пожалуйста ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 июл 2012, 13:43 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Связь или есть или нет. Нужно как-то следить за целостностью данных при заполнении и выборке.
Пример вот:
Код:
class Model_Category extends ORM
{
    protected 
$_has_many = array(
        
'articles' => array(
            
'model'   => 'article',
            
'through' => 'cat2art',
        ),
    );
}

class 
Model_Article extends ORM
{
    protected 
$_has_many = array(
        
'categories' => array(
            
'model'   => 'category',
            
'through' => 'cat2art',
        ),
    );

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 июл 2012, 13:49 
Не в сети
Бывалый

Зарегистрирован: 11 июл 2012, 00:30
Сообщения: 31
AmberLEX писал(а):
Связь или есть или нет. Нужно как-то следить за целостностью данных при заполнении и выборке.
Пример вот:
Код:
class Model_Category extends ORM
{
    protected $_has_many = array(
        'articles' => array(
            'model'   => 'article',
            'through' => 'cat2art',
        ),
    );
}

class Model_Article extends ORM
{
    protected $_has_many = array(
        'categories' => array(
            'model'   => 'category',
            'through' => 'cat2art',
        ),
    );
}
 

Спасибо. Если да, то нужно в модели это прописать и сделать не в цикле. У меня через цикл добавляются в БД новые поля, может быть сразу 20 подкатегорий, вот и создатся для данного фильма 20 полей в таблице


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 июл 2012, 13:54 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Я твое не понимать) Каких полей?

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 июл 2012, 17:31 
Не в сети
Бывалый

Зарегистрирован: 11 июл 2012, 00:30
Сообщения: 31
AmberLEX писал(а):
Я твое не понимать) Каких полей?

не то написал, 20 записей будет добавлено в БД. В зависисти от того сколько пользователь выберет подктегорий. Если он выбрал 5, то 5 будет добавлено в БД


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 июл 2012, 18:41 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Цитата:
У меня на данном этапе связи нет, т.к. считаю что здесь она не нужна, не вижу смысла, а при выборке буду использовать многие-ко-многим.
Я не очень понимаю эту фразу и какой вы там смысл видите или не видите.
Есть стандартная задача (у вас как я понимаю она стандартная) - есть стандартное решение. У kohana есть средства для ее решения. А какой велосипед вы там строите я примерно догадываюсь, но он не нужен скорее всего.
У вас есть категории, есть то что в них добавляется - пока все.
Если сделать многие-ко-многим, нужна промежуточная таблица. (постом выше cat2art)
Потом при добавлении чего-то в категорию, вы добавляете саму запись в одну таблицу и запись о связи в промежуточную.
Выглядит это примерно так:
Код:
    $obj->save();
    $obj->add('categories', $cids); 
где $cids - массив id-шников выбранных категорий
И все.
Метод add(), который это делает смотрим в модуле ORM. Там уже есть цикл с $query->values, который строит запрос и потом выполняется 1 раз: $query->execute($this->_db);
Код:
    /**
     * Adds a new relationship to between this model and another.
     *
     *     // Add the login role using a model instance
     *     $model->add('roles', ORM::factory('role', array('name' => 'login')));
     *     // Add the login role if you know the roles.id is 5
     *     $model->add('roles', 5);
     *     // Add multiple roles (for example, from checkboxes on a form)
     *     $model->add('roles', array(1, 2, 3, 4));
     *
     * @param  string  $alias    Alias of the has_many "through" relationship
     * @param  mixed   $far_keys Related model, primary key, or an array of primary keys
     * @return ORM
     */
    public function add($alias, $far_keys)
    {
        $far_keys = ($far_keys instanceof ORM) ? $far_keys->pk() : $far_keys;

        $columns = array($this->_has_many[$alias]['foreign_key'], $this->_has_many[$alias]['far_key']);
        $foreign_key = $this->pk();

        $query = DB::insert($this->_has_many[$alias]['through'], $columns);

        foreach ( (array) $far_keys as $key)
        {
            $query->values(array($foreign_key, $key));
        }

        $query->execute($this->_db);

        return $this;
    }
 

Итого: то, что вам нужно, будет выглядеть примерно так:
Код:
public function action_add()
{
    $obj  = ORM::factory('video');

    if ($this->request->method() == HTTP_Request::POST)
    {
        $obj->values($_POST);

        try
        
{
            $cids = $this->request->post('cids');
            $obj->save();
            $obj->add('categories', $cids);

            $this->request->redirect('admin/news');
        }
        catch (ORM_Validation_Exception $e)
        {
            $errors = $e->errors('validation');
        }
    }

    $content = View::factory('index/video/v_video_add');
    // ну и там что нужно
}
 
И таблицу `categories` сделать через parent_id
Итого 3 таблицы, много-ко-многим и мало кода)

з.ы. (к тому, "Что тут можно улучшить")
$data = Arr::extract($_POST, array('name', 'original_name', 'year', 'time', 'description', 'image', 'url')), а потом $video->values($data); можно не писать, а сделать проще
$video->values($_POST)
или
$video->values($_POST, array('name', 'original_name', 'year', 'time', 'description', 'image', 'url'))

Во view
View::factory('index/video/v_video_add')->set('obj', $obj);
В шаблоне к переменной обращаться:
$obj->name

Гы) Мне бы так кто рассказывал, когда я сам это все ковырял))

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 июл 2012, 01:12 
Не в сети
Бывалый

Зарегистрирован: 11 июл 2012, 00:30
Сообщения: 31
AmberLEX писал(а):
Цитата:
У меня на данном этапе связи нет, т.к. считаю что здесь она не нужна, не вижу смысла, а при выборке буду использовать многие-ко-многим.
Я не очень понимаю эту фразу и какой вы там смысл видите или не видите.
Есть стандартная задача (у вас как я понимаю она стандартная) - есть стандартное решение. У kohana есть средства для ее решения. А какой велосипед вы там строите я примерно догадываюсь, но он не нужен скорее всего.
У вас есть категории, есть то что в них добавляется - пока все.
Если сделать многие-ко-многим, нужна промежуточная таблица. (постом выше cat2art)
Потом при добавлении чего-то в категорию, вы добавляете саму запись в одну таблицу и запись о связи в промежуточную.
Выглядит это примерно так:
Код:
    $obj->save();
    $obj->add('categories', $cids); 
где $cids - массив id-шников выбранных категорий
И все.
Метод add(), который это делает смотрим в модуле ORM. Там уже есть цикл с $query->values, который строит запрос и потом выполняется 1 раз: $query->execute($this->_db);
Код:
    /**
     * Adds a new relationship to between this model and another.
     *
     *     // Add the login role using a model instance
     *     $model->add('roles', ORM::factory('role', array('name' => 'login')));
     *     // Add the login role if you know the roles.id is 5
     *     $model->add('roles', 5);
     *     // Add multiple roles (for example, from checkboxes on a form)
     *     $model->add('roles', array(1, 2, 3, 4));
     *
     * @param  string  $alias    Alias of the has_many "through" relationship
     * @param  mixed   $far_keys Related model, primary key, or an array of primary keys
     * @return ORM
     */
    public function add($alias, $far_keys)
    {
        $far_keys = ($far_keys instanceof ORM) ? $far_keys->pk() : $far_keys;

        $columns = array($this->_has_many[$alias]['foreign_key'], $this->_has_many[$alias]['far_key']);
        $foreign_key = $this->pk();

        $query = DB::insert($this->_has_many[$alias]['through'], $columns);

        foreach ( (array) $far_keys as $key)
        {
            $query->values(array($foreign_key, $key));
        }

        $query->execute($this->_db);

        return $this;
    }
 

Итого: то, что вам нужно, будет выглядеть примерно так:
Код:
public function action_add()
{
    $obj  = ORM::factory('video');

    if ($this->request->method() == HTTP_Request::POST)
    {
        $obj->values($_POST);

        try
        
{
            $cids = $this->request->post('cids');
            $obj->save();
            $obj->add('categories', $cids);

            $this->request->redirect('admin/news');
        }
        catch (ORM_Validation_Exception $e)
        {
            $errors = $e->errors('validation');
        }
    }

    $content = View::factory('index/video/v_video_add');
    // ну и там что нужно
}
 
И таблицу `categories` сделать через parent_id
Итого 3 таблицы, много-ко-многим и мало кода)

з.ы. (к тому, "Что тут можно улучшить")
$data = Arr::extract($_POST, array('name', 'original_name', 'year', 'time', 'description', 'image', 'url')), а потом $video->values($data); можно не писать, а сделать проще
$video->values($_POST)
или
$video->values($_POST, array('name', 'original_name', 'year', 'time', 'description', 'image', 'url'))

Во view
View::factory('index/video/v_video_add')->set('obj', $obj);
В шаблоне к переменной обращаться:
$obj->name

Гы) Мне бы так кто рассказывал, когда я сам это все ковырял))

Ты не знаешь моей структуры БД...
categories - Категории
incats - Подкатегории, имеется ссылка на категории(связь много ко одному)
incats_video - Промежуточная таблица, в которой хранить храниться жанр к соответствующему фильму
video - Фильмы
Принцип работы при добавлении в БД такой: вся инфа идет в таблицу видео, а подкатегории в таблицу incats_video. Связи между ними нету вроде у меня. А если бы существовала, то Один ко многим !!!Одному фильму может принадлежать множество подкатегорий,но не наоборот. Почему ты решил что Многие ко многим, как пришел к такому выводу ? обьясни пожалуйста , хочется самому разобраться


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

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


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

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


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

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