Example #1
0
 /**
  * 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);
         }
     }
 }
Example #4
0
 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);
 }
Example #6
0
 public function beforeSave(Model $model)
 {
     if (empty($model->id) && $model->hasField('uuid')) {
         $model->data[$model->alias]['uuid'] = String::uuid();
     }
     return true;
 }
Example #7
0
 /**
  * {@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;
 }
Example #8
0
 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);
 }
Example #12
0
 /**
  * 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;
 }
Example #15
0
 /**
  * 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;
 }
Example #16
0
 /**
  * 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;
 }
Example #17
0
 /**
  * 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;
 }
Example #19
0
 /**
  * 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;
 }
Example #20
0
 /**
  * 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;
     }
 }
Example #21
0
 /**
  * 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;
     }
 }
Example #22
0
 /**
  * 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;
 }
Example #23
0
 /**
  * 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);
 }
Example #24
0
 /**
  * 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);
 }
Example #26
0
 /**
  * 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);
 }
Example #27
0
 /**
  * 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)));
 }
Example #28
0
 /**
  * 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;
 }
Example #29
0
 /**
  * 時限公開の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;
 }
Example #30
0
 /**
  * 公開するメール送信日時 ゲット
  *
  * @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];
 }