2017-11-09 9 views
0

をクリックした後にゼロになる私のルートです:urlパラメータは、ここでボタン

'router' => array(
    'routes' => array(
     'upload' => array(
      'type' => 'segment', 
      'options' => array(
       'route' => '/products/upload[/:products]', 
       'defaults' => array(
        'controller' => 'Products\Controller\Upload', 
        'action'  => 'index' 
       ), 
      ), 
      'may_terminate' => true, 
      'child_routes' => array(
       'uploadsuccessful' => array(
        'type' => 'literal', 
        'options' => array(
         'route' => '/uploadsuccessful', 
         'defaults' => array(
          'controller' => 'Products\Controller\Upload', 
          'action'  => 'successful' 
         ), 
        ), 
       ), 
      ),  
     ), 
    ), 
); 

私は別の[/:products]パラメータを与える別のビュースクリプトからこのルートを複数回呼び出すしようとしています。

<a href="<?php echo $this->url('upload', array('products' =>'shoes')); ?>">Upload Shoes Product Image</a> 
<a href="<?php echo $this->url('upload', array('products' =>'trainers')); ?>">Upload Trainers Product Image</a> 
<a href="<?php echo $this->url('upload', array('products' =>'hats')); ?>">Upload Hat Product Image</a> 

ここは私のコントローラコードです。私は$fileManagerDirに指定された名前の別のフォルダを作ってみました各[/:products]パラメータについて:

<?php 

namespace Products\Controller; 
use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 
use Products\Form\UploadForm; 

class UploadController extends AbstractActionController 
{ 
    protected $_dir = null; 

    public function indexAction() 
    { 
     $products = $this->params()->fromRoute('products'); 

     $config = $this->getServiceLocator()->get('Config'); 
     $fileManagerDir =$config['file_manager']['dir']; 

     $this->_dir = realpath($fileManagerDir) . 
      DIRECTORY_SEPARATOR . 
      $products; 


     if (!is_dir($this->_dir)) { 
      //read, write, execute 
      mkdir($this->_dir, 0777); 
     } 

     $form = new UploadForm($this->_dir, 'upload-form'); 
     $request = $this->getRequest(); 

     if ($request->isPost()) { 
      $post = array_merge_recursive(
       $request->getPost()->toArray(), 
       $request->getFiles()->toArray() 
      ); 

      $form->setData($post); 

      if ($form->isValid()) { 
       $data = $form->getData(); 

       $this->setFileNames($data); 
       return $this->redirect()->toRoute('upload/uploadsuccessful', array('products' =>$products)); 
      } 
     } 
     return new ViewModel(array('form' => $form)); 
    } 

    public function successfulAction() 
    { 
     $file = array(); 
     $flashMessenger = $this->flashMessenger(); 
     if ($flashMessenger->hasMessages()) { 
      foreach($flashMessenger->getMessages() as $key => $value) { 
       $file = $value;  
      } 
     } 
     return new ViewModel(array('file' => $file)); 
    } 

    protected function setFileNames($data) 
    { 
     unset($data['submit']); 
     foreach ($data['image-file'] as $key => $file) { 
      rename($file['tmp_name'], $this->_dir . DIRECTORY_SEPARATOR . $file['name']); 
     }  
    } 
} 

私はアイデアは明らかだと思います。

しかし、問題があります。ボタンをクリックすると($request->isPost() == true)のパラメータ$productsnullになり、アップロードされたファイルは適切なフォルダに移動しません。また、私は成功したアクションにリダイレクトすることができません - $ productsがnullのため、エラーは "パラメータがありません"と表示されます。

答えて

0

ビュースクリプトでは、アップロードボタンはhrefリンクです。これにより、POSTではなくGET REQUESTがコントローラに送信され、FILESも存在しません。そうでないかぎり、あなたはここで言及していない外部JSでclickイベントをインターセプトしています。経路URLは、フォームのaction属性になければなりません。送信ボタンはリンクではありません(あなたがここで言及していないJSを使用していない限り)。フォームメソッドがPOSTに設定されていることを確認します。以下のような

何か:

<form action="<?php echo $this->url('upload', array('products' =>'shoes')); ?>" method="post" enctype="multipart/form-data"> 

あなたはJSを使用して動的アクションに対処したり、ルーティングを再設計する必要があります。

関連する問題