Index: system/classes/post.php =================================================================== --- system/classes/post.php (revision 4024) +++ system/classes/post.php (working copy) @@ -777,7 +777,9 @@ $form->title->class[] = 'check-change'; $form->title->tabindex = 1; $form->title->value = $this->title; + $form->title->add_validator( 'validate_required' ); + // Create the silos if ( count( Plugins::get_by_interface( 'MediaSilo' ) ) ) { $form->append('silos', 'silos'); @@ -855,7 +857,8 @@ $form->post_id->value = $this->id; $form->append('hidden', 'slug', 'null:null'); $form->slug->value = $this->slug; - +// $form->on_success( array( 'AdminHandler', 'form_publish_success' ), $this ); + $form->on_success( array( $this, 'form_publish_success' ) ); // Let plugins alter this form Plugins::act('form_publish', $form, $this, $context); @@ -863,6 +866,136 @@ return $form; } + public function form_publish_success( FormUI $form ) + { +Utils::debug( $this->id ); +// die(); + + $post_id = 0; +// if ( isset($this->handler_vars['id']) ) { + if ( isset($this->id) ) { +// $post_id = intval($this->handler_vars['id']); + $post_id = intval($this->id); + } + + // If an id has been passed in, we're updating an existing post, otherwise we're creating one + if ( 0 !== $post_id ) { + $post = Post::get( array( 'id' => $post_id, 'status' => Post::status( 'any' ) ) ); + + $this->theme->admin_page = sprintf(_t('Publish %s'), Plugins::filter('post_type_display', Post::type_name($post->content_type), 'singular')); +// $form = $post->get_form( 'admin' ); + + // Verify that the post hasn't already been updated since the form was loaded + if ( $post->modified != $form->modified->value ) { + Session::notice( _t( 'The post %1$s was updated since you made changes. Please review those changes before overwriting them.', array( sprintf('\'%2$s\'', $post->permalink, htmlspecialchars( $post->title ) ) ) ) ); + Utils::redirect( URL::get( 'admin', 'page=publish&id=' . $post->id ) ); + exit; + } + + // Don't try to update form values that have been removed by plugins + $expected = array('title', 'tags', 'content'); + + foreach ( $expected as $field ) { + if ( isset($form->$field) ) { + $post->$field = $form->$field->value; + } + } + if ( $form->newslug->value == '' ) { + Session::notice( _t( 'A post slug cannot be empty. Keeping old slug.' ) ); + } + elseif ( $form->newslug->value != $form->slug->value ) { + $post->slug = $form->newslug->value; + } + + // sorry, we just don't allow changing posts you don't have rights to + if ( ! ACL::access_check( $post->get_access(), 'edit' ) ) { + Session::error( _t( 'You don\'t have permission to edit that post' ) ); + $this->get_blank(); + } + // sorry, we just don't allow changing content types to types you don't have rights to + $user = User::identify(); + $type = 'post_' . Post::type_name( $form->content_type->value ); + if ( $form->content_type->value != $post->content_type && ( $user->cannot( $type ) || ! $user->can_any( array( 'own_posts' => 'edit', 'post_any' => 'edit', $type => 'edit' ) ) ) ) { + Session::error(_t('Changing content types is not allowed')); + $this->get_blank(); + } + $post->content_type = $form->content_type->value; + + // if not previously published and the user wants to publish now, change the pubdate to the current date/time + // if the post pubdate is <= the current date/time. + if ( ( $post->status != Post::status( 'published' ) ) + && ( $form->status->value == Post::status( 'published' ) ) + && ( HabariDateTime::date_create( $form->pubdate->value )->int <= HabariDateTime::date_create()->int ) + ) { + $post->pubdate = HabariDateTime::date_create(); + } + // else let the user change the publication date. + // If previously published and the new date is in the future, the post will be unpublished and scheduled. Any other status, and the post will just get the new pubdate. + // This will result in the post being scheduled for future publication if the date/time is in the future and the new status is published. + else { + $post->pubdate = HabariDateTime::date_create( $form->pubdate->value ); + } + $minor = $form->minor_edit->value && ($post->status != Post::status('draft')); + $post->status = $form->status->value; + } + else { + $post = new Post(); +// $form = $post->get_form( 'admin' ); + // check the user can create new posts of the set type. + $user = User::identify(); + $type = 'post_' . Post::type_name($form->content_type->value); + if ( ACL::user_cannot( $user, $type) || ( ! ACL::user_can( $user, 'post_any', 'create' ) && ! ACL::user_can( $user, $type, 'create') ) ) { + Session::error(_t('Creating that post type is denied')); + $this->get_blank(); + } + +// $form->set_option( 'form_action', URL::get('admin', 'page=publish' ) ); + $form->on_success( array( $this, 'form_publish_success' ) ); + + if ( HabariDateTime::date_create( $form->pubdate->value )->int > $post->pubdate->int ) { + $post->pubdate = HabariDateTime::date_create( $form->pubdate->value ); + } + + $postdata = array( + 'slug' => $form->newslug->value, + 'user_id' => User::identify()->id, + 'pubdate' => $post->pubdate, + 'status' => $form->status->value, + 'content_type' => $form->content_type->value, + ); + + // Don't try to add form values that have been removed by plugins + $expected = array('title', 'tags', 'content'); + + foreach ( $expected as $field ) { + if ( isset($form->$field) ) { + $postdata[$field] = $form->$field->value; + } + } + + $minor = false; + + $post = Post::create( $postdata ); + } + + if ( $post->pubdate->int > HabariDateTime::date_create()->int && $post->status == Post::status( 'published' ) ) { + $post->status = Post::status( 'scheduled' ); + } + + $post->info->comments_disabled = !$form->comments_enabled->value; + + Plugins::act('publish_post', $post, $form); + + $post->update( $minor ); + + $permalink = ( $post->status != Post::status( 'published' ) ) ? $post->permalink . '?preview=1' : $post->permalink; + Session::notice( sprintf( _t( 'The post %1$s has been saved as %2$s.' ), sprintf('\'%2$s\'', $permalink, htmlspecialchars( $post->title ) ), Post::status_name( $post->status ) ) ); + if ( $post->slug != Utils::slugify( $post->title ) ) { + Session::notice( sprintf( _t( 'The content address is \'%1$s\'.'), $post->slug )); + } + Utils::redirect( URL::get( 'admin', 'page=publish&id=' . $post->id ) ); + } + /** * Manage this post's comment form * Index: system/classes/adminhandler.php =================================================================== --- system/classes/adminhandler.php (revision 4024) +++ system/classes/adminhandler.php (working copy) @@ -426,7 +426,7 @@ /** * Fetches active modules for display on the dashboard */ - public function fetch_dashboard_modules() +/* public function fetch_dashboard_modules() { if ( count( Modules::get_all() ) == 0 ) { @@ -461,23 +461,28 @@ $this->theme->modules = $modules; } - +*/ /** * Handles POST requests from the publish page. */ public function post_publish() { + $this->get_publish(); + } + + public static function form_publish_success( FormUI $form , $thispost ) + { $post_id = 0; - if ( isset($this->handler_vars['id']) ) { - $post_id = intval($this->handler_vars['id']); + if ( isset($thispost->id) ) { + $post_id = intval($thispost->id); } - +Utils::debug( $post_id ); // If an id has been passed in, we're updating an existing post, otherwise we're creating one if ( 0 !== $post_id ) { $post = Post::get( array( 'id' => $post_id, 'status' => Post::status( 'any' ) ) ); - $this->theme->admin_page = sprintf(_t('Publish %s'), Plugins::filter('post_type_display', Post::type_name($post->content_type), 'singular')); - $form = $post->get_form( 'admin' ); + $thispost->theme->admin_page = sprintf(_t('Publish %s'), Plugins::filter('post_type_display', Post::type_name($post->content_type), 'singular')); +// $form = $post->get_form( 'admin' ); // Verify that the post hasn't already been updated since the form was loaded if ( $post->modified != $form->modified->value ) { @@ -504,14 +509,14 @@ // sorry, we just don't allow changing posts you don't have rights to if ( ! ACL::access_check( $post->get_access(), 'edit' ) ) { Session::error( _t( 'You don\'t have permission to edit that post' ) ); - $this->get_blank(); + $thispost->get_blank(); } // sorry, we just don't allow changing content types to types you don't have rights to $user = User::identify(); $type = 'post_' . Post::type_name( $form->content_type->value ); if ( $form->content_type->value != $post->content_type && ( $user->cannot( $type ) || ! $user->can_any( array( 'own_posts' => 'edit', 'post_any' => 'edit', $type => 'edit' ) ) ) ) { Session::error(_t('Changing content types is not allowed')); - $this->get_blank(); + $thispost->get_blank(); } $post->content_type = $form->content_type->value; @@ -534,16 +539,17 @@ } else { $post = new Post(); - $form = $post->get_form( 'admin' ); +// $form = $post->get_form( 'admin' ); // check the user can create new posts of the set type. $user = User::identify(); $type = 'post_' . Post::type_name($form->content_type->value); if ( ACL::user_cannot( $user, $type) || ( ! ACL::user_can( $user, 'post_any', 'create' ) && ! ACL::user_can( $user, $type, 'create') ) ) { Session::error(_t('Creating that post type is denied')); - $this->get_blank(); + $thispost->get_blank(); } - $form->set_option( 'form_action', URL::get('admin', 'page=publish' ) ); +// $form->set_option( 'form_action', URL::get('admin', 'page=publish' ) ); + $form->on_success( array( $thispost, 'form_publish_success' ) ); if ( HabariDateTime::date_create( $form->pubdate->value )->int > $post->pubdate->int ) { $post->pubdate = HabariDateTime::date_create( $form->pubdate->value ); @@ -599,7 +605,9 @@ $$key = $value; } - if ( isset( $id ) ) { +// Utils::debug( $id ); + // 0 is what's assigned to new posts + if ( isset( $id ) && ( $id != 0 )) { $post = Post::get( array( 'id' => $id, 'status' => Post::status( 'any' ) ) ); if ( !$post ) { Session::error(_t('Access to that post id is denied'));