PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Tuesday, January 18, 2022

[FIXED] Update Pictures In cakePHP

 January 18, 2022     cakephp     No comments   

Issue

I have an Up which has to do a lot with pictures. I have a problem. I know might seems stupid, and even i know that im missing something, but i havent found out yet. So in few words. Let's say I have an Item. |id|name|price|condition|location|picture|

picture is the picture path that i save to DB. So when i create a new Item all the field are required. Till here everything works Fine.Now lets say i open Item x to edit. I edit only the name and the price and other i leave them as they are, and i press save, browse button, of the picture field is still required and i have to open galerry find the pic again in order to save. So my question is this: How can i do a picture upload only if i browse for the picture, but not to forget that on creation must not be empty. To Ilustrate it here is some code:

   <?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;
    } 

Add Form:

<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>

Edit Form:

<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>

Solution

Look at adding the on parameter to your rules.

'on' => 'create'

Will only trigger the validation on an insert (i.e. a new record).

If a rule has defined ‘on’ => ‘create’, the rule will only be enforced during the creation of a new record. Likewise, if it is defined as ‘on’ => ‘update’, it will only be enforced during the updating of a record.



Answered By - Ross
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing