예제 #1
0
	public function afterQuery(Atomik_Model_Builder $builder, Atomik_Model_Modelset $modelSet)
	{
		$modelName = $builder->name;
		$primaryKeyName = $builder->getPrimaryKeyField()->name;
		$manager = $builder->getManager();
		$db = $manager->getDbInstance();
		$rows = array();
		
		$dataQuery = $db->q()->select()
				->from($builder->tableName)
				->where(array($primaryKeyName => null));
		
		foreach ($modelSet as $row) {
			$primaryKey = $row[$primaryKeyName];
			$key = $modelName . ':' . $primaryKey;
			
			if (($cached = $this->_memcache->get($key)) !== false) {
				// cache hit
				$rows[] = $cached;
				continue;
			}
			
			$data = $dataQuery->setParams(array($primaryKey))->execute()->fetch();
			$this->_memcache->set($key, $data);
			$rows[] = $data;
		}
		
		$modelSet->setData($rows);
	}
예제 #2
0
	public function init(Atomik_Model_Builder $builder)
	{
		if (!$builder->hasField('created')) {
			$builder->addField(new Atomik_Model_Field_Timestamp('created', array('form-ignore' => true)));
		}
		
		if (!$builder->hasField('updated')) {
			$builder->addField(new Atomik_Model_Field_Timestamp('updated', array('form-ignore' => true)));
		}
	}
예제 #3
0
	public function __construct(Atomik_Model_Builder $builder, $field, $value = null)
	{
		if (is_string($field)) {
			$field = $builder->getField($field);
		}
		
		$this->_builder = $builder;
		$this->_field = $field;
		$this->_value = null;
	}
예제 #4
0
	public static function getAvailableFilters(Atomik_Model_Builder $builder)
	{
		$filters = array();
		foreach ($builder->getFields() as $field) {
			$fieldClass = get_class($field);
			$fieldType = substr($fieldClass, strrpos($fieldClass, '_') + 1);
			if ($filter = Atomik_Model_Query_Filter_Factory::factory($fieldType, $builder, $field)) {
				$filters[$field->name] = $filter;
			}
		}
		return $filters;
	}
예제 #5
0
	/**
	 * Transforms the filename template of a file to a real filename
	 *
	 * @param Atomik_Model_Builder $builder
	 * @param array $data
	 * @return string
	 */
	public static function getFilenameFromBuilder(Atomik_Model_Builder $builder, $data = array())
	{
		if (($filename = $builder->getOption('filename', null)) === null) {
			require_once 'Atomik/Model/Exception.php';
			throw new Atomik_Model_Exception('Missing filename option in ' . $builder->getName() . ' model');
		}
		
		foreach ($data as $key => $value) {
			$filename = str_replace(':' . $key, $value, $filename);
		}
		
		return ltrim($filename, '/');
	}
예제 #6
0
	public function modelSearch(Atomik_Model_Builder $builder)
	{
		$html = '<form action="' . Atomik::url() . '" class="model-search" method="post">Search: '
				. '<input type="text" name="search" value="' . A('search', '', $_POST) . '" /><select name="searchBy">';
		
		foreach ($builder->getFields() as $field) {
			$html .= sprintf("<option value=\"%s\" %s>%s</option>\n", 
				$field->name, 
				isset($_POST['searchBy']) && $_POST['searchBy'] == $field->name ? 'selected="selected"' : '',
				$field->getLabel()
			);
		}
		
		$html .= '</select><input type="submit" value="search" /></form>';
		return $html;
	}
예제 #7
0
	/**
	 * Populates the model with the data from the form
	 */
	public function populateModel()
	{
		if ($this->_model === null) {
			$this->_model = $this->_builder->createInstance();
		}
		$this->_model->populate($this->getData());
	}
예제 #8
0
	public function export(Atomik_Model_Builder $builder)
	{
		$definition = new Atomik_Db_Definition($builder->getManager()->getDbInstance());
		$definition->dropBeforeCreate();
		
		$tableName = $builder->tableName;
		$table = $definition->table($tableName);
		
		foreach ($builder->getFields() as $field) {
			list($type, $length) = $field->getSqlType();
			$column = $table->createColumn($field->name, $type, $length, $field->getOptions('sql-'));
			
			if ($builder->getPrimaryKeyField() == $field) {
				$table->primaryKey($field->name);
				$column->options['auto-increment'] = true;
			}
			
			if ($builder->isFieldPartOfReference($field)) {
				$table->index($field->name, $field->getOption('sql-index', null));
			}
		}
		
		$builder->getBehaviourBroker()->notifyBeforeExport($builder, $definition);
		$sql = $definition->toSql();
		$builder->getBehaviourBroker()->notifyAfterExport($builder, $sql);
		
		return $sql;
	}
예제 #9
0
	/**
	 * Returns the model at the specified index
	 * 
	 * @param	int		$index
	 * @return 	Atomik_Model
	 */
	public function item($index)
	{
		if ($index >= $this->_count) {
			return false;
		}
		
		if (!isset($this->_models[$index])) {
			$this->_models[$index] = $this->_builder->createInstance(
				$this->_data[$index],
				false
			);
		}
		
		return $this->_models[$index];
	}
예제 #10
0
	public function offsetExists($index)
	{
		return $this->_builder->hasField($index) 
			|| $this->_builder->hasReference($index) 
			|| $this->_builder->hasLink($index);
	}
예제 #11
0
	/**
	 * Builds a link from the string and adds it to the builder
	 * 
	 * String template:
	 * [one] Target [as property] on field [=> alias] [, field [=> alias]]
	 * 
	 * Example:
	 * Tweets as tweets on twitter_username => username
	 * 
	 * @param 	Atomik_Model_Builder $builder
	 * @param 	string				 $string
	 */
	public static function addLinkFromString(Atomik_Model_Builder $builder, $string)
	{
		$regexp = '/^((?P<type>one)\s+|)(?P<target>.+)((\sas\s(?P<as>.+))|)\s+on\s+(?P<on>.+)$/U';
				
		if (!preg_match($regexp, $string, $matches)) {
			require_once 'Atomik/Model/Builder/Exception.php';
			throw new Atomik_Model_Builder_Exception('Link string is malformed: ' . $string);
		}
		
		$link = new Atomik_Model_Builder_Link();
		$link->type = $matches['type'] == 'one' ? 'one' : 'many';
		$link->target = trim($matches['target']);
		$link->name = $link->target;
		if (isset($matches['as']) && !empty($matches['as'])) {
			$link->name = trim($matches['as']);
		}
		
		$fields = explode(',', $matches['on']);
		foreach ($fields as $field) {
			if (!preg_match('/^(?P<name>.+)(\s+=\>\s(?P<alias>.+)|)$/U', trim($field), $fieldMatches)) {
				require_once 'Atomik/Model/Builder/Exception.php';
				throw new Atomik_Model_Builder_Exception('Field definition in link string is malformed: ' . $string);
			}
			$alias = isset($fieldMatches['alias']) ? $fieldMatches['alias'] : $fieldMatches['name'];
			$link->fields[$alias] = $fieldMatches['name'];
		}
		
		$builder->addLink($link);
	}
예제 #12
0
	public function init(Atomik_Model_Builder $builder)
	{
		$builder->addField(new Atomik_Model_Field('position', 'int'));
	}
예제 #13
0
	public function afterDelete(Atomik_Model_Builder $builder, Atomik_Model $model)
	{
		$primaryKey = $model->getPrimaryKey();
		
		$db = $builder->getManager()->getDbInstance();
		$tableName = $builder->tableName;
		$foreignFieldName = $this->_prefix($tableName) . '_' . $builder->getPrimaryKeyField()->name;
		$tableName = $this->_suffix($tableName);
		
		$db->delete($tableName, array($foreignFieldName => $primaryKey));
	}
예제 #14
0
	public function init(Atomik_Model_Builder $builder)
	{
		$builder->addField(new Atomik_Model_Field_Bool('published'));
	}