. * */ namespace Vvveb\Controller\Content; use function Vvveb\__; use Vvveb\Controller\Listing; use function Vvveb\humanReadable; use Vvveb\Sql\PostSQL; use Vvveb\System\Cache; use Vvveb\System\Images; use Vvveb\System\User\Admin; use function Vvveb\url; class Posts extends Listing { protected $type = 'post'; //check for other modules permission like post and editor to enable links like save/delete etc protected $additionalPermissionCheck = ['content/post/save']; function init() { if (isset($this->request->get['type'])) { $this->type = $this->request->get['type']; } return parent::init(); } function duplicate() { $post_id = $this->request->post['post_id'] ?? false; if ($post_id) { $this->posts = new PostSQL(); $data = $this->posts->get(['post_id' => $post_id, 'type' => $this->type]); $old_id = $data['post_id']; unset($data['post_id']); $id = rand(1, 1000); foreach ($data['post_content'] as &$content) { unset($content['post_id']); $content['name'] .= ' [' . __('duplicate') . ']'; $content['slug'] .= '-' . __('duplicate') . "-$old_id-$id"; } if (isset($data['post_to_taxonomy_item'])) { foreach ($data['post_to_taxonomy_item'] as &$item) { $taxonomy_item_id[] = $item['taxonomy_item_id']; } } if (isset($data['post_to_site'])) { foreach ($data['post_to_site'] as &$item) { $site_id[] = $item['site_id']; } } if ($data) { $result = $this->posts->add([ 'post' => $data, 'post_content' => $data['post_content'], 'taxonomy_item_id' => $taxonomy_item_id ?? [], 'site_id' => $site_id, ]); if ($result && isset($result['post'])) { $post_id = $result['post']; $url = url(['module' => 'content/post', 'post_id' => $post_id, 'type' => $this->type]); $success = ucfirst($this->type) . __(' duplicated!'); $success .= sprintf(' %s', $url, __('Edit') . " {$this->type}"); $this->view->success['get'] = $success; //$this->session->set('success', $success); //$this->redirect(['module' => 'content/posts', 'type' => $this->type], [], false); } else { $this->view->errors[] = sprintf(__('Error duplicating %s!'), $this->type); } } } return $this->index(); } function delete() { $post_id = $this->request->post['post_id'] ?? false; if ($post_id) { if (is_numeric($post_id)) { $post_id = [$post_id]; } $this->posts = new postSQL(); $options = [ 'post_id' => $post_id, 'type' => $this->type, ] + $this->global; $result = $this->posts->delete($options); if ($result && isset($result['post'])) { $this->view->success[] = ucfirst($this->type) . __(' deleted!'); } else { $this->view->errors[] = sprintf(__('Error deleting %s!'), $this->type); } } return $this->index(); } function archives($options) { $options['interval'] = 'month'; $archives = $this->posts->getArchives($options); $return = []; $df = false; if (class_exists('\IntlDateFormatter')) { $dt = new \DateTime(); $df = new \IntlDateFormatter(\Vvveb\getLanguage(), \IntlDateFormatter::NONE, \IntlDateFormatter::NONE, NULL, NULL, 'MMMM'); } foreach ($archives['archives'] as $index => &$archive) { if (isset($archive['month'])) { $monthNum = $archive['month']; //$dateObj = \DateTime::createFromFormat('!m', $monthNum); //$monthName = $dateObj->format('F'); $archive['month_text'] = $monthNum; if ($df) { $archive['month_text'] = ucfirst(datefmt_format($df, $dt)); $dt->setDate(0, $archive['month'], 0); } else { $archive['month_text'] = date('F',mktime(0,0,0,$monthNum,1,$archive['year'])); } } $name = (isset($archive['day']) ? $archive['day'] . ' ' : '') . (isset($archive['month']) ? $archive['month_text'] . ' ' : '') . (isset($archive['year']) ? $archive['year'] . ' ' : ''); $archive['month'] = sprintf('%02d', $archive['month']); $return[$archive['year'] . '/' . $archive['month']] = $name; } /* $return = []; if (isset($archives['archives'])) { foreach ($archives['archives'] as $index => &$archive) { if (isset($archive['month'])) { $monthNum = $archive['month']; $archive['month_text'] = $monthNum; if ($df) { $dt->setDate(0, $archive['month'], 0); $archive['month_text'] = ucfirst(datefmt_format($df, $dt)); } } $archive['month'] = sprintf('%02d', $archive['month']); $name = (isset($archive['month']) ? $archive['month_text'] . ' ' : '') . (isset($archive['year']) ? $archive['year'] . ' ' : ''); $return[$archive['year'] . '/' . $archive['month']] = $name; } } */ return $return; } function index() { $view = $this->view; $this->posts = new postSQL(); $this->type = $this->request->get['type'] ?? 'post'; $this->filter = array_filter($this->request->get['filter'] ?? []); $options = [ 'type' => $this->type, 'comment_count' => true, ] + $this->global; if (Admin::hasCapability('view_other_posts')) { unset($options['admin_id']); } else { $options['admin_id'] = $this->global['admin_id']; } $options += $this->filter; //override admin if admin_id filter set if (isset($this->filter['admin_id'])) { $options['admin_id'] = $this->filter['admin_id']; } if (isset($this->filter['archives']) && $this->filter['archives']) { $archives = explode('/', $this->filter['archives']); $options['year'] = $archives[0]; $options['month'] = $archives[1]; } $results = $this->posts->getAll($options); $defaultTemplate = "content/{$this->type}.html"; if ($results && isset($results['post'])) { foreach ($results['post'] as $id => &$post) { if (isset($post['image'])) { $post['image'] = Images::image($post['image'], 'post'); } if (! $post['name'] && ($post['language_id'] != $this->global['default_language_id'])) { $post['name'] = '[' . __('No translation') . ']'; } $url = ['module' => 'content/post', 'post_id' => $post['post_id'], 'type' => $post['type']]; $adminPath = \Vvveb\adminPath(); $template = $post['template'] ? $post['template'] : $defaultTemplate; $post['url'] = url($url); $post['edit-url'] = $post['url']; $post['admin-url'] = url(['module' => 'content/posts']) . '&filter[admin_id_text]=' . $post['username'] . ' &filter[admin_id]=' . $post['admin_id']; $post['delete-url'] = url(['module' => 'content/posts', 'action' => 'delete'] + $url); // + ['post_id[]' => $post['post_id']]); $post['duplicate-url'] = url(['module' => 'content/posts', 'action' => 'duplicate'] + $url); // + ['post_id' => $post['post_id']]); $post['view-url'] = url("content/{$this->type}/index", $post + $url + ['host' => $this->global['host']]); $relativeUrl = url("content/{$this->type}/index", $post + $url); $post['design-url'] = url(['module' => 'editor/editor', 'name' => urlencode($post['name'] ?? ''), 'url' => $relativeUrl, 'template' => $template], false); } } //archives for filter $cache = Cache::getInstance(); $archives = $cache->cache('posts',"archives.{$this->type}.{$this->global['site_id']}" , function () use (&$options) { return $this->archives($options) ?? []; }, 259200); $view->set($results); $view->status = ['publish' => 'Publish', 'pending' => 'Pending', 'draft' => 'Draft', 'private' => 'Private', 'password' => 'Password']; $view->archives = $archives; $view->filter = $this->filter; $view->limit = $options['limit']; $view->type = $this->type; $view->addUrl = url(['module' => 'content/post', 'type' => $this->type]); $view->type_name = humanReadable(__($this->type)); $view->type_name_plural = humanReadable(__($view->type . 's')); } }