2012-04-24 2 views
1

Как передать значение из внешнего действия в Yii в его родительский контроллер?Возвращаемое значение из внешнего действия в Yii

, например: Внешнее действие выглядит следующим образом:

<?php 
class uploadAction extends CAction 
{ 
/** 
* Runs the action. 
* This method is invoked by the controller owning this action. 
*/ 
public function run() 
{ 
    ..... 

     $fileName=$result['filename'];//GETTING FILE NAME 

     $this->controller->image = $fileName; // this line does not work!! 

} 
    } 

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

Обновление: Я использую расширение для загрузки файла. eajaxupload.

Существует длинная форма .. есть много полей, один из них - изображение. Я хочу загрузить это изображение Ajax перед отправкой всей формы. Конечно, после того, как пользователь нажмет кнопку «Создать», контроллер должен взять все поля и имя изображения для хранения в db. мнение ..

<div class="elem"> 
      <?php echo $form->labelEx($model,'username'); ?> 
      <?php echo $form->textField($model,'username',array('class'=>'inputbox grid-11-12','maxlength'=>45)); ?> 
      <?php echo $form->error($model,'username'); ?> 
     </div> 

     <div class="elem"> 
      <?php echo $form->labelEx($model,'password1'); ?> 
      <?php echo $form->passwordField($model,'password1',array('class'=>'inputbox grid-11-12')); ?> 
      <?php echo $form->error($model,'password1'); ?> 
     </div> 

     <div class="elem"> 
      <?php echo $form->labelEx($model,'password2'); ?> 
      <?php echo $form->passwordField($model,'password2',array('class'=>'inputbox grid-11-12')); ?> 
      <?php echo $form->error($model,'password2'); ?> 
     </div> 

     <div class="elem"> 
      <?php echo $form->labelEx($model,'email'); ?> 
      <?php echo $form->textField($model,'email',array('class'=>'inputbox grid-11-12','maxlength'=>45)); ?> 
      <?php echo $form->error($model,'email'); ?> 
     </div> 

     <div class="elem"> 
      <label for="content">User Image:</label> 
     <?php $this->widget('ext.EAjaxUpload.EAjaxUpload', 
      array(
      'id'=>'uploadFile', 
      'config'=>array(
        'action'=>Yii::app()->request->baseUrl .'/backend.php/user/upload', 
        'allowedExtensions'=>array("jpg"),//array("jpg","jpeg","gif","exe","mov" and etc... 
        'sizeLimit'=>3*1024*1024,// maximum file size in bytes 
        'minSizeLimit'=>50*1024,// minimum file size in bytes 
        'multiple'=>false, 
        //'onComplete'=>Yii::app()->request->baseUrl .'/backend.php/user/saveStuff/?fn='. "js:function(id, fileName, responseJSON){ alert(fileName); }", 
        //'messages'=>array(
        //     'typeError'=>"{file} has invalid extension. Only {extensions} are allowed.", 
        //     'sizeError'=>"{file} is too large, maximum file size is {sizeLimit}.", 
        //     'minSizeError'=>"{file} is too small, minimum file size is {minSizeLimit}.", 
        //     'emptyError'=>"{file} is empty, please select files again without it.", 
        //     'onLeave'=>"The files are being uploaded, if you leave now the upload will be cancelled." 
        //    ), 
        //'showMessage'=>"js:function(message){ alert(message); }" 
     ) 
      )); ?> 
     </div> 

Это контроллер ..

<?php 

    class UserController extends Controller 
    { 
/** 
* @var string the default layout for the views. Defaults to '//layouts/column2',  meaning 
* using two-column layout. See 'protected/views/layouts/column2.php'. 
*/ 
public $layout='//layouts/column1'; 
public $image; 

....... 


public function actions() 
{ 
    return array(
     'upload' => array(
     'class' => 'ext.actions.uploadAction', 
     ), 
     ); 
} 

........ 


public function actionCreate() 
{ 
    $model=new User; 
    $profile=new UserProfile; 
    // Uncomment the following line if AJAX validation is needed 
    // $this->performAjaxValidation($model); 

    if(isset($_POST['User'])) 
    { 
     $model->attributes=$_POST['User']; 
     $profile->attributes=$_POST['UserProfile']; 

     if(!$this->saveUser($model, $profile)) 
      Yii::app()->user->setFlash('error', 'Not Saved :)!'); 

    } 

    $this->render('create',array(
     'model'=>$model, 
     'profile'=>$profile, 
    )); 
} 

public function saveUser($model, $profile) 
{ 
    $userValid = $model->validate(); 
    $profileValid = $profile->validate(); 
    $valid = $userValid && $profileValid; 
    if($valid) 
    { 
     $model->save(false); 
     $profile->user_id = $model->id; 
     $profile->image = !is_null($this->image)? $this->image : null; // name of image file which uploaded 
     $profile->save(false); 

     Yii::app()->user->setFlash('success', 'Saved :)!'); 
     $this->redirect(array('index')); 
     return true; 
    } 
    return false; 
} 

}

внешнее воздействие в деталях является:

<?php 
class uploadAction extends CAction 
{ 
/** 
* Runs the action. 
* This method is invoked by the controller owning this action. 
*/ 
public function run() 
{ 
    Yii::import("ext.EAjaxUpload.qqFileUploader"); 
     // make the directory to store the pic: 
     $folder=Yii::getPathOfAlias('webroot') .'/images/' . $this->controller->id . '/';// folder for uploaded files 
     if(!is_dir($folder)) 
     { 
      mkdir($folder); 
      chmod($folder, 0755); 
      // the default implementation makes it under 777 permission, which you could possibly change 
      //recursively before deployment, but here's less of a headache in case you don't 
     } 

     $allowedExtensions = array("jpg");//array("jpg","jpeg","gif","exe","mov" and etc... 
     $sizeLimit = 10 * 1024 * 1024;// maximum file size in bytes 
     $uploader = new qqFileUploader($allowedExtensions, $sizeLimit); 
     $result = $uploader->handleUpload($folder); 
     $return = htmlspecialchars(json_encode($result), ENT_NOQUOTES); 

     $fileSize=filesize($folder.$result['filename']);//GETTING FILE SIZE 
     $fileName=$result['filename'];//GETTING FILE NAME 

     $this->controller->image = $fileName; // ?????? 

     echo $return;// it's array 



} 
} 

ответ

0

сделать это:

$this->controller->image = $fileName; // this line does not work!! 
$this->controller->renderText($this->controller->image); 

Уверен, это отобразит $ fileName.

Где вы пытаетесь получить доступ к свойству изображения контроллеров?

Значения не сохраняются между запросами.

+0

Я пытаюсь загрузить изображение с помощью этого внешнего действия, а затем взять имя изображения, которое было закачанный сохранить в базе данных в поле имя_образа. Это $ filename я должен получить его значение внутри контроллера, где у меня есть определенная функция для сохранения в моем db. in My controller У меня есть переменная public, называемая $ image .. Надеюсь, это достаточно ясно. – Mars

+0

Возможно, вам стоит скорее вызвать функцию в контроллере '$ this-> controller-> saveStuff ($ fileName);' или вы можете реализовать метод 'afterAction' в своем контроллере.Вероятно, логика не должна быть в контроллере, а в модели (google больше о тонком контроллере-толстой модели) –

+0

Я пробовал все ваши предложения без эффекта! Я так заинтересован знать, где значение летает :) BTW, это действие делает загрузку Ajax .. Я не знаю, связано ли это с проблемой! – Mars

0

Я сделал что-то подобное этому, используя обратный вызов.

Так что в моих действиях контроллера() конфигурации У меня есть строка:

'onSuccessCallback' => 'myCallback' 

В моем классе действий, в конце пробега() У меня есть:

call_user_func(array($this->getController(),$this->onSuccessCallback), $fileName); 

В контроллере I есть

function myCallback($fileName) 
{ 
this->image = $fileName; 
} 

можно затем получить доступ к свойству из контроллера с помощью

$ this-> изображение

Смежные вопросы