Example #1
0
 static function place($file, array $attributes = array())
 {
     $attributes += array('uploader' => null, 'desc' => '', 'mime' => null, 'name' => null, 'ext' => null);
     if (!empty($attributes['name'])) {
         $attributes['name'] = basename($attributes['name']);
     } else {
         $ext = strtolower(ltrim($attributes['ext'], '.'));
         $attributes['name'] = substr(uniqid(), 0, 8) . ".{$ext}";
         $msg = "Placing a file without explicit name, generated random: {$attributes['name']}.";
         Log::info_File($msg);
     }
     $ext = $attributes['ext'] = strtolower(ltrim(S::ext($attributes['name']), '.'));
     $ext === '' and $attributes['ext'] = 'dat';
     $dest = static::generatePath($attributes['name']);
     S::mkdirOf($dest);
     $attributes['path'] = S::tryUnprefix($dest, static::storage());
     if (is_resource($file)) {
         $attributes['size'] = static::streamCopyTo($dest, $file);
     } else {
         $attributes['size'] = strlen($file);
         if (!file_put_contents($dest, $file, LOCK_EX)) {
             throw new Error("Cannot write new File data [{$dest}].");
         }
     }
     try {
         // explicit ID so it's harder to guess new file's ID (e.g. to access it directly
         // from web) since they're not sequental.
         $attributes['id'] = static::generateID();
         $model = with(new static())->fill_raw($attributes);
         $model->md5 = md5_file($dest);
         $model->mime = $attributes['mime'] ?: \File::mime($model->ext, '');
         return Event::insertModel($model, 'file');
     } catch (\Exception $e) {
         unlink($dest);
         throw $e;
     }
 }
Example #2
0
 function get_by_list($name = 'main', $slides = false)
 {
     if ($name === '*') {
         if ($route = \Vane\Route::current() and $route->lastServer) {
             $name = \Bundle::element($route->lastServer->name);
             $name = S::tryUnprefix(strtok($name, '@'), 'block.');
         } else {
             $name = null;
         }
     }
     $default = $this->in('default', 'main');
     if (!$name and !$default) {
         return E_INPUT;
     }
     $query = ProductListItem::order_by('sort');
     $name and $query->where('type', '=', $name);
     $default and $query->or_where('type', '=', $default);
     if ($list = $query->get()) {
         if ($default and !S::first($list, array('?->type === ?', $name))) {
             $type = $default;
         } else {
             $type = $name;
         }
         $list = S::keep($list, array('?->type === ?', $type));
         $goods = S::keys(Product::all(prop('product', $list)), '?->id');
         $ordered = array();
         foreach ($list as $item) {
             $product =& $goods[$item->product];
             if ($product and (!$slides or $product->image)) {
                 $product->extra = $item->extra;
                 $ordered[] = $product;
             }
         }
         $this->layout = $slides ? '.slides' : '.index';
         return static::listResponse($slides ? 1000 : 320, $ordered);
     }
 }