Передача Value Селектора В View

Всем добрый день! В ПХП новичок, yii изучаю второй день. Суть такова:

Есть таблица lpu, поля id, name, text. В контроллере с экшеном index нужно создать выпадающий список со значениями name из таблицы lpu. Плюс кнопка “Выбрать”-по нажатию на которую переходим на view&id=???. Собственно нужно перейти на страницу расширенного описания выбранного значения из выпадающего списка. У меня же id передается исключительно последний из таблички, всего один. что бы я ни выбирал из селектора, переходим на один и тот же id.

Привожу код контроллера


<meta charset="UTF-8">

<?php


class LpuController extends Controller

{

    

public function actionIndex()

    {

        $models = Lpu::model()->findAll(array('order'=>'name ASC'));

	$this->render('index', array('models'=>$models));


        

    

}

    public $layout='//layouts/column2';


    public function filters()

    {

        return array(

            'accessControl', // perform access control for CRUD operations

            'postOnly + delete', // we only allow deletion via POST request

        );

    }


    public function accessRules()

    {

        return array(

            array('allow',  // allow all users to perform 'index' and 'view' actions

                'actions'=>array('index','view'),

                'users'=>array('*'),

            ),

            array('allow', // allow authenticated user to perform 'create' and 'update' actions

                'actions'=>array('create','update'),

                'users'=>array('@'),

            ),

            array('allow', // allow admin user to perform 'admin' and 'delete' actions

                'actions'=>array('admin','delete'),

                'users'=>array('admin'),

            ),

            array('deny',  // deny all users

                'users'=>array('*'),

            ),

        );

    }


    public function actionView($id)

    {

        $this->render('view',array(

            'model'=>$this->loadModel($id),

        ));

    }


    public function actionCreate()

    {

        $model=new Lpu;


        // Uncomment the following line if AJAX validation is needed

        // $this->performAjaxValidation($model);


        if(isset($_POST['Lpu']))

        {

            $model->attributes=$_POST['Lpu'];

            if($model->save())

                $this->redirect(array('view','id'=>$model->id));

        }


        $this->render('create',array(

            'model'=>$model,

        ));

    }


    public function actionUpdate($id)

    {

        $model=$this->loadModel($id);


        // Uncomment the following line if AJAX validation is needed

        // $this->performAjaxValidation($model);


        if(isset($_POST['Lpu']))

        {

            $model->attributes=$_POST['Lpu'];

            if($model->save())

                $this->redirect(array('view','id'=>$model->id));

        }


        $this->render('update',array(

            'model'=>$model,

        ));

    }


    public function actionDelete($id)

    {

        $this->loadModel($id)->delete();


        // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser

        if(!isset($_GET['ajax']))

            $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));

    }


    public function actionAdmin()

    {

        $model=new Lpu('search');

        $model->unsetAttributes();  // clear any default values

        if(isset($_GET['Lpu']))

            $model->attributes=$_GET['Lpu'];


        $this->render('admin',array(

            'model'=>$model,

        ));

    }


    public function loadModel($id)

    {

        $model=Lpu::model()->findByPk($id);

        if($model===null)

            throw new CHttpException(404,'The requested page does not exist.');

        return $model;

    }


    protected function performAjaxValidation($model)

    {

        if(isset($_POST['ajax']) && $_POST['ajax']==='lpu-form')

        {

            echo CActiveForm::validate($model);

            Yii::app()->end();

        }

    }

}

И код view index.php


<?php

/* @var $this LpuController */


$this->breadcrumbs=array(

	'Выбор ЛПУ',

);

?>

	<h1><?php echo 'Выбор ЛПУ <br/>';?></h1>

<?php

echo '<pre>';

var_dump($_POST);

echo'</pre>';

    foreach($models as $model) {

      }




echo CHtml::form('','POST');

$a = CHtml::listData($models, 'id','name');

echo CHtml::dropDownList('drop','',$a);


echo CHtml::submitbutton('Выбрать', array('submit' => array('lpu/view','id'=>$model->id)));

echo CHtml::endForm();

    ?>



Как я понимаю, вся загвоздка кроется в строчке echo CHtml::submitbutton(‘Выбрать’, array(‘submit’ => array(‘lpu/view’,‘id’=>$model->id)));

Помогите, пожалуйста!!

Верно.

Как это делается обычно? обычно так: экшн формы указывает на lpu/view, а method равен GET. Таким образом сабмит формы приведет к переходу на url вида /lpu/view?Lpu[id]=…

То есть, Вам нужно просто указать два параметра у CHtml::form и разгрести гет-параметр во view.

Второй вариант: все то же самое, только при выводе dropDownList отдельно в параметрах указываем параметр name="id" (в документации гляньте, как параметры переопределяются). Это чуть получше, поскольку не придется разбирать кривой параметр Lpu[id].

Третий вариант - с жаваскриптом, но он тут нафиг не нужен, полагаю.

Вообще как бы в идеале жаваскрипт, но на второй день изучения фреймворка не стал с ним связываться, и сделал через кнопку, так пока проще, дальше конечно же жаваскрипт (при выборе элемента сразу переходим на вьюшку).

Вот только что в коде исправить при первом варианте? POST на GET?

Вообще как бы в идеале жаваскрипт, но на второй день изучения фреймворка не стал с ним связываться, и сделал через кнопку, так пока проще, дальше конечно же жаваскрипт (при выборе элемента сразу переходим на вьюшку).

Вот только что в коде исправить при первом варианте? POST на GET?

Да, типа заменить

CHtml::form(’’,‘POST’);

на

CHtml::form(‘СЮДА ЭКШН’,‘GET’);

(сверьтесь с докой на всякий случай)

А в submitbutton можно смело стереть все параметры, поскольку за экшн теперь форма отвечает.

Url для экшна, кстати, можно создать при помощи CHtml::normalizeUrl, передав туда array(‘lpu/view’), а можно и сразу прописать параметр в виде массива:

CHtml::form(array(‘lpu/view’), ‘get’);

http://www.yiiframework.com/doc/api/1.1/CHtml#form-detail

Заодно рекомендую api reference: http://www.yiiframework.com/doc/api/

Феноменально удобная штука, включающая поиск по конкретным классам/методам и показ соответствующих кусков кода.




//view

<?php $form=$this->beginWidget('CActiveForm', array(

    'id' => 'lpu-form',

    'enableClientValidation' => true,

    'enableAjaxValidation' => true,

    'clientOptions' => array(

         'validateOnSubmit' => true,

         'validateOnChange' => false,

    )));

    echo $form->dropDownList($model,"id",CHtml::listData($models,'id','name'),array());

    echo CHtml::submitbutton('Выбрать');

$this->endWidget(); ?>


//actionIndex

public function actionIndex()

{

    if($_POST["Lpu"]){

        $attr=$_POST["Lpu"];

        if (isset($attr["id"])&&$attr["id"]!=""){

            $this->redirect($this->createUrl("view",array("id"=>$attr["id"])));

        }

    }

    $models = Lpu::model()->findAll(array('order'=>'name ASC'));

    $this->render('index', array('models'=>$models));

}



Это еще 1 вариант, делать редирект в контроллере.

Если нужно без кнопки - тогда нужен js/ajax, а если нет то не нужен.

Валидации в форме можно убрать, это просто покаазать что есть в ней.

Как сделать переход в view без нажатия на кнопку "Выбрать"?! Простым жаваскриптом

Сделал :)


<script type="text/javascript">

   $(function(){$('#my_dropdown').change(function(){window.location = '/yii/maximatorrus//index.php/lpu/view/' + $(this).val();})})

</script>