在cakePHP中更新图片

时间:2014-03-03 15:10:24

标签: cakephp

我有一个Up需要做很多照片。我有个问题。我知道可能看起来很愚蠢,甚至我知道我错过了什么,但我还没发现。简而言之。假设我有一个项目。 | ID |名称|价格|条件|位置|图片|

图片是我保存到数据库的图片路径。因此,当我创建一个新项时,所有字段都是必需的。直到这里一切正常。现在让我说打开项目x进行编辑。我只编辑名称和价格,其他我保留原样,我按下保存,浏览按钮,图片字段仍然是必需的,我必须打开galerry再次找到图片以便保存。所以我的问题是:如果我浏览图片,我怎么才能进行图片上传,但不要忘记创作时不能为空。在这里说明一些代码:

   <?php
    App::uses('AppModel', 'Model');
    class Item extends AppModel {
    public $name = 'Item';

        public $primaryKey = 'id';
        public $displayField = 'title';

        public $validate = array(
            'id' => array(
                'blank' => array(
                    'rule' => 'blank',
                    'on' => 'create',
                ),
            ),
            'title' => array(
                'words' => array(
                    'rule' => array('custom', '/[0-9A-Za-z\._-]/'),
                    'message' => 'The Item name can only contain letters, numbers and spaces.',
                ),
                'maxLength' => array(
                    'rule' => array('maxLength', 100),
                    'message' => 'The Item name must not be longer than 100 characters.',
                ),
                'notEmpty' => array(
                    'rule' => array('notEmpty'),
                    'message' => 'The Item name must not be empty.',
                ),
                'isUnique' => array(
                     'rule' => 'isUnique',
                     'message' => 'This Item name already exists.',
                ),
            ),
            'picture' => array(
                'uploadError' => array(
                    'rule'=>'uploadError',
                    'message' => 'The File Did NOT Upload. Please Try Again!',              
                ),
                'fileSize'=>array(
                   'rule'=>array('fileSize','<=','30MB'),
                   'message'=>'File Size should be less then 30MB',         
                ),
                'processMediaUpload'=>array(
                    'rule' =>'processMediaUpload',
                    'message'=>'Uploading File Failed!',            
                ),
            ),
            'item_location_id' => array(
                'notEmpty' => array(
                    'rule' => array('notEmpty'),
                    'message' => 'You Must Choose a Location',
                ),
                'numeric' => array(
                    'rule' => array('numeric'),
                    //'message' => 'Your custom message here',
                ),
            ),
            'address' => array(
                'words' => array(
                    'rule' => array('custom', '/[0-9A-Za-z\._-]/'),
                    'message' => 'The Item Address can only contain letters, numbers and spaces.',
                ),
                'maxLength' => array(
                    'rule' => array('maxLength', 150),
                    'message' => 'Address can not be longer then 150 characters long',
                ),
                'notEmpty' => array(
                    'rule' => array('notEmpty'),
                    'message' => 'You Should Put an Address',
                ),
            ),

        );


    public $belongsTo = array(
        'ItemLocation' => array(
            'className' => 'ItemLocation',
            'foreignKey' => 'item_location_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),

    );



    public function processMediaUpload($mediacheck = array()) {
    $dir = 'img/uploads/item/media/';
        if (isset($mediacheck['media_path']['name'])) {  
            if(is_uploaded_file($mediacheck['media_path']['tmp_name'])) {           
                 if (trim($mediacheck['media_path']['name'])!=""){
                // here we delete if the image exist and replace it.
                    if (file_exists(WWW_ROOT . $dir . $mediacheck['media_path']['name'])) { 
                     unlink(WWW_ROOT . $dir . $mediacheck['media_path']['name']); 
                     return true;
                    } 
                } 
                $allowedExts = array('jpeg', 'png', 'jpg', 'gif');
                $extension=strtolower(end(explode(".", $mediacheck['media_path']['name']))); 
                if (($mediacheck['media_path']['size'] < 55000000)) { 
                    if(in_array($extension, $allowedExts)){
                        if ($mediacheck['media_path']["error"] > 0) {   
                            $this->invalidate('media_path', $mediacheck['media_path']['error']);
                            return false;  
                        } else  {      
                            if (file_exists( WWW_ROOT . $dir) && is_dir( WWW_ROOT . $dir))  { 
                                if (file_exists( WWW_ROOT . $dir . $mediacheck['media_path']['name'])) { 
                                    $this->invalidate('media_path', 'File Allredy Exists!');
                                    return false;     
                                } else {    
                                move_uploaded_file($mediacheck['media_path']['tmp_name'], WWW_ROOT . $dir .  mktime() . $mediacheck['media_path']['name']);
                                $this->data[$this->alias]['media_path'] =  mktime() . $mediacheck['media_path']['name'];
                                return TRUE;
                                }
                            } else {  // in this case the directory doesent exist so we create it
                                mkdir($dir, 0777, true);
                            move_uploaded_file($mediacheck['media_path']['tmp_name'], WWW_ROOT . $dir .  mktime() . $mediacheck['media_path']['name']);
                            $this->data[$this->alias]['media_path'] = mktime() . $mediacheck['media_path']['name'];
                            return TRUE;
                            }
                        }
                    }else { $this->invalidate('media_path', 'Invalid File Format! ');   return false;}
                } else {  $this->invalidate('media_path', 'File size is To big!');  return false;  }
            } else { $this->invalidate('media_path', 'You must upload a file before you Submit!');  return false;  } 
        } else { $this->invalidate('media_path', 'You must upload a file before you Submit!');  return false; }      
     // better safe then sorry!
     return false;
    } 

添加表单

<div class="items form">
<?php echo $this->Form->create('Item', array('type'=>'file')); ?>
<fieldset>
    <legend><?php echo __('Add New Item'); ?></legend>
<?php
    echo $this->Form->input('id');
    echo $this->Form->input('title');
    echo $this->Form->input('item_description');
    echo $this->Form->input('location_description');
    echo $this->Form->input('media_path', array('label'=>'Media','type'=>'file'));
    echo $this->Form->input('item_location_id', array('label'=>'Location'));
    echo $this->Form->input('item_characteristic_id', array('label'=>'Characteristics'));
    echo $this->Form->input('address', array('id' => 'address'));
    echo  "<div id=\"map_canvas\" style=\"width:98%; height:400px;\"> </div>";
    echo $this->Form->input('longitude', array('id'=>'longitude', 'readonly'=>'readonly'));
    echo $this->Form->input('latitude', array('id'=>'latitude', 'readonly'=>'readonly'));
    echo $this->Form->input('first_seller_id');
    echo $this->Form->input('second_seller_id');
    echo $this->Form->input('brochure_path', array('label'=>'Broshure','type'=>'file'));
    echo $this->Form->input('seo_title');
    echo $this->Form->input('seo_description' , array('label' => 'SEO Description'));
    echo $this->Form->input('seo_url' , array('label' => 'SEO Url'));
    echo $this->Form->input('seo_keywords' , array('label' => 'SEO Keywords'));
?>
</fieldset>

修改表单

<div class="items form">
<?php echo $this->Form->create('Item', array('type'=>'file')); ?>
<fieldset>
    <legend><?php echo __('Edit Item'); ?></legend>
<?php
    $dir = "/img/uploads/item/media/"; 
    echo $this->Form->input('id');
    echo $this->Form->input('title');
    echo $this->Form->input('item_description');
    echo $this->Form->input('location_description');
    echo $this->Form->input('media_path', array('label'=>'Media','type'=>'file'));
    echo $this->Form->input('hiddenimage', array('type'=>'hidden','value'=> $this->Form->value('media_path') )); 
    $Image = $this->Form->value( 'media_path');     
        if(empty($Image) || $Image==NULL)
                {$Image = "/img/uploads/noimg.jpg";}
            else {$Image = $dir . $Image;   }
    echo $this->Html->image($Image,array('align'=>'absbottom','style'=>'max-height:100px'));
    echo "<h3> Test: ". $this->Form->value('media_path') . "</h3>";

    echo $this->Form->input('item_location_id', array('label'=>'Location'));
    echo $this->Form->input('item_characteristic_id', array('label'=>'Characteristics'));
    echo $this->Form->input('address', array('id' => 'address'));
    echo  "<div id=\"map_canvas\" style=\"width:98%; height:400px;\"> </div>";
    echo $this->Form->input('longitude', array('id'=>'longitude', 'readonly'=>'readonly'));
    echo $this->Form->input('latitude', array('id'=>'latitude', 'readonly'=>'readonly'));
    echo $this->Form->input('first_seller_id');
    echo $this->Form->input('second_seller_id');
    echo $this->Form->input('brochure_path', array('label'=>'Broshure','type'=>'file'));
    echo $this->Form->input('seo_title');
    echo $this->Form->input('seo_description' , array('label' => 'SEO Description'));
    echo $this->Form->input('seo_url' , array('label' => 'SEO Url'));
    echo $this->Form->input('seo_keywords' , array('label' => 'SEO Keywords'));
?>
</fieldset>

2 个答案:

答案 0 :(得分:2)

请注意将on parameter添加到您的规则中。

'on' => 'create'

只会触发insert(即新记录)的验证。

  

如果规则已定义'on'=&gt; '创建',规则只会被强制执行   在创建新记录期间。同样,如果定义为   'on'=&gt; '更新',它只会在更新期间强制执行   记录。

答案 1 :(得分:0)

在您的编辑操作中,您不仅可以检查该字段并将其删除(如果该字段为空)吗?你是这个意思吗?像:

if (empty($this->request->data['Item']['media_path'])) {
    unset($this->request->data['Item']['media_path']);
}

它可能会比这更复杂,检查一下它是否有效上传我猜,但是会有类似的工作吗?