Помогите чайнику с БД

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
fallenangeldead
Сообщения: 79
Зарегистрирован: 2014.12.16, 10:43

Помогите чайнику с БД

Сообщение fallenangeldead »

Существует html форма, с помощью быдлокода наподобие "

Код: Выделить всё

<label>Страна:</label>
                                <?php  $countries =  mysql_query("SELECT * FROM tbl_country;") or die(mysql_error());?>
                                <select data-placeholder="Выберите страну..."  name="country"  class="select">
                                    <option value=""></option>
                                    <?php //while ($rows = mysql_fetch_assoc($countries)){?>
                                        <option value="<?php echo $rows['id_country'];?>"><?php echo $rows['title'];?></option>

                                    <?php //} ?>
" я обращался к своей базе данных. В общем-то всё работало, и всё всех устраивало, но мне захотелось переделать проект на yii-вский лад, и столкнулся с рядом проблем. Несмотря на прочтенные руководства,API, создание блога и прочего, так и не понял простой вещи: Как же прицепить готовую базу данных к проекту?
Вроде как надо создать модель... Создал модель:

Код: Выделить всё

<?php
//namespace app\testdrive\models;
//use Yii;
//use yii\db\ActiveRecord;

class Сountry extends  CActiveRecord
{
    public $title = 'Country';
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
    public function tableName()
    {
        return 'country';
    }
    public function primaryKey()
    {
        return 'id';
    }


}
и попробовал вызвать сатану так:

Код: Выделить всё

 <!--Dropdown with search-->
                                <label>Страна:</label>
                                <?php  $country =  Country::model()->find($countryID,$condition,$params) or die(mysql_error());?>
                                <select data-placeholder="Выберите страну..."  name="country"  class="select">
                                    <option value=""></option>
                                    <?php //while $rows = mysql_fetch_assoc($country)){?>
                                        <option value="<?php echo $rows['id_country'];?>"><?php echo $rows['title'];?></option>

                                    <?php// } ?>

На что мне Opera сказала решительное
Fatal error: Class 'Country' not found in C:\xampp\htdocs\666\666\testdrive\protected\views\site\index.php on line 197
Почесав репу, я понял, что для записи\чтения данных в БД нужно создать action, controller и, возможно, добавить что-то в конфиги... Но только вот что? И как это сделать?
fallenangeldead
Сообщения: 79
Зарегистрирован: 2014.12.16, 10:43

Re: Помогите чайнику с БД

Сообщение fallenangeldead »

Тык-с, осознав свою неполноценность, я воспользовался gii, создав из уже существующей базы данных модели и контроллеры...
Теперь же мне надо сделать выпадающий список, но - что писать вместо того быдлокода? Что-то типа
<div class="formRow searchDrop">
<!--Dropdown with search-->
<label>Страна:</label>
<?php $country = Country::model()->findall('id_country') or die(mysql_error());?>
<select data-placeholder="Выберите страну..." name="country" class="select">
<option value=""></option>
<?php// while ($rows = mysql_fetch_assoc($country)){?>
<option value="<?php //echo $rows['id_country'];?>"><?php// echo $rows['title'];?></option>

<?php// } ?>
Но он выдаст ошибку в mysql_fetch_assoc...
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Помогите чайнику с БД

Сообщение anton44eg »

пройдите сначала руководство по созданию блога
Аватара пользователя
ninzzo
Сообщения: 348
Зарегистрирован: 2014.04.25, 07:29

Re: Помогите чайнику с БД

Сообщение ninzzo »

уж слишком простые вопросы вы спрашиваете. Посмотрите видео уроки. Основы какие то.

Типа вот https://www.youtube.com/watch?v=qUVmT00CICA
Теперь же мне надо сделать выпадающий список, но - что писать вместо того быдлокода? Что-то типа

Код: Выделить всё

//формируем массив из бызы типа '4'=>'Киев'

$v = Country::model()->findall();
foreach($v as $one){
$name_vac[$one->id]=$one->name;
}

//вставляем в выпадающий список.
echo $form->dropdownlist($model,'country',$name_vac);

Вот так.
fallenangeldead
Сообщения: 79
Зарегистрирован: 2014.12.16, 10:43

Re: Помогите чайнику с БД

Сообщение fallenangeldead »

Да смотрел уже... И его в том числе. Мне больше не знания логики процессов не хватает, а хорошей рнр базы кроме прочего, поэтому довольно тяжело видеоуроки воспринимать, что называется, без копипаста. Собсно, простой проект этот мне самому захотелось перенести на yii, что бы разобраться хорошенько...
Но за идею спасибо) Попробую сейчас...
fallenangeldead
Сообщения: 79
Зарегистрирован: 2014.12.16, 10:43

Re: Помогите чайнику с БД

Сообщение fallenangeldead »

ninzzo писал(а):уж слишком простые вопросы вы спрашиваете. Посмотрите видео уроки. Основы какие то.

Типа вот https://www.youtube.com/watch?v=qUVmT00CICA
Теперь же мне надо сделать выпадающий список, но - что писать вместо того быдлокода? Что-то типа

Код: Выделить всё

//формируем массив из бызы типа '4'=>'Киев'

$v = Country::model()->findall();
foreach($v as $one){
$name_vac[$one->id]=$one->name;
}

//вставляем в выпадающий список.
echo $form->dropdownlist($model,'country',$name_vac);

Вот так.
Как бы всё работает, да всё равно не работает-_-
Этот код(который вы написали), немножко помучавшись, нужно поместить во views/country/index.php как я понимаю.
Но как отобразить эту, нужную мне вьюшку, в моем главном site/inxex.php? Эх... Чувствую себя чайником XD

А что вы имели ввиду под $form?

Undefined variable: model
Вот к этому я пришел-_-
Аватара пользователя
ninzzo
Сообщения: 348
Зарегистрирован: 2014.04.25, 07:29

Re: Помогите чайнику с БД

Сообщение ninzzo »

ну вот же стандарный пример из CRUD:

Код: Выделить всё

//контроллер Worker (у вас будет свой, но все остальное аналогично)
public function actionCreate()
    {
        $model=new Worker;

            if (isset($_POST['Worker'])) {
            $model->attributes=$_POST['Worker'];
            if ($model->save()) {
                $this->redirect(array('admin'));
            }
        }

        $this->render('create',array( //create это create.php в вашем варианте будет index.php или где там лежит форма ? 
            'model'=>$model,
        ));
    } 
Теперь в моем /views/worker/create.php
это моя вьюшка которую вызывает контролер когда я захожу в /worker/create

Код: Выделить всё

<div class="form">

    <?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array(
    'id'=>'worker-form',
    'enableAjaxValidation'=>false,
)); ?>

$v = Country::model()->findall();
foreach($v as $one){
$name_vac[$one->id]=$one->name;
}
......
//вставляем в выпадающий список.
<?php echo $form->dropdownlist($model,'country',$name_vac); ?>
........
 <?php $this->endWidget(); ?>

Стандартный CRUD
fallenangeldead
Сообщения: 79
Зарегистрирован: 2014.12.16, 10:43

Re: Помогите чайнику с БД

Сообщение fallenangeldead »

ninzzo писал(а):ну вот же стандарный пример из CRUD:

Код: Выделить всё

//контроллер Worker (у вас будет свой, но все остальное аналогично)
public function actionCreate()
    {
        $model=new Worker;

            if (isset($_POST['Worker'])) {
            $model->attributes=$_POST['Worker'];
            if ($model->save()) {
                $this->redirect(array('admin'));
            }
        }

        $this->render('create',array( //create это create.php в вашем варианте будет index.php или где там лежит форма ? 
            'model'=>$model,
        ));
    } 
Теперь в моем /views/worker/create.php
это моя вьюшка которую вызывает контролер когда я захожу в /worker/create

Код: Выделить всё

<div class="form">

    <?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array(
    'id'=>'worker-form',
    'enableAjaxValidation'=>false,
)); ?>

$v = Country::model()->findall();
foreach($v as $one){
$name_vac[$one->id]=$one->name;
}
......
//вставляем в выпадающий список.
<?php echo $form->dropdownlist($model,'country',$name_vac); ?>
........
 <?php $this->endWidget(); ?>

Стандартный CRUD

Хммм, у меня же стандартный CRUD сгенерировал вот это во вьюшке create.php:

Код: Выделить всё

<?php
/* @var $this CountryController */
/* @var $model Country */


$this->breadcrumbs=array(
    'Countries'=>array('index'),
    'Create',
);

$this->menu=array(
    array('label'=>'List Country', 'url'=>array('index')),
    array('label'=>'Manage Country', 'url'=>array('admin')),
);
?>

<h1>Create Country</h1>

<?php $this->renderPartial('_form', array('model'=>$model)); ?>

fallenangeldead
Сообщения: 79
Зарегистрирован: 2014.12.16, 10:43

Re: Помогите чайнику с БД

Сообщение fallenangeldead »

Fuck я снова делаю всё как чайнег. Create Form создает точно такой же код, как у вас....
fallenangeldead
Сообщения: 79
Зарегистрирован: 2014.12.16, 10:43

Re: Помогите чайнику с БД

Сообщение fallenangeldead »

Окей... От ошибок я избавился, теперь по идее должны отображаться элементы базы данных в выпадающем списке, однако выпадает пустое пространство... Это связано с тем, что у меня в старом site\index.php осталось лежать следующее?

Код: Выделить всё

 <div class="formRow searchDrop">
                                <!--Dropdown with search-->
                                <label>Страна:</label>

                                <select data-placeholder="Выберите страну..."  name="country"  class="select">
                                    <option value=""></option>
                                        <option value=""><?php  ?></option>
                                </select>
                            </div>
fallenangeldead
Сообщения: 79
Зарегистрирован: 2014.12.16, 10:43

Re: Помогите чайнику с БД

Сообщение fallenangeldead »

Тык-с... Ваш верный чайник допер, что надо в основном site\index.php каким-то образом вызвать эту самую вьюшку, или скорее метод create, удалив все старое/ненужное...
Аватара пользователя
ninzzo
Сообщения: 348
Зарегистрирован: 2014.04.25, 07:29

Re: Помогите чайнику с БД

Сообщение ninzzo »

Напише просто:

Код: Выделить всё

<?php echo CHtml::dropDownList('listname', $select, 
              array('M' => 'Male', 'F' => 'Female')); 
как видно есть массив array('M' => 'Male', 'F' => 'Female')

это массив можно сформировать из базы

Код: Выделить всё

$v = Country::model()->findall();
foreach($v as $one){
$name_vac[$one->id]=$one->name;
} 
Все. Ничего лишнего. теперь можно вставлять в любое место на сайте.

А с render вам нужно разобраться отдельно.
fallenangeldead
Сообщения: 79
Зарегистрирован: 2014.12.16, 10:43

Re: Помогите чайнику с БД

Сообщение fallenangeldead »

ninzzo писал(а):Напише просто:

Код: Выделить всё

<?php echo CHtml::dropDownList('listname', $select, 
              array('M' => 'Male', 'F' => 'Female'));
как видно есть массив array('M' => 'Male', 'F' => 'Female')

это массив можно сформировать из базы

Код: Выделить всё

$v = Country::model()->findall();
foreach($v as $one){
$name_vac[$one->id]=$one->name;
}
Все. Ничего лишнего. теперь можно вставлять в любое место на сайте.

А с render вам нужно разобраться отдельно.
Спасибо, с утра, на свежую голову, вроде доперло) Теперь буду думать с записью в БД из input...
fallenangeldead
Сообщения: 79
Зарегистрирован: 2014.12.16, 10:43

Re: Помогите чайнику с БД

Сообщение fallenangeldead »

Пытаюсь сделать запись в БД следующим способом:

Код: Выделить всё

<form>
                    <!-- Textboxes-->
                    <div class="fluid">

                        <div class="formRow noBorderB">
                            <label>Страна: </label>
                        <?php
                        $v = Country::model()->findall();
                        foreach($v as $one) {
                            $name_vac[$one->id_country] = $one->title;
                        }
                        $title = new Country('title');
                       echo $title=CHtml::activeTextField(Country::model(),'title',$name_vac);
                        ?>
                        <?php

                        ?>
                    </div>
                        </div>

                        <!-- Sidebar buttons -->
                        <div class="fluid sideWidget">
                            <div class="grid6"><?php
                            echo CHtml::resetButton('Cansel',$name_vac);
                                ?></div>
                            <div class="grid6"><?php echo CHtml::submitButton(Country::model()->isNewRecord ? 'Create':'Save');

                                ?></div>
                        </div>
                    </form>
Но после того, как ввожу в поле текст, и жму кнопку Save, не происходит вообще ничего... БД как была, так и остается без изменений... Странно....
fallenangeldead
Сообщения: 79
Зарегистрирован: 2014.12.16, 10:43

Re: Помогите чайнику с БД

Сообщение fallenangeldead »

Немного поправил, все равно не получается...

Код: Выделить всё

 <form method="post">
                        <!-- Textboxes-->
                        <div class="fluid">

                            <div class="formRow noBorderB">
                                <label>Страна: </label>
                        <?php
                        $model=new Country();
                        $form=$this->beginWidget('CActiveForm', array(
                            'id'=>'country-form',
                            // Please note: When you enable ajax validation, make sure the corresponding
                            // controller action is handling ajax validation correctly.
                            // There is a call to performAjaxValidation() commented in generated controller code.
                            // See class documentation of CActiveForm for details on this.
                            'enableAjaxValidation'=>false,
                        )); ?>

                        <?php echo $form->errorSummary($model); ?>

                        <div class="row">
                            <?php echo $form->textField($model,'title',array('size'=>45,'maxlength'=>45)); ?>
                            <?php echo $form->error($model,'title'); ?>
                        </div>

                        <div class="row buttons">
                            <?php echo CHtml::submitButton($model->isNewRecord ? 'Save' : 'Save'); ?>
                        </div>

                        <?php $this->endWidget(); ?>

                    </div><!-- form -->
                            </div>
                        </form>
Аватара пользователя
ninzzo
Сообщения: 348
Зарегистрирован: 2014.04.25, 07:29

Re: Помогите чайнику с БД

Сообщение ninzzo »

В контроллере в методе actioncreate

перед
$model->save нужно добавить $model->city = $_POST['ВАШЕ ИМЯ ПОЛЯ'];
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Помогите чайнику с БД

Сообщение Insolita »

что за тренд присваивать напрямую из глобальной переменной...

Код: Выделить всё

if(isset($_POST['field'])){
   $model->field=$_POST['field'];
}
vs 
$model->field=Yii::app()->request->getPost('field','default value');
 
Последний раз редактировалось Insolita 2014.12.18, 20:38, всего редактировалось 1 раз.
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Помогите чайнику с БД

Сообщение chungachguk »

Insolita писал(а):что за тренд присваивать напрямую из глобальной переменной...
Что поделать? этому обучало официальное руководство.
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Помогите чайнику с БД

Сообщение anton44eg »

chungachguk писал(а):
Insolita писал(а):что за тренд присваивать напрямую из глобальной переменной...
Что поделать? этому обучало официальное руководство.
там к $model->attributes, в этом случаем присваиваются только валидируемые поля
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Помогите чайнику с БД

Сообщение chungachguk »

anton44eg писал(а):
chungachguk писал(а):
Insolita писал(а):что за тренд присваивать напрямую из глобальной переменной...
Что поделать? этому обучало официальное руководство.
там к $model->attributes, в этом случаем присваиваются только валидируемые поля
Да не суть, главное что идёт обращение к $_POST, а не к request->getPost
Ответить