Doktrin ORM bir dosya yükleme şablonu oluşturma

1 Cevap php

Zend Framework Projesi benim ORM olarak Doctrine 1.2 kullanıyorum. Ben bir dosya için aşağıdaki Modeli tanımladınız.

File:
    columns:
        id:
            primary: true
            type: integer(4)
            unsigned: true
        code:
            type: string(255)
            unique: true
            notblank: true
        path:
            type: string(255)
            notblank: true
        size:
            type: integer(4)
        type:
            type: enum
            values: [file,document,image,video,audio,web,application,archive]
            default: unknown
            notnull: true
        mimetype:
            type: string(20)
            notnull: true
        width:
            type: integer(2)
            unsigned: true
        height:
            type: integer(2)
            unsigned: true

Şimdi burada Dosya Model php sınıfı (sadece şimdi için göz atabilir) 'dir:

<?php

/**
 * File
 *
 * This class has been auto-generated by the Doctrine ORM Framework
 *
 * @package    ##PACKAGE##
 * @subpackage ##SUBPACKAGE##
 * @author     ##NAME## <##EMAIL##>
 * @version    SVN: $Id: Builder.php 6365 2009-09-15 18:22:38Z jwage $
 */
class File extends BaseFile {

 public function setUp ( ) {
  $this->hasMutator('file', 'setFile');
  parent::setUp();
 }

 public function setFile ( $file ) {
  global $Application;

  // Configuration
  $config = array();
  $config['bal'] = $Application->getOption('bal');

  // Check the file
  if ( !empty($file['error']) ) {
   $error = $file['error'];
   switch ( $file['error'] ) {
    case UPLOAD_ERR_INI_SIZE :
     $error = 'ini_size';
     break;
    case UPLOAD_ERR_FORM_SIZE :
     $error = 'form_size';
     break;
    case UPLOAD_ERR_PARTIAL :
     $error = 'partial';
     break;
    case UPLOAD_ERR_NO_FILE :
     $error = 'no_file';
     break;
    case UPLOAD_ERR_NO_TMP_DIR :
     $error = 'no_tmp_dir';
     break;
    case UPLOAD_ERR_CANT_WRITE :
     $error = 'cant_write';
     break;
    default :
     $error = 'unknown';
     break;
   }
   throw new Doctrine_Exception('error-application-file-' . $error);
   return false;
  }
  if ( empty($file['tmp_name']) || !is_uploaded_file($file['tmp_name']) ) {
   throw new Doctrine_Exception('error-application-file-invalid');
   return false;
  }

  // Prepare config
  $file_upload_path = realpath($config['bal']['files']['upload_path']) . DIRECTORY_SEPARATOR;

  // Prepare file
  $filename = $file['name'];
  $file_old_path = $file['tmp_name'];
  $file_new_path = $file_upload_path . $filename;
  $exist_attempt = 0;
  while ( file_exists($file_new_path) ) {
   // File already exists
   // Pump exist attempts
   ++$exist_attempt;
   // Add the attempt to the end of the file
   $file_new_path = $file_upload_path . get_filename($filename,false) . $exist_attempt . get_extension($filename);
  }

  // Move file
  $success = move_uploaded_file($file_old_path, $file_new_path);
  if ( !$success ) {
   throw new Doctrine_Exception('Unable to upload the file.');
   return false;
  }

  // Secure
  $file_path = realpath($file_new_path);
  $file_size = filesize($file_path);
  $file_mimetype = get_mime_type($file_path);
  $file_type = get_filetype($file_path);

  // Apply
  $this->path = $file_path;
  $this->size = $file_size;
  $this->mimetype = $file_mimetype;
  $this->type = $file_type;

  // Apply: Image
  if ( $file_type === 'image' ) {
   $image_dimensions = image_dimensions($file_path);
   if ( !empty($image_dimensions) ) {
    // It is not a image we can modify
    $this->width = 0;
    $this->height = 0;
   } else {
    $this->width = $image_dimensions['width'];
    $this->height = $image_dimensions['height'];
   }

  }

  // Done
  return true;
 }

 /**
  * Download the File
  * @return
  */
 public function download ( ) {
  global $Application;

  // File path
  $file_upload_path = realpath($config['bal']['files']['upload_path']) . DIRECTORY_SEPARATOR;
  $file_path = $file_upload_path . $this->file_path;

  // Output result and download
  become_file_download($file_path, null, null);
  die();
 }

 public function postDelete ( $Event ) {
  global $Application;
  // Prepare
  $Invoker = $Event->getInvoker();

  // Configuration
  $config = array();
  $config['bal'] = $Application->getOption('bal');

  // File path
  $file_upload_path = realpath($config['bal']['files']['upload_path']) . DIRECTORY_SEPARATOR;
  $file_path = $file_upload_path . $this->file_path;

  // Delete the file
  unlink($file_path);

  // Done
  return true;
 }
}

Benim modeli dosya içinde yukarıda özel işlevselliği bir validator, şablon veya satırlar boyunca bir şey dönüştü böylece Ne başarmak için umut ediyorum olduğunu.

Yani umarım böyle bir şey yapabilirsiniz:

File:
    actAs:
        BalFile:
    columns:
        id:
            primary: true
            type: integer(4)
            unsigned: true
        code:
            type: string(255)
            unique: true
            notblank: true
        path:
            type: string(255)
            notblank: true
        size:
            type: integer(4)
        type:
            type: enum
            values: [file,document,image,video,audio,web,application,archive]
            default: unknown
            notnull: true
        mimetype:
            type: string(20)
            notnull: true
        width:
            type: integer(2)
            unsigned: true
        height:
            type: integer(2)
            unsigned: true

Ben yaparsam söylüyorlar ben bir validator umuyorum

$File->setFile($_FILE['uploaded_file']);

Tüm doktrin belgelerinde özellikle "sanal" alanların CONTECT içinde, özel doğrulayıcılarıyla az olan dışında bir doğrulama hatası sağlayacaktır.

So in summary, my question is: How earth can I go about making a template/extension to porting this functionality? I have tried before with templates but always gave up after a day :/ If you could take the time to port the above I would greatly appreciate it.

1 Cevap

Ben ilk etapta sorunu ortadan I soruna bir çözüm için sormak soruda, çözelti içindeki geldi.

Bunun yerine genel kod işlemek için önek ile SVN Externals ve Doktrin ARMUT tarzı modellerini kullanıyorum. Orada öyle ki: Bal svn harici klasör olmak modeller / Bal / file.php. Doğrulama için, onun yerine ben gibi statik kurucular kullanmaya karar verdi: Dosya :: createFromUpload ($ _FILES ['myFile']) File :: createFormPath ($ myFilePath); daha sonra bir istisna hangi o uygulama iş mantığı (kontrolör) tarafından idare edilecektir.

Source code visible here: http://github.com/balupton/balphp/blob/master/trunk/lib/models/File.php