diff --git a/admin/event-edit.php b/admin/event-edit.php index 466c3bf..cbd9393 100644 --- a/admin/event-edit.php +++ b/admin/event-edit.php @@ -1,703 +1,715 @@ . /* * Event edit * * From this page you can create/edit an User and assign some skills/interests etc. */ // load configurations and framework require 'load.php'; // inherit the Conference or specify one $conference_uid = $_GET['conference_uid'] ?? $_POST['conference_uid'] ?? CURRENT_CONFERENCE_UID; // check if the Conference exists $conference = ( new QueryConference() ) ->whereConferenceUID( $conference_uid ) ->queryRow(); // no Conference no party if( !$conference ) { error( "missing conference with UID $conferene_uid" ); die_with_404(); } // retrieve the Event (if existing) $event = null; if( isset( $_GET['id'] ) ) { // no Event no party $event = ( new QueryEvent() ) ->whereConference( $conference ) ->joinConference() ->joinChapter( 'LEFT' ) ->whereEventID( $_GET['id'] ) ->queryRow(); // no Event no party if( !$event ) { die_with_404(); } // no editable no party if( !$event->isEventEditable() ) { missing_privileges(); } } else { // check if there are permissions to add event if( !has_permission( 'add-event' ) ) { missing_privileges(); } } $warning = null; // check if the user submitted a form // check which one if( $_POST ) { // the user is submitting the save form if( is_action( 'save-event' ) ) { $conference_ID = $conference->getConferenceID(); $data = []; $data[] = new DBCol( Event::TITLE, $_POST['title'], 's' ); $data[] = new DBCol( Event::UID, $_POST['uid'], 's' ); $data[] = new DBCol( Event::LANGUAGE, $_POST['language'], 's' ); $data[] = new DBCol( Event::SUBTITLE, $_POST['subtitle'], 's' ); $data[] = new DBCol( Event::START, $_POST['start'], 's' ); $data[] = new DBCol( Event::END, $_POST['end'], 's' ); $data[] = new DBCol( Event::EXTERNAL_URL,$_POST['url'], 's' ); $data[] = new DBCol( Event::ABORTED, $_POST['aborted'], 'd' ); $data[] = new DBCol( Event::IMAGE, $_POST['image'], 'snull' ); $data[] = new DBCol( Chapter::ID, $_POST['chapter'], 'd' ); $data[] = new DBCol( Room::ID, $_POST['room'], 'd' ); $data[] = new DBCol( Track::ID, $_POST['track'], 'd' ); $data[] = new DBCol( Conference::ID, $conference_ID, 'd' ); // for each language save the fields foreach( all_languages() as $lang ) { foreach( Event::fields_i18n() as $i18n_column => $label ) { // generic column name in this language $field = $i18n_column . '_' . $lang->getISO(); // sent column value $value = $_POST[ $field ] ?? null; // prepare to be saved $data[] = new DBCol( $field, $value, 'snull' ); } } // convert empty strings to NULL, if possible foreach( $data as $row ) { $row->promoteNULL(); } if( $event ) { // update the existing Event ( new QueryEvent() ) ->whereEvent( $event ) ->update( $data ); } else { // insert a new Event Event::factory() ->insertRow( $data ); } $id = $event ? $event->getEventID() : last_inserted_ID(); // get the updated Event $event = FullEvent::factory() ->whereInt( Event::ID, $id ) ->queryRow(); // POST-redirect-GET http_redirect( $event->getEventEditURL(), 303 ); } /** * Change the Image */ if( $event && is_action( 'change-image' ) ) { // prepare the image uploader $image = new FileUploader( 'image', [ 'category' => 'image', 'override-filename' => "event-" . $event->getEventUID(), ] ); // prepare the image pathnames $img_url = $event->getConferenceUID() . _ . 'images'; $img_path = ABSPATH . __ . $event->getConferenceUID() . __ . 'images'; // really upload that shitty image somewhere if( $image->fileChoosed() ) { $ok = $image->uploadTo( $img_path, $status, $filename, $ext ); if( $ok ) { // now update ( new QueryEvent() ) ->whereEvent( $event ) ->update( [ 'event_img' => $img_url . "/$filename.$ext", ] ); // POST-redirect-GET http_redirect( $event->getFullEventEditURL(), 303 ); } else { $warning = $image->getErrorMessage(); } } } /* * Add the user */ if( $event && is_action( 'add-user' ) && isset( $_POST['user'] ) ) { // Add user $user = User::factoryFromUID( $_POST['user'] ) ->select( User::ID ) ->queryRow(); if( $user ) { ( new QueryEventUser() ) ->whereEvent( $event ) ->whereUser( $user ) ->delete(); ( new QueryEventUser() )->insertRow( [ new DBCol( Event::ID, $event->getEventID(), 'd' ), new DBCol( User ::ID, $user->getUserID(), 'd' ), new DBCol( EventUser::ORDER, 0, 'd' ), ] ); } } /** * Update an user order */ if( $event && is_action( 'update-user' ) && isset( $_POST['user'] ) ) { $user = User::factoryFromUID( $_POST['user'] ) ->select( User::ID ) ->queryRow(); if( $user ) { if ( !empty( $_POST['delete'] ) ) { // delete user ( new QueryEventUser() ) ->whereEvent( $event ) ->whereUser( $user ) ->delete(); - } elseif( isset( $_POST['order'] ) ) { + } elseif( isset( $_POST['order'], $_POST['role'] ) ) { // change order ( new QueryEventUser() ) ->whereEvent( $event ) ->whereUser( $user ) ->update( [ - new DBCol( EventUser::ORDER, $_POST['order'], 'd' ) + new DBCol( EventUser::ORDER, $_POST['order'], 'd' ), + new DBCol( EventUser::ROLE, $_POST['role'], 's' ), ] ); } } } // post -> redirect -> get (no: it hide errors) // http_redirect( $_SERVER[ 'REQUEST_URI' ], 303 ); } // Event's Sharable(s) $sharables = []; if( $event ) { // query all the Sharable(s) related to this Event $sharables = ( new QuerySharable() ) ->whereEvent( $event ) ->queryGenerator(); Header::spawn( null, [ 'title' => sprintf( __("Modifica %s: %s"), $event->getChapterName(), $event->getEventTitle() ), ] ); } else { Header::spawn( null, [ 'title' => sprintf( __( "Aggiungi %s" ), __( "Evento" ) ), ] ); } ?>

getConferenceURL(), esc_html( $conference->getConferenceTitle() ) . icon( 'home', 'left' ) ) ?>

hasEventPermalink() ): ?>

getEventURL(), // text __( "Vedi" ) . icon( 'account_box', 'left' ) ) ?>

get( Event::TITLE ) ); } ?> />
get( Event::UID ) ); } ?> />
get( Event::SUBTITLE ) ); } ?> />
get( Event::EXTERNAL_URL ) ); } ?> />
get( Event::LANGUAGE ) ); } ?> />
getEventStart()->format( 'Y-m-d H:i:s' ) ); } elseif( isset( $_GET['start'] ) ) { echo value( $_GET['start'] ); } ?> />
getEventEnd()->format( 'Y-m-d H:i:s' ) ); } elseif( isset( $_GET['end'] ) ) { echo value( $_GET['end'] ); } ?> />

$label ): ?>

getISO() ?>
get( Event::IMAGE ) ); } ?>/ > hasEventImage() ): ?> <?= esc_attr( $event->getEventTitle() ) ?>

factoryUserByEvent() ->select( [ User::UID, EventUser::ORDER, + EventUser::ROLE, ] ) ->defaultClass( EventUser::class ) ->orderBy( EventUser::ORDER ) ->queryGenerator(); ?> valid() ): ?>

$user ): ?>
getUserUID() ) ?> />
getEventUserOrder() ) ?>" />
+
+ +

getUserEditURL(), sprintf( __( "Modifica %s" ), __( "Utente" ) ) ) ?>

. trait EventUserTrait { /** * Get the event user order * * @return int */ public function getEventUserOrder() { return $this->get( EventUser::ORDER ); } + /** + * Get the event user order + * + * @return int + */ + public function getEventUserRole() { + return $this->get( EventUser::ROLE ); + } + + /** + * Get the event user order + * + * @param string $gender + * @return int + */ + public function getEventUserRoleHuman( $gender = 'm' ) { + + $f = $gender === 'f'; + + $role = $this->getEventUserRole(); + + if( $role === 'moderator' ) { + return $f ? __( "moderatrice" ) : __( "moderatore" ); + } + + if( $role === 'speaker' ) { + return $f ? __( "relatrice" ) : __( "relatore" ); + } + + return '?'; + } + /** * Delete this Event-User from the database * * Can be called statically */ function deleteEventUser( $event_ID = null, $user_ID = null ) { if( $event_ID === null ) { $event_ID = $this->getEventID(); } if( $user_ID === null ) { $user_ID = $this->getUserID(); } EventUser::delete( $event_ID, $user_ID ); } /** * Normalize an EventUser object */ protected function normalizeEventUser() { $this->integers( EventUser::ORDER ); $this->normalizeEvent(); $this->normalizeUser(); } } class_exists( 'Event' ); class_exists( 'User' ); /** * Relation between an event and users */ class EventUser extends Queried { use EventUserTrait; use EventTrait; use UserTrait; /** * Database table name */ const T = 'event_user'; /** * Complete user column name */ const USER_ = self::T . DOT . User::ID; /** * Complete event column name */ const EVENT_ = self::T . DOT . Event::ID; /** * User order column name */ const ORDER = 'event_user_order'; + /** + * User role column name + */ + const ROLE = 'event_user_role'; + /** * Constructor */ public function __construct() { $this->normalizeEventUser(); } + + /** + * Get an array of EventUser roles + * + * @return array + */ + public static function roles() { + return [ + 'speaker', + 'moderator', + ]; + } } diff --git a/includes/class-QueryEventUser.php b/includes/class-QueryEventUser.php index 1748402..510de6d 100644 --- a/includes/class-QueryEventUser.php +++ b/includes/class-QueryEventUser.php @@ -1,84 +1,112 @@ . // load dependent traits class_exists( 'QueryEvent', true ); class_exists( 'QueryUser', true ); /** * Class able to query a QueryEventUser */ trait QueryEventUserTrait { use QueryEventTrait; use QueryUserTrait; /** * Limit to a specific EventUser * * @param $event_user EventUser * @return self */ public function whereEventUser( $event_user ) { return $this->whereEvent( $event_user ) ->whereUser( $event_user ); } + /** + * Where the EventUser role is... + * + * @param string $role + * @return self + */ + public function whereEventUserRole( $role ) { + return $this->whereStr( EventUser::ROLE, $role ); + } + + /** + * Where the EventUser is a moderator + * + * @return self + */ + public function whereEventUserIsModerator() { + return $this->whereEventUserRole( 'moderator' ); + } + + /** + * Where the EventUser is a speaker + * + * @return self + */ + public function whereEventUserIsSpeaker() { + return $this->whereEventUserRole( 'speaker' ); + } + /** * Order by the EventUser order field * * @return self */ public function orderByEventUserOrder() { return $this->orderBy( EventUser::ORDER ); } } /** * Query an EventUser */ class QueryEventUser extends Query { use QueryEventUserTrait; /** * Univoque User ID column name */ protected $USER_ID = 'event_user.user_ID'; /* * Univoque Event ID column name * * Used from EventUserTrait. * * @var */ protected $EVENT_ID = 'event_user.event_ID'; /** * Constructor */ public function __construct( $db = null ) { // set database connection and default result class parent::__construct( $db, EventUser::class ); // set the default table $this->from( EventUser::T ); } }