Location: PHPKode > projects > Anchor CMS > anchor-cms-0.8/anchor/models/extend.php
<?php

class Extend extends Model {

	public static $table = 'extend';

	public static function field($type, $key, $id = -1) {
		$field = Query::table(static::$table)
			->where('type', '=', $type)
			->where('key', '=', $key)
			->fetch();

		if($field) {
			$meta = Query::table($type . '_meta')
				->where($type, '=', $id)
				->where('extend', '=', $field->id)
				->fetch();

			$field->value = Json::decode($meta ? $meta->data : '{}');
		}

		return $field;
	}

	public static function value($extend, $value = null) {
		switch($extend->field) {
			case 'text':
				if( ! empty($extend->value->text)) {
					$value = $extend->value->text;
				}
				break;

			case 'html':
				if( ! empty($extend->value->html)) {
					$md = new Markdown;

					$value = $md->transform($extend->value->html);
				}
				break;

			case 'image':
			case 'file':
				if( ! empty($extend->value->filename)) {
					$value = asset('content/' . $extend->value->filename);
				}
				break;
		}

		return $value;
	}

	public static function fields($type, $id = -1) {
		$fields = Query::table(static::$table)->where('type', '=', $type)->get();

		foreach(array_keys($fields) as $index) {
			$meta = Query::table($type . '_meta')
				->where($type, '=', $id)
				->where('extend', '=', $fields[$index]->id)
				->fetch();

			$fields[$index]->value = Json::decode($meta ? $meta->data : '{}');
		}

		return $fields;
	}

	public static function html($item) {
		switch($item->field) {
			case 'text':
				$value = isset($item->value->text) ? $item->value->text : '';
				$html = '<input id="extend_' . $item->key . '" name="extend[' . $item->key . ']" type="text" value="' . $value . '">';
				break;

			case 'html':
				$value = isset($item->value->html) ? $item->value->html : '';
				$html = '<textarea id="extend_' . $item->key . '" name="extend[' . $item->key . ']" type="text">' . $value . '</textarea>';
				break;

			case 'image':
			case 'file':
				$value = isset($item->value->filename) ? $item->value->filename : '';

				$html = '<span class="current-file">';

				if($value) {
					$html .= '<a href="' . asset('content/' . $value) . '" target="_blank">' . $value . '</a>';
				}

				$html .= '</span>
					<span class="file">
					<input id="extend_' . $item->key . '" name="extend[' . $item->key . ']" type="file">
					</span>';

				if($value) {
					$html .= '</p><p>
					<label>Remove ' . $item->label . ':</label>
					<input type="checkbox" name="extend_remove[' . $item->key . ']" value="1">';
				}

				break;

			default:
				$html = '';
		}

		return $html;
	}

	public static function paginate($page = 1, $perpage = 10) {
		$query = Query::table(static::$table);

		$count = $query->count();

		$results = $query->take($perpage)->skip(($page - 1) * $perpage)->get();

		return new Paginator($results, $count, $page, $perpage, admin_url('extend/fields'));
	}

	/*
		Process field types
	*/

	public static function files() {
		// format file array
		$files = array();

		if(isset($_FILES['extend'])) {
			foreach($_FILES['extend'] as $label => $items) {
				foreach($items as $key => $value) {
					$files[$key][$label] = $value;
				}
			}
		}

		return $files;
	}

	public static function upload($file) {
		$storage = PATH . 'content' . DS;
		$ext = pathinfo($file['name'], PATHINFO_EXTENSION);

		$filename = hash('crc32', file_get_contents($file['tmp_name'])) . '.' . $ext;
		$filepath = $storage . $filename;

		if(move_uploaded_file($file['tmp_name'], $filepath)) {
			return $filepath;
		}

		return false;
	}

	public static function process_image($extend) {
		$file = array_get(static::files(), $extend->key);

		if($file and $file['error'] === UPLOAD_ERR_OK) {
			$name = basename($file['name']);
			$ext = pathinfo($file['name'], PATHINFO_EXTENSION);

			if($filepath = static::upload($file)) {
				$filename = basename($filepath);

				// resize image
				if(isset($extend->attributes->size->width) and isset($extend->attributes->size->height)) {
					$image = Image::open($filepath);

					$width = intval($extend->attributes->size->width);
					$height = intval($extend->attributes->size->height);

					// if a width and height is set and is not the same
					// size as the uploaed file
					if(
						($width and $height) and
						($width <> $image->width() or $height <> $image->height())
					) {
						$image->resize($width, $height);

						$image->output($ext, $filepath);
					}
				}

				return Json::encode(compact('name', 'filename'));
			}
		}
	}

	public static function process_file($extend) {
		$file = array_get(static::files(), $extend->key);

		if($file and $file['error'] === UPLOAD_ERR_OK) {
			$name = basename($file['name']);

			if($filepath = static::upload($file)) {
				$filename = basename($filepath);

				return Json::encode(compact('name', 'filename'));
			}
		}
	}

	public static function process_text($extend) {
		$text = Input::get('extend.' . $extend->key);

		return Json::encode(compact('text'));
	}

	public static function process_html($extend) {
		$html = Input::get('extend.' . $extend->key);

		return Json::encode(compact('html'));
	}

	/*
		Save
	*/

	public static function process($type, $item) {
		foreach(static::fields($type, $item) as $extend) {
			if($extend->attributes) {
				$extend->attributes = Json::decode($extend->attributes);
			}

			$data = call_user_func_array(array('Extend', 'process_' . $extend->field), array($extend, $item));

			// save data
			if( ! is_null($data)) {
				$table = $extend->type . '_meta';
				$query = Query::table($table)
					->where('extend', '=', $extend->id)
					->where($extend->type, '=', $item);

				if($query->count()) {
					$query->update(array('data' => $data));
				}
				else {
					$query->insert(array(
						'extend' => $extend->id,
						$extend->type => $item,
						'data' => $data
					));
				}
			}

			// remove data
			if(Input::get('extend_remove.' . $extend->key)) {
				if(isset($extend->value->filename) and strlen($extend->value->filename)) {
					Query::table($extend->type . '_meta')
						->where('extend', '=', $extend->id)
						->where($extend->type, '=', $item)->delete();

					$resource = PATH . 'content' . DS . $extend->value->filename;
					file_exists($resource) and unlink(PATH . 'content' . DS . $extend->value->filename);
				}
			}
		}
	}

}
Return current item: Anchor CMS