/** * * Update blog post item * @param int $id * @param array $data * @param array $current_data * @throws waException * @return int post id */ public function updateItem($id, $data = array(), $current_data = array()) { $plugin = array(); $contact_id = wa()->getUser()->getId(); foreach ($data as $field => $value) { if (!isset($this->fields[$field]) || $field == $this->id) { if (isset($data['plugin'])) { $plugin = $data['plugin']; } unset($data[$field]); } } if ($id) { if (!$current_data) { $current_data = $this->getByField(array($this->id => $id)); if (!$current_data) { throw new waException(_w('Post not found'), 404); } } if (!$contact_id) { //use author id for cron task $contact_id = $current_data['contact_id']; } } else { $current_data = array(); if (empty($data['contact_id'])) { $data['contact_id'] = $contact_id; } else { blogHelper::checkRights($data['blog_id'], $contact_id, $contact_id != $data['contact_id'] ? blogRightConfig::RIGHT_FULL : blogRightConfig::RIGHT_READ_WRITE); } } //check rights for non admin $source_data = array('contact_id' => isset($current_data['contact_id']) ? $current_data['contact_id'] : $data['contact_id'], 'blog_id' => isset($current_data['blog_id']) ? $current_data['blog_id'] : $data['blog_id']); $target_data = array('contact_id' => isset($data['contact_id']) ? $data['contact_id'] : $source_data['contact_id'], 'blog_id' => isset($data['blog_id']) ? $data['blog_id'] : $source_data['blog_id']); //check editor rights blogHelper::checkRights($source_data['blog_id'], $contact_id); //change blog if ($source_data['blog_id'] != $target_data['blog_id']) { //check editor rights for target blog blogHelper::checkRights($target_data['blog_id'], $contact_id, $contact_id != $target_data['contact_id'] ? blogRightConfig::RIGHT_FULL : blogRightConfig::RIGHT_READ_WRITE); //check (new) author rights if ($contact_id != $target_data['contact_id']) { //skip it = for admin it allowed //blogHelper::checkRights($target_data['blog_id'],$target_data['contact_id']); } } else { //check new author rights if ($contact_id != $target_data['contact_id'] && $target_data['contact_id'] != $source_data['contact_id']) { blogHelper::checkRights($target_data['blog_id'], $target_data['contact_id']); } } //status changes if (isset($data['status'])) { switch ($data['status']) { case self::STATUS_PUBLISHED: if (!isset($data['datetime']) || !$data['datetime']) { if (!isset($current_data['datetime']) || !$current_data['datetime']) { $data['datetime'] = date("Y-m-d H:i:s"); } elseif (isset($current_data['status']) && !in_array($current_data['status'], array(self::STATUS_PUBLISHED, self::STATUS_SCHEDULED))) { $data['datetime'] = date("Y-m-d H:i:s"); } else { unset($data['datetime']); } } break; case self::STATUS_DRAFT: if (!isset($data['datetime']) || !$data['datetime']) { if (!isset($current_data['datetime']) || !$current_data['datetime']) { $data['datetime'] = date("Y-m-d H:i:s"); } else { unset($data['datetime']); } } break; case self::STATUS_SCHEDULED: if (!isset($data['datetime']) || !$data['datetime']) { unset($data['datetime']); } break; case self::STATUS_DEADLINE: if (!isset($data['datetime']) || !$data['datetime'] || is_array($data['datetime']) && !$data['datetime'][0]) { $data['status'] = self::STATUS_DRAFT; $data['datetime'] = date("Y-m-d H:i:s"); } break; } } if (!$id && (!isset($data['contact_id']) || !$data['contact_id'])) { $data['contact_id'] = wa()->getUser()->getId(); } if (isset($data['url']) && strlen($data['url'])) { if (substr($data['url'], -1) == '/') { $data['url'] = preg_replace('~\\/+$~', '', $data['url']); } if (strpos($data['url'], '/') !== false) { throw new waException(_w('URL must not contain /')); } if ($this->checkUrl($data['url'], $id)) { throw new waException(_w('This address is already in use') . ' ' . $data['url']); } } else { //$data['url'] = blogHelper::transliterate($data['url']); } $edit = $id ? true : false; $event_map = array(0 => array(0 => array('post_presave', 'post_save'), self::STATUS_PUBLISHED => array('post_prepublish', 'post_publish'), self::STATUS_SCHEDULED => array('post_preshedule', 'post_shedule'), self::STATUS_DEADLINE => array('post_presave', 'post_save'), self::STATUS_DRAFT => array('post_presave', 'post_save')), self::STATUS_DRAFT => array(0 => array('post_presave', 'post_save'), self::STATUS_PUBLISHED => array('post_prepublish', 'post_publish'), self::STATUS_SCHEDULED => array('post_preshedule', 'post_shedule'), self::STATUS_DEADLINE => array('post_presave', 'post_save'), self::STATUS_DRAFT => array('post_presave', 'post_save')), self::STATUS_DEADLINE => array(0 => array('post_presave', 'post_save'), self::STATUS_PUBLISHED => array('post_prepublish', 'post_publish'), self::STATUS_SCHEDULED => array('post_preshedule', 'post_shedule'), self::STATUS_DEADLINE => array('post_presave', 'post_save'), self::STATUS_DRAFT => array('post_presave', 'post_save')), self::STATUS_SCHEDULED => array(0 => array('post_presave', 'post_save'), self::STATUS_PUBLISHED => array('post_prepublish', 'post_publish'), self::STATUS_SCHEDULED => array('post_presave', 'post_save'), self::STATUS_DEADLINE => array('post_presave', 'post_save'), self::STATUS_DRAFT => array('post_presave', 'post_save')), self::STATUS_PUBLISHED => array(0 => array('post_presave', 'post_save'), self::STATUS_PUBLISHED => array('post_presave', 'post_save'), self::STATUS_SCHEDULED => array('post_preshedule', 'post_shedule'), self::STATUS_DEADLINE => array('post_presave', 'post_save'), self::STATUS_DRAFT => array('post_presave', 'post_save'))); $events = $event_map[isset($current_data['status']) ? $current_data['status'] : 0][isset($data['status']) ? $data['status'] : 0]; $data['plugin'] = $plugin; /** * @event post_prepublish * @event post_preshedule * @event post_presave * @param array [string]mixed $data * @param array [string]int $data['id'] * @param array [string][string]mixed $data['plugin']['%plugin_id'] * @return array[%plugin_id%][%field%]string Error message for field %field% */ $errors = wa()->event(array_shift($events), $data); if ($id) { if ($source_data['blog_id'] != $target_data['blog_id']) { $comment_model = new blogCommentModel(); $comment_model->updateByField('post_id', $id, array('blog_id' => $target_data['blog_id'])); } $this->updateById($id, $data); $data[$this->id] = $id; } else { $id = $this->insert($data); blogActivity::setUserActivity(); $data[$this->id] = $id; if (!isset($data['url']) || strlen($data['url']) == 0) { $this->updateById($id, array('url' => $id)); } } //status changed //blog_id changed $data = array_merge($current_data, $data); $blog_model = new blogBlogModel(); if ($edit) { //unpublish if ($current_data['status'] == self::STATUS_PUBLISHED && $data['status'] != self::STATUS_PUBLISHED) { $blog_model->updateQty($data['blog_id'], '-1'); //publish } elseif ($current_data['status'] != self::STATUS_PUBLISHED && $data['status'] == self::STATUS_PUBLISHED) { $blog_model->updateQty($data['blog_id'], '+1'); //move } elseif (isset($current_data['blog_id']) && $current_data['status'] == self::STATUS_PUBLISHED && $data['status'] == self::STATUS_PUBLISHED && $current_data['blog_id'] != $data['blog_id']) { $blog_model->updateQty($data['blog_id'], '+1'); $blog_model->updateQty($current_data['blog_id'], '-1'); } } else { if ($data['status'] == self::STATUS_PUBLISHED) { $blog_model->updateQty($data['blog_id'], '+1'); } } /** * @event post_publish * @event post_shedule * @event post_save * @param array [string]mixed $data * @param array [string]int $data['id'] * @param array [string][string]mixed $data['plugin']['%plugin_id'] * @return void */ wa()->event(array_shift($events), $data); return $id; }