Как сделать удаление на одной странице для 2х разхных моделей

Здравствуйте,

Вчера пытался сделать удаление и обнаружил очень интересный факт.

в пишу контроллере:


	public function actionDelete()

	{

		if(Yii::app()->request->isPostRequest)

		{


			$this->loadmenu()->delete();

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

		}

		else

			throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');

	}


	public function loadmenu($id=null)

	{

		if($this->_model===null)

		{

			if($id!==null || isset($_GET['id']))

				$this->_model=menu::model()->findbyPk($id!==null ? $id : $_GET['id']);

			if($this->_model===null)

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

		}

		return $this->_model;

	}

Во View:


<?php echo CHtml::linkButton('Delete',array(

      	  'submit'=>'',

      	  'params'=>array('command'=>'delete','id'=>$model->id),

      	  'confirm'=>"Are you sure to delete #{$model->id}?")); ?>

Работает!,

Но стоит вместо "delete" написать например "del" - все, не работает.

тоесть если написать так в контроллере:

public function [b]actionDel/b

а в виде:

‘params’=>array(‘command’=>‘del’,‘id’=>$model->id),

то работать перестает, более того скажу больше.

Если в контроллере ваще удалить actionDelete

а в виде написать как было:

params’=>array(‘command’=>‘delete’,‘id’=>$model->id),

То все равно работает. удаляет (БЕЗ контроллера)

А зачем тогда контроллер?:)

Если так же вызывать не CHtml::linkButton, а просто через CHtml::link

То во первых - Контроллер нужен!

Во вторых - удаление работает со сменой названия Action, хоть "Горошком" назовите все равно удалит.

Вопрос:

Почему не работает через линкБатн?

Спасибо

По-моему, вы немножко запутались :)

В ‘submit’=>’’, указывается URL, куда будут отправлены данные (параметры, params). В данном случае это текущая страница (а значит, и текущий контроллер/экшен).

Если ссылка на удаление текущей модели находится на нескольких страницах, которые соответствуют разным экшенам, то нужно в каждом экшене писать что-то типа: if ($_POST[‘command’] == ‘delete’) $model->delete();

Короче говоря, params попадают в массив $_POST, и они никак не определяют, какой контроллер/экшен будет вызван.

Странный у вас код какой то для удаления, я такого еще не видел :)

Вы уверены что вообще нужный контроллер срабатывает

Может какой нибудь Демон за него работает)

подсказка:


    protected function processAdminCommand()

    {

        if(isset($_POST['command'], $_POST['id']) && $_POST['command']==='delete')

        {

            $this->loadmenu($_POST['id'])->delete();

            // reload the current page to avoid duplicated delete actions

            $this->refresh();

        }

    } 

есть такой код?

Да конечно там есть такой код :)

to Beginner

Раз уж пользуетесь генератором, то изучите код, который он производит досконально, чтобы не тратить зря время на эксперименты. Вся соль в processAdminCommand().

Ещё небольшое замечание. При генерации название модели лучше давать с большой буквы, чтобы имя класса и имя файла модели получались такими, как это принято.

Да я ж Бегиннер так что не судите строго, я половину не понимаю в документации даже как это использовать, вот тут с помощбю форума и экспериментов изучаю:)

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

Смотрите функцию actionAdmin(), первая же команда $this->processAdminCommand();

Кодом в представлении вы сабмитете форму на тот же адрес с какой вызываете т.е. на actionAdmin(). actionDelete() вообще в этом не участвует


<?php echo CHtml::linkButton('Delete',array(

          'submit'=>'',

          'params'=>array('command'=>'delete','id'=>$model->id),

          'confirm'=>"Are you sure to delete #{$model->id}?")); ?>