Yii Framework Forum: Передача Value Селектора В View - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Передача Value Селектора В View Помогите, пожалуйста! Rate Topic: -----

#1 User is offline   maximatorrus 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 21-January 14

Posted 21 January 2014 - 01:04 AM

Всем добрый день! В ПХП новичок, 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)));

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

#2 User is offline   ORey 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 1,689
  • Joined: 20-April 09
  • Location:Moscow, Russia

Posted 21 January 2014 - 02:37 AM

View Postmaximatorrus, on 21 January 2014 - 01:04 AM, said:

Как я понимаю, вся загвоздка кроется в строчке 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].

Третий вариант - с жаваскриптом, но он тут нафиг не нужен, полагаю.
God is real unless declared as integer
0

#3 User is offline   maximatorrus 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 21-January 14

Posted 21 January 2014 - 02:40 AM

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


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

#4 User is offline   maximatorrus 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 21-January 14

Posted 21 January 2014 - 02:41 AM

View PostORey, on 21 January 2014 - 02:37 AM, said:

Верно.

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

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

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


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


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

#5 User is offline   ORey 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 1,689
  • Joined: 20-April 09
  • Location:Moscow, Russia

Posted 21 January 2014 - 02:44 AM

Да, типа заменить
CHtml::form('','POST');
на
CHtml::form('СЮДА ЭКШН','GET');
(сверьтесь с докой на всякий случай)

А в submitbutton можно смело стереть все параметры, поскольку за экшн теперь форма отвечает.
God is real unless declared as integer
0

#6 User is offline   ORey 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 1,689
  • Joined: 20-April 09
  • Location:Moscow, Russia

Posted 21 January 2014 - 02:46 AM

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

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

http://www.yiiframew...tml#form-detail
God is real unless declared as integer
0

#7 User is offline   ORey 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 1,689
  • Joined: 20-April 09
  • Location:Moscow, Russia

Posted 21 January 2014 - 02:49 AM

Заодно рекомендую api reference: http://www.yiiframework.com/doc/api/
Феноменально удобная штука, включающая поиск по конкретным классам/методам и показ соответствующих кусков кода.
God is real unless declared as integer
0

#8 User is offline   ineersa 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 270
  • Joined: 15-April 13
  • Location:Ukraine

Posted 21 January 2014 - 03:59 AM

//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, а если нет то не нужен.
Валидации в форме можно убрать, это просто покаазать что есть в ней.
0

#9 User is offline   maximatorrus 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 21-January 14

Posted 19 February 2014 - 10:04 PM

View Postineersa, on 21 January 2014 - 03:59 AM, said:

//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 без нажатия на кнопку "Выбрать"?! Простым жаваскриптом
0

#10 User is offline   maximatorrus 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 21-January 14

Posted 19 February 2014 - 11:17 PM

Сделал :)
<script type="text/javascript">
   $(function(){$('#my_dropdown').change(function(){window.location = '/yii/maximatorrus//index.php/lpu/view/' + $(this).val();})})
</script>

0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users