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