Example #1
0
 public function init()
 {
     if (isset($this->sp['resource'])) {
         if (!$this->sp['resource']->richtext) {
             return false;
         }
     }
     $useEditor = $this->modx->getOption('use_editor', false);
     $whichEditor = $this->modx->getOption('which_editor', '');
     if ($useEditor && $whichEditor != 'MarkdownEditor') {
         $initCondition = $this->md->getOption('init.condition');
         if (empty($initCondition)) {
             $initCondition = '[]';
         }
         $initCondition = $this->modx->fromJSON($initCondition);
         if (!empty($initCondition)) {
             $c = $this->modx->newQuery('modResource');
             $c->where([['id' => $this->sp['resource']->id], $initCondition]);
             $check = $this->modx->getObject('modResource', $c);
             if ($check) {
                 $this->modx->setOption('which_editor', 'MarkdownEditor');
                 $whichEditor = 'MarkdownEditor';
             }
         }
     }
     if ($useEditor && $whichEditor == 'MarkdownEditor') {
         return true;
     }
     return false;
 }
Example #2
0
 /**
  * Loads snippet for form processing
  *
  * @param $action
  * @param array $fields
  *
  * @return array|string
  */
 public function process($action, array $fields = array())
 {
     if (!isset($_SESSION['AjaxForm'][$action])) {
         return $this->error('af_err_action_nf');
     }
     unset($fields['af_action'], $_POST['af_action']);
     $scriptProperties = $_SESSION['AjaxForm'][$action];
     $scriptProperties['fields'] = $fields;
     $scriptProperties['AjaxForm'] = $this;
     $name = $scriptProperties['snippet'];
     $set = '';
     if (strpos($name, '@') !== false) {
         list($name, $set) = explode('@', $name);
     }
     /** @var modSnippet $snippet */
     if ($snippet = $this->modx->getObject('modSnippet', array('name' => $name))) {
         $properties = $snippet->getProperties();
         $property_set = !empty($set) ? $snippet->getPropertySet($set) : array();
         $scriptProperties = array_merge($properties, $property_set, $scriptProperties);
         $snippet->_cacheable = false;
         $snippet->_processed = false;
         $response = $snippet->process($scriptProperties);
         if (strtolower($snippet->name) == 'formit') {
             $response = $this->handleFormIt($scriptProperties);
         }
         return $response;
     } else {
         return $this->error('af_err_snippet_nf', array(), array('name' => $name));
     }
 }
 /**
  * Gets a task by its ID or namespace and reference
  *
  * @param string|int $namespaceOrId
  * @param string $reference
  * @return null|sTask
  */
 public function getTask($namespaceOrId, $reference = '')
 {
     if (is_numeric($namespaceOrId) && empty($reference)) {
         $condition = $namespaceOrId;
     } else {
         $condition = array('namespace' => $namespaceOrId, 'reference' => $reference);
     }
     $task = $this->modx->getObject('sTask', $condition);
     return $task;
 }
Example #4
0
 /**
  * @param string $tpl
  *
  * @return int
  */
 public function getLastModified($tpl)
 {
     /** @var modChunk $chunk */
     if ($chunk = $this->modx->getObject('modTemplate', array('templatename' => $tpl))) {
         if ($chunk->isStatic() && ($file = $chunk->getSourceFile())) {
             return filemtime($file);
         }
     }
     return time();
 }
Example #5
0
 /**
  * @param string $tpl
  *
  * @return int
  */
 public function getLastModified($tpl)
 {
     $c = is_numeric($tpl) && $tpl > 0 ? $tpl : array('name' => $tpl);
     /** @var modChunk $chunk */
     if ($chunk = $this->modx->getObject('modChunk', $c)) {
         if ($chunk->isStatic() && ($file = $chunk->getSourceFile())) {
             return filemtime($file);
         }
     }
     return time();
 }
Example #6
0
 /**
  * Gets an element object of the specifed type
  * 
  * @todo Keep getting "Call to a member function getObject() on a non-object" 
  * 
  * @param modX $modx
  * @param string $type
  * @param integer | string $criteria (ID or name of the element) 
  * 
  * @return Element | boolean
  */
 public static function get(modX $modx, $type, $criteria)
 {
     if (is_int($criteria)) {
         $element = $modx->getObject($type, $criteria);
     } else {
         $element = $modx->getObject($type, array(Element::get_name_field($type) => $criteria));
     }
     if (isset($element)) {
         return new Element($element);
     }
     return false;
 }
Example #7
0
 /**
  * Move a thread to a new board
  *
  * @param int $boardId
  * @return boolean True if successful
  */
 public function move($boardId)
 {
     $oldBoard = $this->getOne('Board');
     $newBoard = is_object($boardId) && $boardId instanceof disBoard ? $boardId : $this->xpdo->getObject('disBoard', $boardId);
     if (!$oldBoard || !$newBoard) {
         return false;
     }
     $this->addOne($newBoard);
     if ($this->save()) {
         /* readjust all posts */
         $posts = $this->getMany('Posts');
         foreach ($posts as $post) {
             $post->set('board', $newBoard->get('id'));
             $post->save();
         }
         /* adjust old board topics/reply counts */
         $oldBoard->set('num_topics', $oldBoard->get('num_topics') - 1);
         $replies = $oldBoard->get('num_replies') - $this->get('replies');
         $oldBoard->set('num_replies', $replies);
         $total_posts = $oldBoard->get('total_posts') - $this->get('replies') - 1;
         $oldBoard->set('total_posts', $total_posts);
         /* recalculate latest post */
         $oldBoardLastPost = $this->xpdo->getObject('disPost', array('id' => $oldBoard->get('last_post')));
         if ($oldBoardLastPost && $oldBoardLastPost->get('id') == $this->get('post_last')) {
             $newLastPost = $oldBoard->get2ndLatestPost();
             if ($newLastPost) {
                 $oldBoard->set('last_post', $newLastPost->get('id'));
                 $oldBoard->addOne($newLastPost, 'LastPost');
             }
         }
         $oldBoard->save();
         /* adjust new board topics/reply counts */
         $newBoard->set('num_topics', $oldBoard->get('num_topics') - 1);
         $replies = $newBoard->get('num_replies') + $this->get('replies');
         $newBoard->set('num_replies', $replies);
         $total_posts = $newBoard->get('total_posts') + $this->get('replies') + 1;
         $newBoard->set('total_posts', $total_posts);
         /* recalculate latest post */
         $newBoardLastPost = $this->xpdo->getObject('disPost', array('id' => $newBoard->get('last_post')));
         $thisThreadPost = $this->getOne('LastPost');
         if ($newBoardLastPost && $thisThreadPost && $newBoardLastPost->get('createdon') < $thisThreadPost->get('createdon')) {
             $newBoard->set('last_post', $thisThreadPost->get('id'));
             $newBoard->addOne($thisThreadPost, 'LastPost');
         }
         $newBoard->save();
         /* Update ThreadRead board field */
         $this->xpdo->exec('UPDATE ' . $this->xpdo->getTableName('disThreadRead') . '
             SET ' . $this->xpdo->escape('board') . ' = ' . $newBoard->get('id') . '
             WHERE ' . $this->xpdo->escape('thread') . ' = ' . $this->get('id') . '
         ');
         /* clear caches */
         if (!defined('DISCUSS_IMPORT_MODE')) {
             $this->xpdo->getCacheManager();
             $this->xpdo->cacheManager->delete('discuss/thread/' . $this->get('id'));
             $this->xpdo->cacheManager->delete('discuss/board/' . $newBoard->get('id'));
             $this->xpdo->cacheManager->delete('discuss/board/' . $oldBoard->get('id'));
         }
     }
     return true;
 }
Example #8
0
 /**
  * Validates a field based on a custom rule, if specified
  *
  * @access public
  * @param string $key The key of the field
  * @param mixed $value The value of the field
  * @param string $type Optional. The type of the validator to apply. Can
  * either be a method name of lgnValidator or a Snippet name.
  * @return boolean True if validation was successful. If not, will store
  * error messages to $this->errors.
  */
 public function validate($key, $value, $type = '')
 {
     $validated = false;
     $hasParams = strpos($type, '=');
     $param = null;
     if ($hasParams !== false) {
         $param = str_replace('`', '', substr($type, $hasParams + 1, strlen($type)));
         $type = substr($type, 0, $hasParams);
     }
     $invNames = array('validate', 'validateFields', '_addError', '__construct');
     if (method_exists($this, $type) && $type != 'validate') {
         /* built-in validator */
         $validated = $this->{$type}($key, $value, $param);
     } else {
         if ($snippet = $this->modx->getObject('modSnippet', array('name' => $type))) {
             /* custom snippet validator */
             $props = array_merge($this->login->config, array('key' => $key, 'value' => $value, 'param' => $param, 'type' => $type, 'validator' => &$this, 'errors' => &$this->errors));
             $validated = $snippet->process($props);
         } else {
             /* no validator found */
             $this->modx->log(modX::LOG_LEVEL_ERROR, '[Register] Could not find validator "' . $type . '" for field "' . $key . '".');
             $validated = true;
         }
     }
     if (is_array($validated) && !empty($validated)) {
         foreach ($validated as $key => $errMsg) {
             $this->_addError($key, $errMsg);
         }
         $validated = false;
     } elseif ($validated !== '1' && $validated !== 1 && $validated !== true) {
         $this->_addError($key, $validated);
         $validated = false;
     }
     return $validated;
 }
Example #9
0
 public function postInstall()
 {
     /* fix settings_version */
     /** @var \modSystemSetting $object */
     $object = $this->xpdo->getObject('modSystemSetting', array('key' => 'settings_version'));
     if (!$object) {
         $object = $this->xpdo->newObject('modSystemSetting');
         $object->fromArray(array('key' => 'settings_version', 'area' => 'system', 'namespace' => 'core', 'xtype' => 'textfield'), '', true);
     }
     $object->set('value', $this->xpdo->version['full_version']);
     $object->save(false);
     /* fix session_cookie_domain */
     $object = $this->xpdo->getObject('modSystemSetting', array('key' => 'session_cookie_domain'));
     if (!$object) {
         $object = $this->xpdo->newObject('modSystemSetting');
         $object->fromArray(array('key' => 'session_cookie_domain', 'area' => 'session', 'namespace' => 'core', 'xtype' => 'textfield'), '', true);
     }
     $object->set('value', '');
     $object->save(false);
     /* fix session_cookie_path */
     $object = $this->xpdo->getObject('modSystemSetting', array('key' => 'session_cookie_path'));
     if (!$object) {
         $object = $this->xpdo->newObject('modSystemSetting');
         $object->fromArray(array('key' => 'session_cookie_path', 'area' => 'session', 'namespace' => 'core', 'xtype' => 'textfield'), '', true);
     }
     $object->set('value', $this->xpdo->getOption('base_url', null, MODX_BASE_URL));
     $object->save(false);
 }
 /**
  * Handle DELETE requests
  * @return array
  */
 public function delete()
 {
     $id = $this->getProperty($this->primaryKeyField, false);
     if (empty($id)) {
         return $this->failure($this->modx->lexicon('rest.err_field_ns', array('field' => $this->primaryKeyField)));
     }
     $c = $this->getPrimaryKeyCriteria($id);
     $this->object = $this->modx->getObject($this->classKey, $c);
     if (empty($this->object)) {
         return $this->failure($this->modx->lexicon('rest.err_obj_nf', array('class_key' => $this->classKey)));
     }
     if (!empty($this->deleteRequiredFields)) {
         if (!$this->checkRequiredFields($this->deleteRequiredFields)) {
             return $this->failure();
         }
     }
     $this->object->fromArray($this->getProperties());
     $beforeDelete = $this->beforeDelete();
     if ($beforeDelete !== true) {
         return $this->failure($beforeDelete === false ? $this->errorMessage : $beforeDelete);
     }
     if (!$this->object->{$this->deleteMethod}()) {
         $this->setObjectErrors();
         return $this->failure($this->modx->lexicon('rest.err_class_remove', array('class_key' => $this->classKey)));
     }
     $objectArray = $this->object->toArray();
     $this->afterDelete($objectArray);
     return $this->success('', $objectArray);
 }
Example #11
0
 /**
  * Gets an array of emails for all moderators of this thread
  * 
  * @return array
  */
 public function getModeratorEmails()
 {
     $moderatorNames = $this->get('moderators');
     $moderatorNames = explode(',', $moderatorNames);
     $moderators = array();
     foreach ($moderatorNames as $name) {
         $c = $this->xpdo->newQuery('modUser');
         $c->innerJoin('modUserProfile', 'Profile');
         $c->select(array('modUser.id', 'Profile.email'));
         $c->where(array('username' => $name));
         $user = $this->xpdo->getObject('modUser', $c);
         if ($user) {
             $moderators[] = $user->get('email');
         }
     }
     /* now get usergroup moderators */
     $moderatorGroup = $this->get('moderator_group');
     $c = $this->xpdo->newQuery('modUserProfile');
     $c->innerJoin('modUser', 'User');
     $c->innerJoin('modUserGroupMember', 'UserGroupMembers', 'User.id = UserGroupMembers.member');
     $c->innerJoin('modUserGroup', 'UserGroup', 'UserGroup.id = UserGroupMembers.user_group');
     $c->where(array('UserGroup.name' => $moderatorGroup));
     $members = $this->xpdo->getCollection('modUserProfile', $c);
     foreach ($members as $member) {
         $email = $member->get('email');
         if (!empty($email)) {
             array_push($moderators, $email);
         }
     }
     $moderators = array_unique($moderators);
     return $moderators;
 }
Example #12
0
 /**
  * Migrate ignore boards into Users
  * 
  * @return void
  */
 public function migrateIgnoreBoards()
 {
     $this->log('Migrating Ignore Boards...');
     $this->log('Collecting User cache...');
     $c = $this->modx->newQuery('disUser');
     $c->sortby('username', 'ASC');
     $c->where(array('ignore_boards:!=' => ''));
     $users = $this->modx->getCollection('disUser', $c);
     /** @var disUser $user */
     foreach ($users as $user) {
         $boards = explode(',', $user->get('ignore_boards'));
         if (!empty($boards)) {
             $this->log('Migrating ' . count($boards) . ' boards for ' . $user->get('username'));
             $newBoards = array();
             foreach ($boards as $board) {
                 /** @var disBoard $b */
                 $b = $this->modx->getObject('disBoard', array('integrated_id' => $board));
                 if ($b) {
                     $newBoards[] = $b->get('id');
                 }
             }
             if (!empty($newBoards)) {
                 $user->set('ignore_boards', implode(',', $newBoards));
                 if ($this->config['live']) {
                     $user->save();
                 }
             }
         }
     }
 }
Example #13
0
 /** @inheritdoc} */
 public function getProfitResourceGroups($id = 0)
 {
     $groups = array();
     $key = $this->MlmSystem->namespace;
     $options = array('cache_key' => $key . '/profit/group/' . __CLASS__ . '/resource/' . $id, 'cacheTime' => 0);
     if ($resource = $this->modx->getObject('modResource', array('id' => $id)) and !($groups = $this->MlmSystem->getCache($options))) {
         $ids = $this->modx->getParentIds($id, 10, array('context' => $resource->get('context_key')));
         $ids[] = $id;
         $ids = array_unique($ids);
         $q = $this->modx->newQuery('modResourceGroupResource', array('document:IN' => $ids));
         $q->leftJoin('MlmSystemProfitGroup', 'MlmSystemProfitGroup', 'MlmSystemProfitGroup.group = modResourceGroupResource.document_group');
         $q->where(array('MlmSystemProfitGroup.class' => 'modResourceGroup'));
         $q->select('document_group,profit');
         $q->sortby('profit');
         $q->groupby('MlmSystemProfitGroup.group');
         $tstart = microtime(true);
         if ($q->prepare() && $q->stmt->execute()) {
             $this->modx->queryTime += microtime(true) - $tstart;
             $this->modx->executedQueries++;
             while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
                 $groups[$row['document_group']] = $row['profit'];
             }
         }
         $this->MlmSystem->setCache($groups, $options);
     }
     return $groups;
 }
Example #14
0
 /**
  * Prepare a JSON encoded object and return a valid JSON encoded Image+ object
  *
  * @param $json JSON value to prepare
  * @param array $opts
  * @param modTemplateVar $tv
  * @return string
  */
 public function prepareTvValue($json, $opts = array(), modTemplateVar $tv)
 {
     // Prepare value
     $decoded = json_decode($json);
     if (!$decoded) {
         // The variable does not contain an Image+ image object
         if ($json != '') {
             // Get Media Source
             /** @var modMediaSource $source */
             if ($tv) {
                 $source = $tv->getSource($this->modx->resource ? $this->modx->resource->get('context_key') : 'mgr');
             } else {
                 $source = $this->modx->getObject('modMediaSource', $this->modx->getOption('default_media_source'));
             }
             if (!($source && $source->getWorkingContext())) {
                 $this->modx->log(xPDO::LOG_LEVEL_ERROR, 'Invalid Media Source', '', 'Image+');
                 return '';
             }
             $source->setRequestProperties($_REQUEST);
             $source->initialize();
             // The variable contains a value and has to be converted to an Image+ image object
             $imgPath = $source->getBasePath() . $json;
             if (file_exists($imgPath)) {
                 $size = getimagesize($imgPath);
             } else {
                 $this->modx->log(xPDO::LOG_LEVEL_INFO, 'The template variabe value does not contain an existing image', '', 'Image+');
             }
             $json = json_encode(array('altTag' => '', 'crop' => array('height' => $size ? $size[1] : 0, 'width' => $size ? $size[0] : 0, 'x' => 0, 'y' => 0), 'sourceImg' => array('height' => $size ? $size[1] : 0, 'width' => $size ? $size[0] : 0, 'source' => $source->get('id'), 'src' => $json), 'targetHeight' => (int) $opts['targetHeight'], 'targetWidth' => (int) $opts['targetWidth']));
         }
     }
     return $json;
 }
Example #15
0
 /**
  * Redirect to a specified URL.
  *
  * Properties needed:
  * - redirectTo - the ID of the Resource to redirect to.
  *
  * @param array $fields An array of cleaned POST fields
  * @return boolean False if unsuccessful.
  */
 public function redirect(array $fields = array())
 {
     if (empty($this->formit->config['redirectTo'])) {
         return false;
     }
     $redirectParams = !empty($this->formit->config['redirectParams']) ? $this->formit->config['redirectParams'] : '';
     if (!empty($redirectParams)) {
         $prefix = $this->modx->getOption('placeholderPrefix', $this->formit->config, 'fi.');
         $this->modx->setPlaceholders($fields, $prefix);
         $this->modx->parser->processElementTags('', $redirectParams, true, true);
         $redirectParams = $this->modx->fromJSON($redirectParams);
         if (empty($redirectParams)) {
             $redirectParams = '';
         }
     }
     $contextKey = $this->modx->context->get('key');
     $resource = $this->modx->getObject('modResource', $this->formit->config['redirectTo']);
     if ($resource) {
         $contextKey = $resource->get('context_key');
     }
     if (!is_numeric($this->formit->config['redirectTo']) && isset($fields[$this->formit->config['redirectTo']]) && is_numeric($fields[$this->formit->config['redirectTo']])) {
         $url = $this->modx->makeUrl($fields[$this->formit->config['redirectTo']], $contextKey, $redirectParams, 'full');
     } elseif (!is_numeric($this->formit->config['redirectTo']) && substr($this->formit->config['redirectTo'], 0, 4) === "http") {
         $url = $this->formit->config['redirectTo'];
     } else {
         $url = $this->modx->makeUrl($this->formit->config['redirectTo'], $contextKey, $redirectParams, 'full');
     }
     $this->setRedirectUrl($url);
     return true;
 }
Example #16
0
 /**
  * Return the appropriate Resource controller class based on the class_key request parameter
  * 
  * @static
  * @param modX $modx A reference to the modX instance
  * @param string $className The controller class name that is attempting to be loaded
  * @param array $config An array of configuration options for the action
  * @return modManagerController The proper controller class
  */
 public static function getInstance(modX &$modx, $className, array $config = array())
 {
     $resourceClass = 'modDocument';
     $isDerivative = false;
     if (!empty($_REQUEST['class_key'])) {
         $isDerivative = true;
         $resourceClass = in_array($_REQUEST['class_key'], array('modDocument', 'modResource')) ? 'modResource' : $_REQUEST['class_key'];
     } else {
         if (!empty($_REQUEST['id'])) {
             /** @var modResource $resource */
             $resource = $modx->getObject('modResource', $_REQUEST['id']);
             if ($resource && !in_array($resource->get('class_key'), array('modDocument', 'modResource'))) {
                 $isDerivative = true;
                 $resourceClass = $resource->get('class_key');
             }
         }
     }
     if ($isDerivative) {
         $resourceClass = str_replace(array('../', '..', '/', '\\'), '', $resourceClass);
         $delegateView = $modx->call($resourceClass, 'getControllerPath', array(&$modx));
         $action = strtolower(str_replace(array('Resource', 'ManagerController'), '', $className));
         $className = str_replace('mod', '', $resourceClass) . ucfirst($action) . 'ManagerController';
         $controllerFile = $delegateView . $action . '.class.php';
         require_once $controllerFile;
     }
     $controller = new $className($modx, $config);
     $controller->resourceClass = $resourceClass;
     return $controller;
 }
 public function find(array $search = array(), array $args = array())
 {
     $results = array();
     $where = array_merge(array('query' => false, 'tag' => false, 'sorter' => false, 'start' => 0, 'limit' => 10, 'dateFormat' => '%b %d, %Y', 'supportsSeparator' => ', '), $search);
     $where['page'] = !empty($where['start']) ? round($where['start'] / $where['limit']) : 0;
     /** @var modRestResponse $response */
     $response = $this->request('package', 'GET', $where);
     if ($response->isError()) {
         $this->xpdo->log(xPDO::LOG_LEVEL_ERROR, $response->getError(), '', __METHOD__, __FILE__, __LINE__);
         return $results;
     }
     $xml = $response->toXml();
     /** @var SimpleXMLElement $package */
     foreach ($xml as $package) {
         $installed = $this->xpdo->getObject('transport.modTransportPackage', (string) $package->signature);
         $versionCompiled = rtrim((string) $package->version . '-' . (string) $package->release, '-');
         $releasedon = strftime($this->arg('dateFormat', $where), strtotime((string) $package->releasedon));
         $supports = '';
         foreach ($package->supports as $support) {
             $supports .= (string) $support . $this->arg('supportsSeparator', $where);
         }
         $results[] = array('id' => (string) $package->id, 'version' => (string) $package->version, 'release' => (string) $package->release, 'signature' => (string) $package->signature, 'author' => (string) $package->author, 'description' => (string) $package->description, 'instructions' => (string) $package->instructions, 'changelog' => (string) $package->changelog, 'createdon' => (string) $package->createdon, 'editedon' => (string) $package->editedon, 'name' => (string) $package->name, 'downloads' => number_format((int) $package->downloads, 0), 'releasedon' => $releasedon, 'screenshot' => (string) $package->screenshot, 'thumbnail' => !empty($package->thumbnail) ? (string) $package->thumbnail : (string) $package->screenshot, 'license' => (string) $package->license, 'minimum_supports' => (string) $package->minimum_supports, 'breaks_at' => (int) $package->breaks_at != 10000000 ? (string) $package->breaks_at : '', 'supports_db' => (string) $package->supports_db, 'location' => (string) $package->location, 'version-compiled' => $versionCompiled, 'downloaded' => !empty($installed) ? true : false, 'featured' => (bool) $package->featured, 'audited' => (bool) $package->audited, 'dlaction-icon' => $installed ? 'package-installed' : 'package-download', 'dlaction-text' => $installed ? $this->xpdo->lexicon('downloaded') : $this->xpdo->lexicon('download'));
     }
     return array((int) $xml['total'], $results);
 }
 /**
  * Get the statistics for the bottom area of the forums
  * @return void
  */
 protected function getStatistics()
 {
     $this->setPlaceholder('totalPosts', number_format((int) $this->getPostCount()));
     $this->setPlaceholder('totalTopics', number_format((int) $this->getThreadCount()));
     $this->setPlaceholder('totalMembers', number_format((int) $this->modx->getCount('disUser')));
     /* active in last 40 */
     if ($this->modx->getOption('discuss.show_whos_online', null, true)) {
         $this->setPlaceholder('activeUsers', $this->discuss->hooks->load('user/active_in_last'));
     } else {
         $this->setPlaceholder('activeUsers', '');
     }
     /* total active */
     $this->setPlaceholder('totalMembersActive', number_format((int) $this->modx->getCount('disSession', array('user:!=' => 0))));
     $this->setPlaceholder('totalVisitorsActive', number_format((int) $this->modx->getCount('disSession', array('user' => 0))));
     /**
      * forum activity
      * @var disForumActivity $activity
      */
     $activity = $this->modx->getObject('disForumActivity', array('day' => date('Y-m-d')));
     if (!$activity) {
         $activity = $this->modx->newObject('disForumActivity');
         $activity->set('day', date('Y-m-d'));
         $activity->save();
     }
     $this->setPlaceholders($activity->toArray('activity.'));
 }
Example #19
0
 /**
  * Setup this resource as an archive so that FURLs can be effectively mapped
  *
  * @param integer $resourceId The ID of the resource to allow as an archive
  * @param string $prefix The filterPrefix used by that archive
  */
 public function makeArchive($resourceId, $prefix = 'arc_')
 {
     $value = $resourceId . ':' . $prefix;
     $isNew = false;
     $setting = $this->modx->getObject('modSystemSetting', array('key' => 'archivist.archive_ids'));
     if (!$setting) {
         /** @var modSystemSetting $setting */
         $setting = $this->modx->newObject('modSystemSetting');
         $setting->fromArray(array('key' => 'archivist.archive_ids', 'namespace' => 'archivist', 'area' => 'furls', 'xtype' => 'textfield'), '', true, true);
         $isNew = true;
     } else {
         $oldValue = $setting->get('value');
         if (strpos($oldValue, $resourceId . ':') !== false) {
             /* dont append if already there */
             $value = $oldValue;
         } else {
             $value = $oldValue . ',' . $value;
         }
     }
     $setting->set('value', $value);
     $saved = $setting->save();
     if ($isNew) {
         $this->_clearCache();
     }
     return $saved;
 }
Example #20
0
 /**
  * Gets a Chunk and caches it; also falls back to file-based templates
  * for easier debugging.
  *
  * Will always use the file-based chunk if $debug is set to true.
  *
  * @access public
  * @param string $name The name of the Chunk
  * @param array $properties The properties for the Chunk
  * @return string The processed content of the Chunk
  */
 public function getChunk($name, $properties = array())
 {
     $chunk = null;
     if (substr($name, 0, 6) == "@CODE:") {
         $content = substr($name, 6);
         $chunk = $this->modx->newObject('modChunk');
         $chunk->setContent($content);
     } elseif (!isset($this->chunks[$name])) {
         if (!$this->config['debug']) {
             $chunk = $this->modx->getObject('modChunk', array('name' => $name), true);
         }
         if (empty($chunk)) {
             $chunk = $this->_getTplChunk($name);
             if ($chunk == false) {
                 return false;
             }
         }
         $this->chunks[$name] = $chunk->getContent();
     } else {
         $o = $this->chunks[$name];
         $chunk = $this->modx->newObject('modChunk');
         $chunk->setContent($o);
     }
     $chunk->setCacheable(false);
     return $chunk->process($properties);
 }
Example #21
0
 /**
  * Sends notification email to moderators telling them the comment is awaiting approval.
  *
  * @return boolean True if successful
  */
 public function notifyModerators()
 {
     if (!$this->_loadLexicon()) {
         return false;
     }
     $this->xpdo->lexicon->load('quip:emails');
     /** @var quipThread $thread */
     $thread = $this->getOne('Thread');
     if (!$thread) {
         return false;
     }
     $properties = $this->toArray();
     $properties['url'] = $this->makeUrl('', array(), array('scheme' => 'full'));
     /**
      * Get the Quip mgr action
      * @var modAction $action
      */
     $action = $this->xpdo->getObject('modAction', array('controller' => 'index', 'namespace' => 'quip'));
     if ($action) {
         $managerUrl = MODX_URL_SCHEME . MODX_HTTP_HOST . MODX_MANAGER_URL;
         $properties['approveUrl'] = $managerUrl . '?a=' . $action->get('id') . '&quip_unapproved=1&quip_approve=' . $this->get('id');
         $properties['rejectUrl'] = $managerUrl . '?a=' . $action->get('id') . '&quip_unapproved=1&quip_reject=' . $this->get('id');
         $properties['unapprovedUrl'] = $managerUrl . '?a=' . $action->get('id') . '&quip_unapproved=1';
     }
     $body = $this->xpdo->lexicon('quip.email_moderate', $properties);
     $subject = $this->xpdo->lexicon('quip.email_moderate_subject');
     $success = true;
     $moderators = $thread->getModeratorEmails();
     if (!empty($moderators)) {
         $success = $this->sendEmail($subject, $body, $moderators);
     }
     return $success;
 }
Example #22
0
 /**
  * Allow user to prepare single row by custom snippet before render chunk
  * This method was developed in cooperation with Agel_Nash
  *
  * @param array $row
  *
  * @return array
  */
 public function prepareRow($row = array())
 {
     if ($this->preparing) {
         return $row;
     }
     if (!empty($this->config['prepareSnippet'])) {
         $this->preparing = true;
         $name = trim($this->config['prepareSnippet']);
         /** @var modSnippet $snippet */
         if (!($snippet = $this->getStore($name, 'snippet'))) {
             if ($snippet = $this->modx->getObject('modSnippet', array('name' => $name))) {
                 $this->setStore($name, $snippet, 'snippet');
             } else {
                 $this->addTime('Could not load snippet "' . $name . '" for preparation of row.');
                 return '';
             }
         }
         $snippet->_cacheable = false;
         $snippet->_processed = false;
         $tmp = $snippet->process(array('pdoTools' => $this, 'pdoFetch' => $this, 'row' => $row));
         $tmp = $tmp[0] == '[' || $tmp[0] == '{' ? $this->modx->fromJSON($tmp, 1) : unserialize($tmp);
         if (!is_array($tmp)) {
             $this->addTime('Preparation snippet must return an array, instead of "' . gettype($tmp) . '"');
         } else {
             $row = array_merge($row, $tmp);
         }
         $this->preparing = false;
     }
     return $row;
 }
Example #23
0
 /**
  * Validates a field based on a custom rule, if specified
  *
  * @access public
  * @param string $key The key of the field
  * @param mixed $value The value of the field
  * @param string $type Optional. The type of the validator to apply. Can
  * either be a method name of fiValidator or a Snippet name.
  * @return boolean True if validation was successful. If not, will store
  * error messages to $this->errors.
  */
 public function validate($key, $value, $type = '')
 {
     /** @var boolean|array $validated */
     $validated = false;
     /** @var mixed $value Trim spaces from the value before validating **/
     if (!empty($this->config['trim_values_before_validation'])) {
         $value = trim($value);
     }
     /** @var boolean $hasParams */
     $hasParams = $this->config['use_multibyte'] ? mb_strpos($type, '=', 0, $this->config['encoding']) : strpos($type, '=');
     /** @var string|null $param The parameter value, if one is set */
     $param = null;
     if ($hasParams !== false) {
         $len = $this->config['use_multibyte'] ? mb_strlen($type, $this->config['encoding']) : strlen($type);
         $s = $this->config['use_multibyte'] ? mb_substr($type, $hasParams + 1, $len, $this->config['encoding']) : substr($type, $hasParams + 1, $len);
         $param = str_replace(array('`', '^'), '', $s);
         $type = $this->config['use_multibyte'] ? mb_substr($type, 0, $hasParams, $this->config['encoding']) : substr($type, 0, $hasParams);
     }
     /** @var array $invNames An array of invalid hook names to skip */
     $invNames = array('validate', 'validateFields', 'addError', '__construct');
     $customValidators = !empty($this->config['customValidators']) ? $this->config['customValidators'] : '';
     $customValidators = explode(',', $customValidators);
     if (method_exists($this, $type) && !in_array($type, $invNames)) {
         /* built-in validator */
         $validated = $this->{$type}($key, $value, $param);
         /* only allow specified validators to prevent brute force execution of unwanted snippets */
     } else {
         if (in_array($type, $customValidators)) {
             /* attempt to grab custom validator */
             /** @var modSnippet|null $snippet */
             $snippet = $this->modx->getObject('modSnippet', array('name' => $type));
             if ($snippet) {
                 /* custom snippet validator */
                 $props = array_merge($this->formit->config, array('key' => $key, 'value' => $value, 'param' => $param, 'type' => $type, 'validator' => &$this, 'errors' => &$this->errors));
                 $validated = $snippet->process($props);
             } else {
                 /* no validator found */
                 $this->modx->log(modX::LOG_LEVEL_ERROR, '[FormIt] Could not find validator "' . $type . '" for field "' . $key . '".');
                 $validated = true;
             }
         } else {
             $this->modx->log(modX::LOG_LEVEL_INFO, '[FormIt] Validator "' . $type . '" for field "' . $key . '" was not specified in the customValidators property.');
             $validated = true;
         }
     }
     /** handle return value errors */
     if (!empty($validated)) {
         if (is_array($validated)) {
             foreach ($validated as $key => $errMsg) {
                 $this->addError($key, $errMsg);
             }
             $validated = false;
         } elseif ($validated !== '1' && $validated !== 1 && $validated !== true) {
             $this->addError($key, $validated);
             $validated = false;
         }
     }
     return $validated;
 }
 public static function getInstance(modX &$modx, $className, $properties = array())
 {
     $object = $modx->getObject('modResource', $properties['id']);
     $classKey = !empty($properties['class_key']) ? $properties['class_key'] : ($object ? $object->get('class_key') : 'modDocument');
     $className = 'msProductDisableCacheUpdateProcessor';
     $processor = new $className($modx, $properties);
     return $processor;
 }
Example #25
0
 /**
  * Parse a chunk (with template bindings)
  * Modified parseTplElement method from getResources package (https://github.com/opengeek/getResources)
  *
  * @param $type
  * @param $source
  * @param null $properties
  * @return bool
  */
 private function parseChunk($type, $source, $properties = null)
 {
     $output = false;
     if (!is_string($type) || !in_array($type, $this->_validTypes)) {
         $type = $this->modx->getOption('tplType', $properties, '@CHUNK');
     }
     $content = false;
     switch ($type) {
         case '@FILE':
             $path = $this->modx->getOption('tplPath', $properties, $this->modx->getOption('assets_path', $properties, MODX_ASSETS_PATH) . 'elements/chunks/');
             $key = $path . $source;
             if (!isset($this->_tplCache['@FILE'])) {
                 $this->_tplCache['@FILE'] = array();
             }
             if (!array_key_exists($key, $this->_tplCache['@FILE'])) {
                 if (file_exists($key)) {
                     $content = file_get_contents($key);
                 }
                 $this->_tplCache['@FILE'][$key] = $content;
             } else {
                 $content = $this->_tplCache['@FILE'][$key];
             }
             if (!empty($content) && $content !== '0') {
                 $chunk = $this->modx->newObject('modChunk', array('name' => $key));
                 $chunk->setCacheable(false);
                 $output = $chunk->process($properties, $content);
             }
             break;
         case '@INLINE':
             $uniqid = uniqid();
             $chunk = $this->modx->newObject('modChunk', array('name' => "{$type}-{$uniqid}"));
             $chunk->setCacheable(false);
             $output = $chunk->process($properties, $source);
             break;
         case '@CHUNK':
         default:
             $chunk = null;
             if (!isset($this->_tplCache['@CHUNK'])) {
                 $this->_tplCache['@CHUNK'] = array();
             }
             if (!array_key_exists($source, $this->_tplCache['@CHUNK'])) {
                 if ($chunk = $this->modx->getObject('modChunk', array('name' => $source))) {
                     $this->_tplCache['@CHUNK'][$source] = $chunk->toArray('', true);
                 } else {
                     $this->_tplCache['@CHUNK'][$source] = false;
                 }
             } elseif (is_array($this->_tplCache['@CHUNK'][$source])) {
                 $chunk = $this->modx->newObject('modChunk');
                 $chunk->fromArray($this->_tplCache['@CHUNK'][$source], '', true, true, true);
             }
             if (is_object($chunk)) {
                 $chunk->setCacheable(false);
                 $output = $chunk->process($properties);
             }
             break;
     }
     return $output;
 }
Example #26
0
 /**
  * Gets matching resources by tags. This is adapted function from miniShop1 for backward compatibility
  * @deprecated
  *
  * @param array $tags Tags for search
  * @param int $only_ids Return only ids of matched resources
  * @param int $strict 0 - goods must have at least one specified tag
  *					  1 - goods must have all specified tags, but can have more
  * 					  2 - goods must have exactly the same tags.
  * @return array $ids Or array with resources with data and tags
  */
 function getTagged($tags = array(), $strict = 0, $only_ids = 0)
 {
     if (!is_array($tags)) {
         $tags = explode(',', $tags);
     }
     $q = $this->modx->newQuery('msProductOption', array('key' => 'tags', 'value:IN' => $tags));
     $q->select('product_id');
     $ids = array();
     if ($q->prepare() && $q->stmt->execute()) {
         $ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
     }
     $ids = array_unique($ids);
     // If needed only ids of not strictly mathed items - return.
     if (!$strict && $only_ids) {
         return $ids;
     }
     // Filtering ids
     $count = count($tags);
     /* @var PDOStatement $stmt*/
     if ($strict) {
         foreach ($ids as $key => $product_id) {
             if ($strict > 1) {
                 $sql = "SELECT COUNT(*) FROM {$this->modx->getTableName('msProductOption')} WHERE `product_id` = {$product_id} AND `key` = 'tags';";
                 $stmt = $this->modx->prepare($sql);
                 $stmt->execute();
                 if ($stmt->fetch(PDO::FETCH_COLUMN) != $count) {
                     unset($ids[$key]);
                     continue;
                 }
             }
             foreach ($tags as $tag) {
                 $sql = "SELECT COUNT(`product_id`) FROM {$this->modx->getTableName('msProductOption')} WHERE `product_id` = {$product_id} AND `key` = 'tags' AND `value` = '{$tag}';";
                 $stmt = $this->modx->prepare($sql);
                 $stmt->execute();
                 if (!$stmt->fetch(PDO::FETCH_COLUMN)) {
                     unset($ids[$key]);
                     break;
                 }
             }
         }
     }
     // Return strictly ids, if needed
     $ids = array_unique($ids);
     if ($only_ids) {
         return $ids;
     }
     // Process results
     $data = array();
     foreach ($ids as $id) {
         if (!$only_ids) {
             if ($res = $this->modx->getObject('msProduct', $id)) {
                 $data[$id] = $res->toArray();
             }
         }
     }
     return $data;
 }
Example #27
0
 /**
  * @param string $ctx
  * @param $source
  *
  * @return bool|null|object
  */
 public function initializeMediaSource($ctx = '', $source)
 {
     if ($this->mediaSource = $this->modx->getObject('sources.modMediaSource', $source)) {
         $this->mediaSource->set('ctx', $ctx);
         $this->mediaSource->initialize();
         return $this->mediaSource;
     } else {
         return false;
     }
 }
 public function findCategory(array $path, $root)
 {
     $currentParent = $root;
     $category = null;
     foreach ($path as $name) {
         $category = $this->modx->getObject('modCategory', array('parent' => $currentParent, 'category' => $name));
         $currentParent = $category->id;
     }
     return $category->id;
 }
Example #29
0
 /**
  * Get the path of the specified Namespace
  *
  * @param string $namespace The key of the Namespace
  * @return string The path for the Namespace
  */
 public function getNamespacePath($namespace = 'core') {
     $corePath = $this->modx->getOption('core_path',null,MODX_CORE_PATH);
     if ($namespace != 'core') {
         $namespaceObj = $this->modx->getObject('modNamespace',$namespace);
         if ($namespaceObj) {
             $corePath = $namespaceObj->get('path');
         }
     }
     return $corePath;
 }
Example #30
0
 /**
  * Checks that an event code is valid
  */
 private function eventcode($key, $value)
 {
     if ($regType = $this->modx->getObject('RSVPMeRegType', array('code' => $value))) {
         if (strtotime($regType->end) <= time()) {
             return $this->modx->lexicon('rsvpme.event_code_expired');
         }
         return true;
     }
     return $this->modx->lexicon('rsvpme.event_code_nf');
 }