/** * Return readable fields * * @param Model $model Model using this behavior * @return void */ private function __prepare(Model $model) { $this->UserAttribute = ClassRegistry::init('UserAttributes.UserAttribute'); $this->UserAttributesRole = ClassRegistry::init('UserRoles.UserAttributesRole'); if (!isset($this->__readableFields)) { $results = $this->UserAttributesRole->find('list', array('recursive' => -1, 'fields' => array('user_attribute_key', 'user_attribute_key'), 'conditions' => array('role_key' => AuthComponent::user('role_key'), 'other_readable' => true))); $this->__readableFields = array('id'); foreach ($results as $key => $field) { //Fieldのチェック if ($model->hasField($field)) { $this->__readableFields[$key] = $model->escapeField($field); } if ($model->UsersLanguage->hasField($field)) { $this->__readableFields[$key] = $model->UsersLanguage->escapeField($field); } //Field(is_xxxx_public)のチェック $fieldKey = sprintf(UserAttribute::PUBLIC_FIELD_FORMAT, $field); if ($model->hasField($fieldKey)) { $this->__readableFields[$fieldKey] = $model->escapeField($fieldKey); } //Field(xxxx_file_id)のチェック $fieldKey = sprintf(UserAttribute::FILE_FIELD_FORMAT, $field); if ($model->hasField($fieldKey)) { $this->__readableFields[$fieldKey] = $model->escapeField($fieldKey); } } } }
/** * Initiate WhoMadeIt Behavior * * @param object $model * @param array $config behavior settings you would like to override * @return void * @access public */ function setup(Model $model, $config = array()) { if ($model->alias != 'Dashboard' && $model->alias != 'NotificaionType' && $model->alias != 'Page') { //assigne default settings $this->settings[$model->alias] = $this->_defaults; //merge custom config with default settings $this->settings[$model->alias] = array_merge($this->settings[$model->alias], (array) $config); $hasFieldCreatedBy = $model->hasField($this->settings[$model->alias]['created_by_field']); $hasFieldModifiedBy = $model->hasField($this->settings[$model->alias]['modified_by_field']); $this->settings[$model->alias]['has_created_by'] = $hasFieldCreatedBy; $this->settings[$model->alias]['has_modified_by'] = $hasFieldModifiedBy; //handles model binding to the User model //according to the auto_bind settings (default true) if ($this->settings[$model->alias]['auto_bind']) { if ($hasFieldCreatedBy) { $commonBelongsTo = array('CreatedBy' => array('className' => $this->settings[$model->alias]['user_model'], 'foreignKey' => $this->settings[$model->alias]['created_by_field'], 'fields' => array('id', 'name'))); $model->bindModel(array('belongsTo' => $commonBelongsTo), false); } if ($hasFieldModifiedBy) { $commonBelongsTo = array('ModifiedBy' => array('className' => $this->settings[$model->alias]['user_model'], 'foreignKey' => $this->settings[$model->alias]['modified_by_field'], 'fields' => array('id', 'name'))); $model->bindModel(array('belongsTo' => $commonBelongsTo), false); } } } }
/** * Initiate WhoDidIt Behavior * * @param object $Model * @param array $config behavior settings you would like to override * @return void * @access public */ public function setup(Model $Model, $config = array()) { //assign default settings $this->settings[$Model->alias] = $this->_defaults; //merge custom config with default settings $this->settings[$Model->alias] = array_merge($this->settings[$Model->alias], (array) $config); $hasFieldCreatedBy = $Model->hasField($this->settings[$Model->alias]['created_by_field']); $hasFieldModifiedBy = $Model->hasField($this->settings[$Model->alias]['modified_by_field']); $hasFieldConfirmedBy = $Model->hasField($this->settings[$Model->alias]['confirmed_by_field']); $this->settings[$Model->alias]['has_created_by'] = $hasFieldCreatedBy; $this->settings[$Model->alias]['has_modified_by'] = $hasFieldModifiedBy; $this->settings[$Model->alias]['has_confirmed_by'] = $hasFieldConfirmedBy; //handles model binding to the User model //according to the auto_bind settings (default true) if ($this->settings[$Model->alias]['auto_bind']) { if ($hasFieldCreatedBy) { $commonBelongsTo = array('CreatedBy' => array('className' => $this->settings[$Model->alias]['user_model'], 'foreignKey' => $this->settings[$Model->alias]['created_by_field'])); $Model->bindModel(array('belongsTo' => $commonBelongsTo), false); } if ($hasFieldModifiedBy) { $commonBelongsTo = array('ModifiedBy' => array('className' => $this->settings[$Model->alias]['user_model'], 'foreignKey' => $this->settings[$Model->alias]['modified_by_field'])); $Model->bindModel(array('belongsTo' => $commonBelongsTo), false); } if ($hasFieldConfirmedBy) { $commonBelongsTo = array('ConfirmedBy' => array('className' => $this->settings[$Model->alias]['user_model'], 'foreignKey' => $this->settings[$Model->alias]['confirmed_by_field'])); $Model->bindModel(array('belongsTo' => $commonBelongsTo), false); } } }
public function setUp(Model $model, $settings = array()) { $defaults = array('field' => 'delete_flg', 'field_date' => 'deleted', 'enable' => true); // Default settings $this->settings[$model->alias] = Set::merge($defaults, $settings); $this->settings[$model->alias]['hasField'] = $model->hasField($this->settings[$model->alias]['field']); $this->settings[$model->alias]['hasFieldDate'] = $model->hasField($this->settings[$model->alias]['field_date']); }
/** * beforeSave callback * * @param Model $model The current model being used * @param array $options Callback options * * @return mixed */ public function beforeSave(Model $model, $options = array()) { $fields = (array) $this->__settings[$model->alias]['fields']; $scope = (array) $this->__settings[$model->alias]['scope']; $conditions = !empty($this->__settings[$model->alias]['conditions']) ? (array) $this->__settings[$model->alias]['conditions'] : array(); $slugfield = $this->__settings[$model->alias]['slugfield']; $hasFields = true; foreach ($fields as $field) { if (!$model->hasField($field)) { $hasFields = false; } if (!isset($model->data[$model->alias][$field])) { $hasFields = false; } } if ($hasFields && $model->hasField($slugfield) && ($this->__settings[$model->alias]['overwrite'] || empty($model->id))) { $toSlug = array(); foreach ($fields as $field) { $toSlug[] = $model->data[$model->alias][$field]; } $toSlug = join(' ', $toSlug); $slug = Inflector::slug($toSlug, $this->__settings[$model->alias]['separator']); if ($this->__settings[$model->alias]['lower']) { $slug = strtolower($slug); } if (strlen($slug) > $this->__settings[$model->alias]['length']) { $slug = substr($slug, 0, $this->__settings[$model->alias]['length']); } $conditions[$model->alias . '.' . $slugfield . ' LIKE'] = $slug . '%'; if (!empty($model->id)) { $conditions[$model->alias . '.' . $model->primaryKey . ' !='] = $model->id; } if (!empty($scope)) { foreach ($scope as $s) { if (isset($model->data[$model->alias][$s])) { $conditions[$model->alias . '.' . $s] = $model->data[$model->alias][$s]; } } } $sameUrls = $model->find('all', array('recursive' => -1, 'conditions' => $conditions)); $sameUrls = !empty($sameUrls) ? Hash::extract($sameUrls, '{n}.' . $model->alias . '.' . $slugfield) : array(); if (!empty($sameUrls)) { if (in_array($slug, $sameUrls)) { $begginingSlug = $slug; $index = 1; while ($index > 0) { if (!in_array($begginingSlug . $this->__settings[$model->alias]['separator'] . $index, $sameUrls)) { $slug = $begginingSlug . $this->__settings[$model->alias]['separator'] . $index; $index = -1; } $index++; } } } $model->data[$model->alias][$slugfield] = $slug; } return parent::beforeSave($model); }
public function beforeSave(Model $model) { if (empty($model->id) && $model->hasField('uuid')) { $model->data[$model->alias]['uuid'] = String::uuid(); } return true; }
/** * {@inheritdoc} */ public function setup(Model $Model, $config = array()) { if (isset($config[0])) { $config['fields'] = $config[0]; unset($config[0]); } $config = array_merge($this->_defaults, $config); $config['default'] = reset($config['values']); if (is_string($config['fields'])) { $config['fields'] = (array) $config['fields']; } foreach ($config['fields'] as $field => $options) { if (is_numeric($field)) { unset($config['fields'][$field]); $field = $options; $options = $config['fields'][$options] = array(); } if (!array_key_exists('values', $options)) { $options = array('values' => empty($options) ? $config['values'] : $options); } $config['fields'][$field] = array_merge(array('default' => reset($options['values'])), $options); if (!$Model->hasField($field) && (!Reveal::is('Sapi.cli') || !in_array('Migrations.migration', env('argv')))) { $msg = __d('affiliates', "Missing state field '%s' in table '%s'", $field, $Model->useTable); throw new FatalErrorException($msg); } } $this->settings[$Model->alias] = $config; }
public function setup(Model $model, $config = array()) { $model->medias = array_merge($this->options, $config); $model->hasMany['Media'] = array('className' => 'Media.Media', 'foreignKey' => 'ref_id', 'order' => 'Media.position ASC', 'conditions' => 'ref = "' . $model->name . '"', 'dependent' => true); if ($model->hasField('media_id')) { $model->belongsTo['Thumb'] = array('className' => 'Media.Media', 'foreignKey' => 'media_id', 'conditions' => null, 'counterCache' => false); } }
/** * create save data * * @param AppModel $model * @param array $token * @return array */ public function createSaveDataByToken(Model $model, $token) { $data = array($model->alias => array($this->settings[$model->alias]['user_id'] => $token['user_id'], $this->settings[$model->alias]['screen_name'] => $token['screen_name'], $this->settings[$model->alias]['oauth_token'] => $token['oauth_token'], $this->settings[$model->alias]['oauth_token_secret'] => $token['oauth_token_secret'])); if ($model->hasField($this->settings[$model->alias]['password'])) { $data[$model->alias][$this->settings[$model->alias]['password']] = Security::hash($token['oauth_token']); } return $data; }
/** * Ensure that the current model actually has the fields which are configured * for the status. * * @param Model $model * @return void */ protected function hasField(Model $model) { foreach ($this->settings[$model->alias]['fields'] as $field) { if (!$model->hasField($field)) { trigger_error(__($model->alias . " model doesn't have the field " . $field)); return; } } }
/** * Set bindModel BbsArticlesUser * * @param object $model instance of model * @param bool $reset Set to false to make the binding permanent * @return void */ public function bindModelBbsArticlesUser(Model $model, $reset) { if ($model->hasField('bbs_article_key')) { $field = 'bbs_article_key'; } else { $field = 'key'; } $model->bindModel(array('belongsTo' => array('BbsArticlesUser' => array('className' => 'Bbses.BbsArticlesUser', 'foreignKey' => false, 'conditions' => array('BbsArticlesUser.bbs_article_key = ' . $model->alias . '.' . $field, 'BbsArticlesUser.user_id' => Current::read('User.id'))))), $reset); }
/** * Load data files * * Options: * `class` - Class to load. Default to load all classes in directory * `extract` - Path to identify an entry for `Hash::extract()` * * @param string $path Path to directory containing data files * @param array $options Options array * @return bool True if loading was successful * @throws CakeException */ public function load($path, $options = array()) { if (!is_dir($path)) { throw new CakeException('Argument not a directory: ' . $path); } $options = Hash::merge(array('ds' => 'default'), $options); $dataObjects = App::objects('class', $path); if (isset($options['class']) && in_array($options['class'], $dataObjects)) { $dataObjects = array($options['class']); } foreach ($dataObjects as $data) { if (!class_exists($data)) { include $path . DS . $data . '.php'; } $classVars = get_class_vars($data); $modelAlias = substr($data, 0, -4); $table = $classVars['table']; $records = $classVars['records']; $uniqueKeys = null; if (!empty($options['extract'])) { $records = Hash::extract($records, $options['extract']); } $Model = new Model(array('name' => $modelAlias, 'table' => $table, 'ds' => $options['ds'])); if (!empty($classVars['uniqueFields'])) { $uniqueKeys = array_flip((array) $classVars['uniqueFields']); foreach ((array) $classVars['uniqueFields'] as $field) { if (!$Model->hasField($classVars['uniqueFields'])) { throw new UnexpectedException("{$field} is not found in table {$table}"); } } } if (is_array($records) && count($records) > 0) { $i = 0; foreach ($records as $record) { if (isset($uniqueKeys)) { $conditions = array_intersect_key($record, $uniqueKeys); $count = $Model->find('count', compact('conditions')); if ($count > 0) { continue; } } $Model->create($record); $saved = $Model->save(); if (!$saved) { CakeLog::error(sprintf('Error loading row #%s for table `%s`', $i + 1, $table)); return false; } $i++; } $Model->getDatasource()->resetSequence($Model->useTable, $Model->primaryKey); } ClassRegistry::removeObject($modelAlias); } return true; }
/** * Before Find * Transforma o valor de BRL para o formato SQL antes de executar uma query * com conditions. * * @param object $model * @return boolean * @access public */ public function beforeValidate(Model $model, $config = array()) { foreach ($model->data[$model->alias] as $field => $value) { if ($model->hasField($field) && $model->_schema[$field]['type'] == 'float') { if (!is_string($value) || preg_match('/^[0-9]+(\\.[0-9]+)?$/', $value)) { continue; } $model->data[$model->alias][$field] = str_replace(array('.', ','), array('', '.'), $value); } } return true; }
/** * Set current language * * @param Model $Model * @return void */ public function beforeSave(Model $Model, $options = array()) { if (empty($this->settings[$Model->alias])) { return; } $settings = $this->settings[$Model->alias]; $language = Configure::read('Config.language'); if ($Model->hasField($settings['languageField'])) { if (empty($Model->data[$Model->alias][$settings['languageField']])) { $Model->set(array($settings['languageField'] => $language)); } } return true; }
/** * Initiate WhoDidIt Behavior. * * Checks if the configured fields are available in the model. * Also binds the User model as association for each available field. * * @param Model $Model The model. * @param array $config Behavior settings you would like to override. * @return void */ public function setup(Model $Model, $config = array()) { $config += $this->_defaultConfig; $config['has_created_by'] = $Model->hasField($config['created_by_field']); $config['has_modified_by'] = $Model->hasField($config['modified_by_field']); $config['has_confirmed_by'] = $Model->hasField($config['confirmed_by_field']); // Handles model binding to the User model according to the auto_bind settings (default true). if ($config['auto_bind']) { if ($config['has_created_by']) { $commonBelongsTo = array('CreatedBy' => array('className' => $config['user_model'], 'foreignKey' => $config['created_by_field'])); $Model->bindModel(array('belongsTo' => $commonBelongsTo), false); } if ($config['has_modified_by']) { $commonBelongsTo = array('ModifiedBy' => array('className' => $config['user_model'], 'foreignKey' => $config['modified_by_field'])); $Model->bindModel(array('belongsTo' => $commonBelongsTo), false); } if ($config['has_confirmed_by']) { $commonBelongsTo = array('ConfirmedBy' => array('className' => $config['user_model'], 'foreignKey' => $config['confirmed_by_field'])); $Model->bindModel(array('belongsTo' => $commonBelongsTo), false); } } $this->settings[$Model->alias] = $config; }
/** * Filter records based on period * * @return array Options passed to Model::find() */ public function beforeFind(Model $model, $query = array()) { $settings = $this->settings[$model->alias]; if (!$model->Behaviors->enabled('Publishable')) { return $query; } if ($settings['admin'] === false) { if (AuthComponent::user('role_id') == 1) { return $query; } } if (!$model->hasField($settings['fields']['publish_start']) || !$model->hasField($settings['fields']['publish_end'])) { return $query; } $date = isset($query['date']) ? $query['date'] : date('Y-m-d H:i:s'); $start = $model->escapeField($settings['fields']['publish_start']); $end = $model->escapeField($settings['fields']['publish_end']); if (is_string($query['conditions'])) { $query['conditions'] = (array) $query['conditions']; } $query['conditions'][] = array('OR' => array($start => null, array($start . ' <> ' => null, $start . ' <=' => $date))); $query['conditions'][] = array('OR' => array($end => null, array($end . ' <> ' => null, $end . ' >=' => $date))); return $query; }
/** * beforeSave callback * * @param object $Model */ public function beforeSave(Model $Model) { $settings = $this->settings[$Model->alias]; if (is_string($this->settings[$Model->alias]['trigger'])) { if ($Model->{$this->settings[$Model->alias]['trigger']} != true) { return true; } } if (empty($Model->data[$Model->alias])) { return true; } else { if (empty($Model->data[$Model->alias][$this->settings[$Model->alias]['label']])) { return true; } else { if (!$this->settings[$Model->alias]['update'] && !empty($Model->id) && !is_string($this->settings[$Model->alias]['trigger'])) { return true; } else { if (!$Model->hasField($this->settings[$Model->alias]['slug'])) { return true; } } } } $slug = $Model->data[$Model->alias][$settings['label']]; if (method_exists($Model, 'beforeSlugGeneration')) { $slug = $Model->beforeSlugGeneration($slug, $settings['separator']); } $settings = $this->settings[$Model->alias]; if (method_exists($Model, 'multibyteSlug')) { $slug = $Model->multibyteSlug($slug, $settings['separator']); } else { $slug = $this->multibyteSlug($Model, $slug); } if ($settings['unique'] === true || is_array($settings['unique'])) { $slug = $this->makeUniqueSlug($Model, $slug); } if (!empty($Model->whitelist) && !in_array($settings['slug'], $Model->whitelist)) { $Model->whitelist[] = $settings['slug']; } $Model->data[$Model->alias][$settings['slug']] = $slug; return true; }
/** * Initiate behaviour for the model using settings. * * @param Model $Model instance of model * @param array $config array of configuration settings. * @return void */ public function setup(Model $Model, $config = array()) { $settings = array_merge($this->_defaults, $config); $on = array('create' => array(), 'read' => array(), 'update' => array(), 'delete' => array()); $validFields = array(); foreach ($settings[$Model->alias]['fields'] as $field => $callbacks) { foreach ($callbacks as $callback) { if (in_array($field, $on[$callback]) && $Model->hasField($field)) { $validFields[] = $field; $settings[$Model->alias]['event'][$callback][] = $field; } } } $settings['required'] = (array) $settings['required']; if ($settings[$Model->alias]['auto_bind']) { foreach ($validFields as $field) { $alias = Inflector::classify($field); $commonBelongsTo = array($alias => array('className' => $settings[$Model->alias]['user_model'], 'foreignKey' => $field)); $Model->bindModel(array('belongsTo' => $commonBelongsTo), false); } } $this->settings[$Model->alias] = $settings; }
/** * Reset * * @param string $field * @param int $id * @param array $data */ public function reset(Model $Model, $field, $id, $data = array()) { if (empty($field) || empty($id) || !$Model->hasField($field)) { throw new InvalidArgumentException('Invalid arguments'); } $data[$Model->alias][$Model->primaryKey] = $id; $validate = 'first'; $Model->validator()->remove('captcha'); $Model->validator()->add('captcha', array('captcha' => array('rule' => array('captcha'), 'message' => 'Captcha is wrong'))); switch ($field) { case 'password': $fieldList = array('password', 'confirm_password', 'captcha'); break; case 'email': $fieldList = array('email', 'captcha'); break; default: $fieldList = array(); } if ($Model->save($data, compact('validate', 'fieldList')) && $Model->Tokenization->deleteAll(array($Model->Tokenization->alias . '.user_id' => $id, $Model->Tokenization->alias . '.field' => $field, $Model->Tokenization->alias . '.action' => 'reset'))) { return true; } return false; }
/** * Handles interactive baking * * @return boolean */ protected function _interactive() { $this->hr(); $this->out(__d('cake_console', "Bake Model\nPath: %s", $this->getPath())); $this->hr(); $this->interactive = true; $primaryKey = 'id'; $validate = $associations = array(); if (empty($this->connection)) { $this->connection = $this->DbConfig->getConfig(); } $currentModelName = $this->getName(); $useTable = $this->getTable($currentModelName); $db = ConnectionManager::getDataSource($this->connection); $fullTableName = $db->fullTableName($useTable); if (!in_array($useTable, $this->_tables)) { $prompt = __d('cake_console', "The table %s doesn't exist or could not be automatically detected\ncontinue anyway?", $useTable); $continue = $this->in($prompt, array('y', 'n')); if (strtolower($continue) == 'n') { return false; } } $tempModel = new Model(array('name' => $currentModelName, 'table' => $useTable, 'ds' => $this->connection)); $knownToExist = false; try { $fields = $tempModel->schema(true); $knownToExist = true; } catch (Exception $e) { $fields = array($tempModel->primaryKey); } if (!array_key_exists('id', $fields)) { $primaryKey = $this->findPrimaryKey($fields); } if ($knownToExist) { $displayField = $tempModel->hasField(array('name', 'title')); if (!$displayField) { $displayField = $this->findDisplayField($tempModel->schema()); } $prompt = __d('cake_console', "Would you like to supply validation criteria \nfor the fields in your model?"); $wannaDoValidation = $this->in($prompt, array('y', 'n'), 'y'); if (array_search($useTable, $this->_tables) !== false && strtolower($wannaDoValidation) == 'y') { $validate = $this->doValidation($tempModel); } $prompt = __d('cake_console', "Would you like to define model associations\n(hasMany, hasOne, belongsTo, etc.)?"); $wannaDoAssoc = $this->in($prompt, array('y', 'n'), 'y'); if (strtolower($wannaDoAssoc) == 'y') { $associations = $this->doAssociations($tempModel); } } $this->out(); $this->hr(); $this->out(__d('cake_console', 'The following Model will be created:')); $this->hr(); $this->out(__d('cake_console', "Name: %s", $currentModelName)); if ($this->connection !== 'default') { $this->out(__d('cake_console', "DB Config: %s", $this->connection)); } if ($fullTableName !== Inflector::tableize($currentModelName)) { $this->out(__d('cake_console', 'DB Table: %s', $fullTableName)); } if ($primaryKey != 'id') { $this->out(__d('cake_console', 'Primary Key: %s', $primaryKey)); } if (!empty($validate)) { $this->out(__d('cake_console', 'Validation: %s', print_r($validate, true))); } if (!empty($associations)) { $this->out(__d('cake_console', 'Associations:')); $assocKeys = array('belongsTo', 'hasOne', 'hasMany', 'hasAndBelongsToMany'); foreach ($assocKeys as $assocKey) { $this->_printAssociation($currentModelName, $assocKey, $associations); } } $this->hr(); $looksGood = $this->in(__d('cake_console', 'Look okay?'), array('y', 'n'), 'y'); if (strtolower($looksGood) == 'y') { $vars = compact('associations', 'validate', 'primaryKey', 'useTable', 'displayField'); $vars['useDbConfig'] = $this->connection; if ($this->bake($currentModelName, $vars)) { if ($this->_checkUnitTest()) { $this->bakeFixture($currentModelName, $useTable); $this->bakeTest($currentModelName, $useTable, $associations); } } } else { return false; } }
/** * Handles interactive baking * * @access private */ function __interactive() { $this->hr(); $this->out(sprintf("Bake Model\nPath: %s", $this->path)); $this->hr(); $this->interactive = true; $primaryKey = 'id'; $validate = $associations = array(); if (empty($this->connection)) { $this->connection = $this->DbConfig->getConfig(); } $currentModelName = $this->getName(); $useTable = $this->getTable($currentModelName); $db =& ConnectionManager::getDataSource($this->connection); $fullTableName = $db->fullTableName($useTable); if (in_array($useTable, $this->_tables)) { $tempModel = new Model(array('name' => $currentModelName, 'table' => $useTable, 'ds' => $this->connection)); $fields = $tempModel->schema(true); if (!array_key_exists('id', $fields)) { $primaryKey = $this->findPrimaryKey($fields); } } else { $this->err(sprintf(__('Table %s does not exist, cannot bake a model without a table.', true), $useTable)); $this->_stop(); return false; } $displayField = $tempModel->hasField(array('name', 'title')); if (!$displayField) { $displayField = $this->findDisplayField($tempModel->schema()); } $prompt = __("Would you like to supply validation criteria \nfor the fields in your model?", true); $wannaDoValidation = $this->in($prompt, array('y', 'n'), 'y'); if (array_search($useTable, $this->_tables) !== false && strtolower($wannaDoValidation) == 'y') { $validate = $this->doValidation($tempModel); } $prompt = __("Would you like to define model associations\n(hasMany, hasOne, belongsTo, etc.)?", true); $wannaDoAssoc = $this->in($prompt, array('y', 'n'), 'y'); if (strtolower($wannaDoAssoc) == 'y') { $associations = $this->doAssociations($tempModel); } $this->out(); $this->hr(); $this->out(__('The following Model will be created:', true)); $this->hr(); $this->out("Name: " . $currentModelName); if ($this->connection !== 'default') { $this->out(sprintf(__("DB Config: %s", true), $this->connection)); } if ($fullTableName !== Inflector::tableize($currentModelName)) { $this->out(sprintf(__("DB Table: %s", true), $fullTableName)); } if ($primaryKey != 'id') { $this->out(sprintf(__("Primary Key: %s", true), $primaryKey)); } if (!empty($validate)) { $this->out(sprintf(__("Validation: %s", true), print_r($validate, true))); } if (!empty($associations)) { $this->out(__("Associations:", true)); $assocKeys = array('belongsTo', 'hasOne', 'hasMany', 'hasAndBelongsToMany'); foreach ($assocKeys as $assocKey) { $this->_printAssociation($currentModelName, $assocKey, $associations); } } $this->hr(); $looksGood = $this->in(__('Look okay?', true), array('y', 'n'), 'y'); if (strtolower($looksGood) == 'y') { $vars = compact('associations', 'validate', 'primaryKey', 'useTable', 'displayField'); $vars['useDbConfig'] = $this->connection; if ($this->bake($currentModelName, $vars)) { if ($this->_checkUnitTest()) { $this->bakeFixture($currentModelName, $useTable); $this->bakeTest($currentModelName, $useTable, $associations); } } } else { return false; } }
/** * Validate that the desired sorting can be performed on the $object. Only fields or * virtualFields can be sorted on. The direction param will also be sanitized. Lastly * sort + direction keys will be converted into the model friendly order key. * * You can use the whitelist parameter to control which columns/fields are available for sorting. * This helps prevent users from ordering large result sets on un-indexed values. * * @param Model $object The model being paginated. * @param array $options The pagination options being used for this request. * @param array $whitelist The list of columns that can be used for sorting. If empty all keys are allowed. * @return array An array of options with sort + direction removed and replaced with order if possible. */ public function validateSort(Model $object, array $options, array $whitelist = array()) { if (isset($options['sort'])) { $direction = null; if (isset($options['direction'])) { $direction = strtolower($options['direction']); } if (!in_array($direction, array('asc', 'desc'))) { $direction = 'asc'; } $options['order'] = array($options['sort'] => $direction); } if (!empty($whitelist) && isset($options['order']) && is_array($options['order'])) { $field = key($options['order']); if (!in_array($field, $whitelist)) { $options['order'] = null; } } if (!empty($options['order']) && is_array($options['order'])) { $order = array(); foreach ($options['order'] as $key => $value) { $field = $key; $alias = $object->alias; if (strpos($key, '.') !== false) { list($alias, $field) = explode('.', $key); } if ($object->hasField($field)) { $order[$alias . '.' . $field] = $value; } elseif ($object->hasField($key, true)) { $order[$field] = $value; } elseif (isset($object->{$alias}) && $object->{$alias}->hasField($field, true)) { $order[$alias . '.' . $field] = $value; } } $options['order'] = $order; } return $options; }
/** * A convenience method for returning a hierarchical array used for HTML select boxes * * @param Model $Model Model instance * @param mixed $conditions SQL conditions as a string or as an array('field' =>'value',...) * @param string $keyPath A string path to the key, i.e. "{n}.Post.id" * @param string $valuePath A string path to the value, i.e. "{n}.Post.title" * @param string $spacer The character or characters which will be repeated * @param integer $recursive The number of levels deep to fetch associated records * @return array An associative array of records, where the id is the key, and the display field is the value * @link http://book.cakephp.org/2.0/en/core-libraries/behaviors/tree.html#TreeBehavior::generateTreeList */ public function generateTreeList($Model, $conditions = null, $keyPath = null, $valuePath = null, $spacer = '_', $recursive = null) { $overrideRecursive = $recursive; extract($this->settings[$Model->alias]); if (!is_null($overrideRecursive)) { $recursive = $overrideRecursive; } if ($keyPath == null && $valuePath == null && $Model->hasField($Model->displayField)) { $fields = array($Model->primaryKey, $Model->displayField, $left, $right); } else { $fields = null; } if ($keyPath == null) { $keyPath = '{n}.' . $Model->alias . '.' . $Model->primaryKey; } if ($valuePath == null) { $valuePath = array('{0}{1}', '{n}.tree_prefix', '{n}.' . $Model->alias . '.' . $Model->displayField); } elseif (is_string($valuePath)) { $valuePath = array('{0}{1}', '{n}.tree_prefix', $valuePath); } else { $valuePath[0] = '{' . (count($valuePath) - 1) . '}' . $valuePath[0]; $valuePath[] = '{n}.tree_prefix'; } $order = $Model->alias . '.' . $left . ' asc'; $results = $Model->find('all', compact('conditions', 'fields', 'order', 'recursive')); $stack = array(); foreach ($results as $i => $result) { while ($stack && $stack[count($stack) - 1] < $result[$Model->alias][$right]) { array_pop($stack); } $results[$i]['tree_prefix'] = str_repeat($spacer, count($stack)); $stack[] = $result[$Model->alias][$right]; } if (empty($results)) { return array(); } return Set::combine($results, $keyPath, $valuePath); }
/** * Validate that the desired sorting can be performed on the $object. Only fields or * virtualFields can be sorted on. The direction param will also be sanitized. Lastly * sort + direction keys will be converted into the model friendly order key. * * You can use the whitelist parameter to control which columns/fields are available for sorting. * This helps prevent users from ordering large result sets on un-indexed values. * * @param Model $object The model being paginated. * @param array $options The pagination options being used for this request. * @param array $whitelist The list of columns that can be used for sorting. If empty all keys are allowed. * @return array An array of options with sort + direction removed and replaced with order if possible. */ public function validateSort($object, $options, $whitelist = array()) { if (isset($options['sort'])) { $direction = null; if (isset($options['direction'])) { $direction = strtolower($options['direction']); } if ($direction != 'asc' && $direction != 'desc') { $direction = 'asc'; } $options['order'] = array($options['sort'] => $direction); } if (!empty($whitelist)) { $field = key($options['order']); if (!in_array($field, $whitelist)) { $options['order'] = null; } } if (!empty($options['order']) && is_array($options['order'])) { $alias = $object->alias; $key = $field = key($options['order']); if (strpos($key, '.') !== false) { list($alias, $field) = explode('.', $key); } $value = $options['order'][$key]; unset($options['order'][$key]); if ($object->hasField($field)) { $options['order'][$alias . '.' . $field] = $value; } elseif ($object->hasField($field, true)) { $options['order'][$field] = $value; } elseif (isset($object->{$alias}) && $object->{$alias}->hasField($field)) { $options['order'][$alias . '.' . $field] = $value; } } return $options; }
/** * beforeSave is called before a model is saved. Returning false from a beforeSave callback * will abort the save operation. * * @param Model $model Model using this behavior * @param array $options Options passed from Model::save(). * @return mixed False if the operation should abort. Any other result will continue. * @see Model::save() */ public function beforeSave(Model $model, $options = array()) { if (!empty($model->hasMany['Audit'])) { if ($model->id = !empty($model->id) ? $model->id : (!empty($model->data[$model->alias]['id']) ? $model->data[$model->alias]['id'] : '')) { $this->data[$model->id]['Audit']['entity'] = (!empty($model->plugin) ? $model->plugin . '.' : '') . $model->name; $this->data[$model->id]['Audit']['entity_id'] = $model->id; $this->data[$model->id]['Audit']['event'] = $model->exists() ? 'UPDATE' : 'CREATE'; $this->data[$model->id]['Audit']['new'] = $this->data[$model->id]['Audit']['old'] = array(); $this->data[$model->id]['Audit']['creator_id'] = !empty($model->data['Creator']['id']) ? $model->data['Creator']['id'] : null; $model->data = Hash::remove($model->data, 'Creator'); if ($this->data[$model->id]['Audit']['event'] == 'CREATE') { $this->data[$model->id]['Audit']['old'] = json_encode(array()); $this->data[$model->id]['Audit']['new'] = json_encode($model->data[$model->alias]); } else { if ($this->data[$model->id]['Audit']['event'] == 'UPDATE') { $old = $model->find('first', array('conditions' => array($model->alias . '.id' => $model->id), 'recursive' => -1)); foreach ($model->data[$model->alias] as $field => $value) { if ($field == 'updated') { continue; } if ($model->hasField($field) && $old[$model->alias][$field] != $value) { $this->data[$model->id]['Audit']['old'][$field] = $old[$model->alias][$field]; $this->data[$model->id]['Audit']['new'][$field] = $value; } } if (!empty($this->data[$model->id]['Audit']['old']) && !empty($this->data[$model->id]['Audit']['new'])) { $this->data[$model->id]['Audit']['old'] = json_encode($this->data[$model->id]['Audit']['old']); $this->data[$model->id]['Audit']['new'] = json_encode($this->data[$model->id]['Audit']['new']); } } } } } return parent::beforeSave($model, $options); }
/** * A convenience method for returning a hierarchical array used for HTML select boxes * * @param Model $Model Model instance * @param string|array $conditions SQL conditions as a string or as an array('field' =>'value',...) * @param string $keyPath A string path to the key, i.e. "{n}.Post.id" * @param string $valuePath A string path to the value, i.e. "{n}.Post.title" * @param string $spacer The character or characters which will be repeated * @param integer $recursive The number of levels deep to fetch associated records * @return array An associative array of records, where the id is the key, and the display field is the value * @link http://book.cakephp.org/2.0/en/core-libraries/behaviors/tree.html#TreeBehavior::generateTreeList */ public function generateTreeList(Model $Model, $conditions = null, $keyPath = null, $valuePath = null, $spacer = '_', $recursive = null) { $overrideRecursive = $recursive; extract($this->settings[$Model->alias]); if (!is_null($overrideRecursive)) { $recursive = $overrideRecursive; } $fields = null; if (!$keyPath && !$valuePath && $Model->hasField($Model->displayField)) { $fields = array($Model->primaryKey, $Model->displayField, $left, $right); } if (!$keyPath) { $keyPath = '{n}.' . $Model->alias . '.' . $Model->primaryKey; } if (!$valuePath) { $valuePath = array('%s%s', '{n}.tree_prefix', '{n}.' . $Model->alias . '.' . $Model->displayField); } elseif (is_string($valuePath)) { $valuePath = array('%s%s', '{n}.tree_prefix', $valuePath); } else { array_unshift($valuePath, '%s' . $valuePath[0], '{n}.tree_prefix'); } $order = $Model->escapeField($left) . " asc"; $results = $Model->find('all', compact('conditions', 'fields', 'order', 'recursive')); $stack = array(); foreach ($results as $i => $result) { $count = count($stack); while ($stack && $stack[$count - 1] < $result[$Model->alias][$right]) { array_pop($stack); $count--; } $results[$i]['tree_prefix'] = str_repeat($spacer, $count); $stack[] = $result[$Model->alias][$right]; } if (empty($results)) { return array(); } return Hash::combine($results, $keyPath, $valuePath); }
/** * Generates an array of params to be used in Router::url() to get a link to the reported object view page * * @param AppModel $Model * @param string $id the reported object identifier * @return array */ public function reportedObjectUrl(Model $Model, $id) { $modelName = Configure::read('Problems.Models.' . $Model->alias); if ($Model->hasField('slug')) { $id = $Model->field('slug', array('id' => $id)); } return array('admin' => false, 'controller' => Inflector::tableize($Model->name), 'action' => 'view', $id, 'plugin' => current(pluginSplit($modelName))); }
/** * Run before a model is saved, used to set up slug for model. * * @param object $Model Model about to be saved. * @return bool True if save should proceed, false otherwise */ public function geocode(Model $Model, $return = true) { // Make address fields an array if (!is_array($this->settings[$Model->alias]['address'])) { $addressfields = array($this->settings[$Model->alias]['address']); } else { $addressfields = $this->settings[$Model->alias]['address']; } $addressfields = array_unique($addressfields); // Make sure all address fields are available if ($this->settings[$Model->alias]['real']) { foreach ($addressfields as $field) { if (!$Model->hasField($field)) { return $return; } } } $addressData = array(); foreach ($addressfields as $field) { if (!empty($Model->data[$Model->alias][$field])) { $addressData[] = $Model->data[$Model->alias][$field]; } } $Model->data[$Model->alias]['geocoder_result'] = array(); if ((!$this->settings[$Model->alias]['real'] || $Model->hasField($this->settings[$Model->alias]['lat']) && $Model->hasField($this->settings[$Model->alias]['lng'])) && ($this->settings[$Model->alias]['overwrite'] || empty($Model->data[$Model->alias][$this->settings[$Model->alias]['lat']]) || (int) $Model->data[$Model->alias][$this->settings[$Model->alias]['lat']] === 0 && (int) $Model->data[$Model->alias][$this->settings[$Model->alias]['lng']] === 0)) { if (!empty($Model->whitelist) && (!in_array($this->settings[$Model->alias]['lat'], $Model->whitelist) || !in_array($this->settings[$Model->alias]['lng'], $Model->whitelist))) { return $return; } } $geocode = $this->_geocode($addressData, $this->settings[$Model->alias]); if (empty($geocode) && !empty($this->settings[$Model->alias]['allowEmpty'])) { return true; } if (empty($geocode)) { return false; } // If both are 0, thats not valid, otherwise continue if (empty($geocode['lat']) && empty($geocode['lng'])) { // Prevent 0 inserts of incorrect runs if (isset($Model->data[$Model->alias][$this->settings[$Model->alias]['lat']])) { unset($Model->data[$Model->alias][$this->settings[$Model->alias]['lat']]); } if (isset($Model->data[$Model->alias][$this->settings[$Model->alias]['lng']])) { unset($Model->data[$Model->alias][$this->settings[$Model->alias]['lng']]); } if ($this->settings[$Model->alias]['require']) { if ($fields = $this->settings[$Model->alias]['invalidate']) { $Model->invalidate($fields[0], $fields[1], isset($fields[2]) ? $fields[2] : true); } return false; } return true; } // Valid lat/lng found $Model->data[$Model->alias][$this->settings[$Model->alias]['lat']] = $geocode['lat']; $Model->data[$Model->alias][$this->settings[$Model->alias]['lng']] = $geocode['lng']; if (!empty($this->settings[$Model->alias]['formatted_address'])) { $Model->data[$Model->alias][$this->settings[$Model->alias]['formatted_address']] = $geocode['formatted_address']; } else { if (isset($Model->data[$Model->alias][$this->settings[$Model->alias]['formatted_address']])) { unset($Model->data[$Model->alias][$this->settings[$Model->alias]['formatted_address']]); } } $Model->data[$Model->alias]['geocoder_result'] = $geocode; $Model->data[$Model->alias]['geocoder_result']['address_data'] = implode(' ', $addressData); if (!empty($this->settings[$Model->alias]['update'])) { foreach ($this->settings[$Model->alias]['update'] as $key => $field) { if (!empty($geocode[$key])) { $Model->data[$Model->alias][$field] = $geocode[$key]; } } } return $return; }
/** * 時限公開のconditionsを返す * * @param Model $model 対象モデル * @return array */ protected function _getPublicTypeConditions(Model $model) { $netCommonsTime = new NetCommonsTime(); $limitedConditions = array(); $limitedConditions[$model->alias . '.public_type'] = self::PUBLIC_TYPE_LIMITED; if ($model->hasField('publish_start')) { $limitedConditions[] = array('OR' => array($model->alias . '.publish_start <=' => $netCommonsTime->getNowDatetime(), $model->alias . '.publish_start' => null)); } if ($model->hasField('publish_end')) { $limitedConditions[] = array('OR' => array($model->alias . '.publish_end >=' => $netCommonsTime->getNowDatetime(), $model->alias . '.publish_end' => null)); } $publicTypeConditions = array('OR' => array($model->alias . '.public_type' => self::PUBLIC_TYPE_PUBLIC, $limitedConditions)); return $publicTypeConditions; }
/** * 公開するメール送信日時 ゲット * * @param Model $model モデル * @return date 送信日時 */ private function __getSendTimePublish(Model $model) { // DBに項目があり期限付き公開の時のみ、公開日時を取得する(ブログを想定)。その後、未来日メール送られる if ($model->hasField(['public_type', 'publish_start']) && $model->data[$model->alias]['public_type'] == WorkflowBehavior::PUBLIC_TYPE_LIMITED) { return $model->data[$model->alias]['publish_start']; } $publishStartField = Hash::get($this->settings, $model->alias . '.publishStartField'); if (is_null($publishStartField)) { return null; } // DBに指定の項目があったら公開日時を取得する(アンケートを想定)。その後、未来日メール送られる return $model->data[$model->alias][$publishStartField]; }