@asder117

Как организовать Табличный ввод данных в YII?

Уважаемые, доброго времени суток! Писал ранее но ответ не нашел до сих пор.
У меня на странице есть таблица. она идет из базы. Мне ее надо раз в неделю обновлять. как можно к примеру в админке загрузить ее и вт абличной форме ( как эксель или phpmyadmin) отредактировать. потом по кнопке ок записать енту таблу в базу. спасибо
сделал так
во вьюхе
<div class="about-infos">
<h2>  Укажите цены </h2>
</div>
<div class="form">

<?php echo CHtml::beginForm(); ?>
<table>
<tr><th>Наименование</th><th>Цена мин.</th><th>Цена макс.</th></tr>
<?php foreach($items as $i=>$item): ?>
<tr>
<td width="300px" valign="top"><?php echo CHtml::activeTextField($item,"[$i]name"); ?></td>
<td><?php echo CHtml::activeTextField($item,"[$i]price_min"); ?></td>
<td><?php echo CHtml::activeTextField($item,"[$i]price_max"); ?></td>
<!--<td><?php echo CHtml::activeTextArea($item,"[$i]id"); ?></td>-->
</tr>
<?php endforeach; ?>
</table>
 
<?php echo CHtml::submitButton('Сохранить'); ?>
<?php echo CHtml::endForm(); ?>
</div><!-- form -->

в контроллере

public function actionTablem()
{
   //$model = new monitoring;
	$items=$this->getItemsToUpdate(); // очевидно тут формируем массив из объектов по правилам известным вам (что-то из БД, что-то новое)
    if(isset($_POST['Item']))
    {
        $valid=true;
        foreach($items as $i=>$item) // перебираем объекты, обновляя их данными из $_POST
        {
            if(isset($_POST['Item'][$i]))
                $item->attributes=$_POST['Item'][$i];
            $valid=$item->validate() && $valid;
			if($items->getErrors()) {
var_dump($items->getErrors());
die();
}
        }
        if($valid) 
		{
		foreach($items as $item) {
		//$item->attributes=$_POST['item'];
		
         $item->save();
}
  //$this->redirect(array());
		//monitoring::model()-> update();	
		}
	
			// если все модели валидны, сейвим их
            // ...do something here
    }
    // displays the view to collect tabular input
    $this->render('Tablem',array('items'=>$items));
}

модель

?php

/**
 * This is the model class for table "{{monitoring}}".
 *
 * The followings are the available columns in table '{{monitoring}}':
 * @property integer $id
 * @property string $name
 * @property string $price_min
 * @property string $price_max
 */
class Monitoring extends CActiveRecord
{
    /**
     * @return string the associated database table name
     */
    public function tableName()
    {
        return '{{monitoring}}';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules()
    {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            array('id, name, price_min, price_max', 'required'),
            array('id', 'numerical', 'integerOnly'=>true),
            array('name, price_min, price_max', 'length', 'max'=>255),
            // The following rule is used by search().
            // @todo Please remove those attributes that should not be searched.
            array('id, name, price_min, price_max', 'safe', 'on'=>'search'),
        );
    }

    /**
     * @return array relational rules.
     */
    public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
        );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return array(
            'id' => 'ID',
            'name' => 'Name',
            'price_min' => 'Price Min',
            'price_max' => 'Price Max',
        );
    }

    /**
     * Retrieves a list of models based on the current search/filter conditions.
     *
     * Typical usecase:
     * - Initialize the model fields with values from filter form.
     * - Execute this method to get CActiveDataProvider instance which will filter
     * models according to data in model fields.
     * - Pass data provider to CGridView, CListView or any similar widget.
     *
     * @return CActiveDataProvider the data provider that can return the models
     * based on the search/filter conditions.
     */
    public function search()
    {
        // @todo Please modify the following code to remove attributes that should not be searched.

        $criteria=new CDbCriteria;

        $criteria->compare('id',$this->id);
        $criteria->compare('name',$this->name,true);
        $criteria->compare('price_min',$this->price_min,true);
        $criteria->compare('price_max',$this->price_max,true);

        return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
        ));
    }

    /**
     * Returns the static model of the specified AR class.
     * Please note that you should have this exact method in all your CActiveRecord descendants!
     * @param string $className active record class name.
     * @return Monitoring the static model class
     */
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
}


Ну не хочет она в базе сохранять. Подскажите плз. Заранее спасибо
  • Вопрос задан
  • 810 просмотров
Решения вопроса 1
@Arik
1. Получаем список моделей
2. Во вьюхе выводим таблицу с полями, в качестве ключа items[$modelId]['fieldName'] -> items[12][price_min]
3. В action save:
3.1. Находим все id моделей которые показывали array_keys($_POST['items'])
3.2. Находом все модели
3.3. Проходим циклом по массиву/коллекции с моделями
3.4. По ключу находим соответ данные для обновления $_POST['items'][$model->id]
3.5. Обновляем и сохраняем модель
//
чем больше показываете таблицу тем больше будет нагрузка n-запросов update, где n - кол-во items. Возможно легче все на аякс посадить. Но тут уже дело оптимизации всего. Так как как update массово сделать я не знаю
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы