redirect_fields = ['user_id', 'cat_id', 'status', 'selected', 'attachment', 'month', 'lang', 'sortby', 'order', 'page', 'nb']; $this->loadDefaults(); } protected function loadDefaults() { // We could have added a behavior here, but we want default action // to be setup first dcDefaultPostActions::adminPostsActionsPage($this->core, $this); $this->core->callBehavior('adminPostsActionsPage', $this->core, $this); } public function beginPage($breadcrumb = '', $head = '') { if ($this->in_plugin) { echo '' . __('Entries') . '' . dcPage::jsLoad('js/_posts_actions.js') . $head . '' . $breadcrumb; } else { dcPage::open( __('Entries'), dcPage::jsLoad('js/_posts_actions.js') . $head, $breadcrumb ); } echo '

' . __('Back to entries list') . '

'; } public function endPage() { if ($this->in_plugin) { echo ''; } else { dcPage::close(); } } public function error(Exception $e) { $this->core->error->add($e->getMessage()); $this->beginPage(dcPage::breadcrumb( [ html::escapeHTML($this->core->blog->name) => '', $this->getCallerTitle() => $this->getRedirection(true), __('Entries actions') => '' ]) ); $this->endPage(); } protected function fetchEntries($from) { $params = []; if (!empty($from['entries'])) { $entries = $from['entries']; foreach ($entries as $k => $v) { $entries[$k] = (integer) $v; } $params['sql'] = 'AND P.post_id IN(' . implode(',', $entries) . ') '; } else { $params['sql'] = 'AND 1=0 '; } if (!isset($from['full_content']) || empty($from['full_content'])) { $params['no_content'] = true; } if (isset($from['post_type'])) { $params['post_type'] = $from['post_type']; } $posts = $this->core->blog->getPosts($params); while ($posts->fetch()) { $this->entries[$posts->post_id] = $posts->post_title; } $this->rs = $posts; } } class dcDefaultPostActions { public static function adminPostsActionsPage($core, $ap) { if ($core->auth->check('publish,contentadmin', $core->blog->id)) { $ap->addAction( [__('Status') => [ __('Publish') => 'publish', __('Unpublish') => 'unpublish', __('Schedule') => 'schedule', __('Mark as pending') => 'pending' ]], ['dcDefaultPostActions', 'doChangePostStatus'] ); } $ap->addAction( [__('Mark') => [ __('Mark as selected') => 'selected', __('Mark as unselected') => 'unselected' ]], ['dcDefaultPostActions', 'doUpdateSelectedPost'] ); $ap->addAction( [__('Change') => [ __('Change category') => 'category' ]], ['dcDefaultPostActions', 'doChangePostCategory'] ); $ap->addAction( [__('Change') => [ __('Change language') => 'lang' ]], ['dcDefaultPostActions', 'doChangePostLang'] ); if ($core->auth->check('admin', $core->blog->id)) { $ap->addAction( [__('Change') => [ __('Change author') => 'author']], ['dcDefaultPostActions', 'doChangePostAuthor'] ); } if ($core->auth->check('delete,contentadmin', $core->blog->id)) { $ap->addAction( [__('Delete') => [ __('Delete') => 'delete']], ['dcDefaultPostActions', 'doDeletePost'] ); } } public static function doChangePostStatus($core, dcPostsActionsPage $ap, $post) { switch ($ap->getAction()) { case 'unpublish':$status = 0; break; case 'schedule':$status = -1; break; case 'pending':$status = -2; break; default:$status = 1; break; } $posts_ids = $ap->getIDs(); if (empty($posts_ids)) { throw new Exception(__('No entry selected')); } $core->blog->updPostsStatus($posts_ids, $status); dcPage::addSuccessNotice(sprintf( __( '%d entry has been successfully updated to status : "%s"', '%d entries have been successfully updated to status : "%s"', count($posts_ids) ), count($posts_ids), $core->blog->getPostStatus($status)) ); $ap->redirect(true); } public static function doUpdateSelectedPost($core, dcPostsActionsPage $ap, $post) { $posts_ids = $ap->getIDs(); if (empty($posts_ids)) { throw new Exception(__('No entry selected')); } $action = $ap->getAction(); $core->blog->updPostsSelected($posts_ids, $action == 'selected'); if ($action == 'selected') { dcPage::addSuccessNotice(sprintf( __( '%d entry has been successfully marked as selected', '%d entries have been successfully marked as selected', count($posts_ids) ), count($posts_ids)) ); } else { dcPage::addSuccessNotice(sprintf( __( '%d entry has been successfully marked as unselected', '%d entries have been successfully marked as unselected', count($posts_ids) ), count($posts_ids)) ); } $ap->redirect(true); } public static function doDeletePost($core, dcPostsActionsPage $ap, $post) { $posts_ids = $ap->getIDs(); if (empty($posts_ids)) { throw new Exception(__('No entry selected')); } // Backward compatibility foreach ($posts_ids as $post_id) { # --BEHAVIOR-- adminBeforePostDelete $core->callBehavior('adminBeforePostDelete', (integer) $post_id); } # --BEHAVIOR-- adminBeforePostsDelete $core->callBehavior('adminBeforePostsDelete', $posts_ids); $core->blog->delPosts($posts_ids); dcPage::addSuccessNotice(sprintf( __( '%d entry has been successfully deleted', '%d entries have been successfully deleted', count($posts_ids) ), count($posts_ids)) ); $ap->redirect(false); } public static function doChangePostCategory($core, dcPostsActionsPage $ap, $post) { if (isset($post['new_cat_id'])) { $posts_ids = $ap->getIDs(); if (empty($posts_ids)) { throw new Exception(__('No entry selected')); } $new_cat_id = $post['new_cat_id']; if (!empty($post['new_cat_title']) && $core->auth->check('categories', $core->blog->id)) { $cur_cat = $core->con->openCursor($core->prefix . 'category'); $cur_cat->cat_title = $post['new_cat_title']; $cur_cat->cat_url = ''; $title = $cur_cat->cat_title; $parent_cat = !empty($post['new_cat_parent']) ? $post['new_cat_parent'] : ''; # --BEHAVIOR-- adminBeforeCategoryCreate $core->callBehavior('adminBeforeCategoryCreate', $cur_cat); $new_cat_id = $core->blog->addCategory($cur_cat, (integer) $parent_cat); # --BEHAVIOR-- adminAfterCategoryCreate $core->callBehavior('adminAfterCategoryCreate', $cur_cat, $new_cat_id); } $core->blog->updPostsCategory($posts_ids, $new_cat_id); $title = $core->blog->getCategory($new_cat_id); dcPage::addSuccessNotice(sprintf( __( '%d entry has been successfully moved to category "%s"', '%d entries have been successfully moved to category "%s"', count($posts_ids) ), count($posts_ids), html::escapeHTML($title->cat_title)) ); $ap->redirect(true); } else { $ap->beginPage( dcPage::breadcrumb( [ html::escapeHTML($core->blog->name) => '', $ap->getCallerTitle() => $ap->getRedirection(true), __('Change category for this selection') => '' ])); # categories list # Getting categories $categories_combo = dcAdminCombos::getCategoriesCombo( $core->blog->getCategories() ); echo '
' . $ap->getCheckboxes() . '

' . form::combo(['new_cat_id'], $categories_combo); if ($core->auth->check('categories', $core->blog->id)) { echo '

' . '

' . __('Create a new category for the post(s)') . '

' . '

' . form::field('new_cat_title', 30, 255) . '

' . '

' . form::combo('new_cat_parent', $categories_combo) . '

' . '
'; } echo $core->formNonce() . $ap->getHiddenFields() . form::hidden(['action'], 'category') . '

' . '
'; $ap->endPage(); } } public static function doChangePostAuthor($core, dcPostsActionsPage $ap, $post) { if (isset($post['new_auth_id']) && $core->auth->check('admin', $core->blog->id)) { $new_user_id = $post['new_auth_id']; $posts_ids = $ap->getIDs(); if (empty($posts_ids)) { throw new Exception(__('No entry selected')); } if ($core->getUser($new_user_id)->isEmpty()) { throw new Exception(__('This user does not exist')); } $cur = $core->con->openCursor($core->prefix . 'post'); $cur->user_id = $new_user_id; $cur->update('WHERE post_id ' . $core->con->in($posts_ids)); dcPage::addSuccessNotice(sprintf( __( '%d entry has been successfully set to user "%s"', '%d entries have been successfully set to user "%s"', count($posts_ids) ), count($posts_ids), html::escapeHTML($new_user_id)) ); $ap->redirect(true); } else { $usersList = ''; if ($core->auth->check('admin', $core->blog->id)) { $params = [ 'limit' => 100, 'order' => 'nb_post DESC' ]; $rs = $core->getUsers($params); $rsStatic = $rs->toStatic(); $rsStatic->extend('rsExtUser'); $rsStatic = $rsStatic->toExtStatic(); $rsStatic->lexicalSort('user_id'); while ($rsStatic->fetch()) { $usersList .= ($usersList != '' ? ',' : '') . '"' . $rsStatic->user_id . '"'; } } $ap->beginPage( dcPage::breadcrumb( [ html::escapeHTML($core->blog->name) => '', $ap->getCallerTitle() => $ap->getRedirection(true), __('Change author for this selection') => '']), dcPage::jsLoad('js/jquery/jquery.autocomplete.js') . '\n" ); echo '
' . $ap->getCheckboxes() . '

' . form::field('new_auth_id', 20, 255); echo $core->formNonce() . $ap->getHiddenFields() . form::hidden(['action'], 'author') . '

' . '
'; $ap->endPage(); } } public static function doChangePostLang($core, dcPostsActionsPage $ap, $post) { $posts_ids = $ap->getIDs(); if (empty($posts_ids)) { throw new Exception(__('No entry selected')); } if (isset($post['new_lang'])) { $new_lang = $post['new_lang']; $cur = $core->con->openCursor($core->prefix . 'post'); $cur->post_lang = $new_lang; $cur->update('WHERE post_id ' . $core->con->in($posts_ids)); dcPage::addSuccessNotice(sprintf( __( '%d entry has been successfully set to language "%s"', '%d entries have been successfully set to language "%s"', count($posts_ids) ), count($posts_ids), html::escapeHTML(l10n::getLanguageName($new_lang))) ); $ap->redirect(true); } else { $ap->beginPage( dcPage::breadcrumb( [ html::escapeHTML($core->blog->name) => '', $ap->getCallerTitle() => $ap->getRedirection(true), __('Change language for this selection') => '' ])); # lang list # Languages combo $rs = $core->blog->getLangs(['order' => 'asc']); $all_langs = l10n::getISOcodes(0, 1); $lang_combo = ['' => '', __('Most used') => [], __('Available') => l10n::getISOcodes(1, 1)]; while ($rs->fetch()) { if (isset($all_langs[$rs->post_lang])) { $lang_combo[__('Most used')][$all_langs[$rs->post_lang]] = $rs->post_lang; unset($lang_combo[__('Available')][$all_langs[$rs->post_lang]]); } else { $lang_combo[__('Most used')][$rs->post_lang] = $rs->post_lang; } } unset($all_langs); unset($rs); echo '
' . $ap->getCheckboxes() . '

' . form::combo('new_lang', $lang_combo); echo $core->formNonce() . $ap->getHiddenFields() . form::hidden(['action'], 'lang') . '

' . '
'; $ap->endPage(); } } }