/** * @return bool */ public function check() { global $_PLUGINS; $plugin = $_PLUGINS->getLoadedPlugin( 'user', 'cbgallery' ); $params = $_PLUGINS->getPluginParams( $plugin ); $minFileSize = $params->get( $this->get( 'type' ) . '_item_min_size', 0 ); $maxFileSize = $params->get( $this->get( 'type' ) . '_item_max_size', 1024 ); switch( $this->get( 'type' ) ) { case 'photos': $type = CBTxt::T( 'Photo' ); break; case 'files': $type = CBTxt::T( 'File' ); break; case 'videos': $type = CBTxt::T( 'Video' ); break; case 'music': $type = CBTxt::T( 'Music' ); break; default: $type = CBTxt::T( 'Item' ); break; } $extensions = cbgalleryClass::getExtensions( $this->get( 'type' ) ); if ( $this->get( 'user_id' ) == '' ) { $this->setError( CBTxt::T( 'Owner not specified!' ) ); return false; } elseif ( $this->get( 'type' ) == '' ) { $this->setError( CBTxt::T( 'Type not specified!' ) ); return false; } elseif ( ( ! $this->get( 'id' ) ) && ( ( ! $this->get( 'value' ) ) && ( ( ! isset( $_FILES['file']['tmp_name'] ) ) || empty( $_FILES['file']['tmp_name'] ) ) ) ) { $this->setError( CBTxt::T( 'ITEM_NOT_SPECIFIED', '[type] not specified!', array( '[type]' => $type ) ) ); return false; } elseif ( isset( $_FILES['file']['tmp_name'] ) && ( ! empty( $_FILES['file']['tmp_name'] ) ) ) { $fileExtension = strtolower( preg_replace( '/[^-a-zA-Z0-9_]/', '', pathinfo( $_FILES['file']['name'], PATHINFO_EXTENSION ) ) ); if ( ( ! $fileExtension ) || ( ! in_array( $fileExtension, $extensions ) ) ) { $this->setError( CBTxt::T( 'ITEM_UPLOAD_INVALID_EXT', 'Invalid file extension [ext]. Please upload only [exts]!', array( '[ext]' => $fileExtension, '[exts]' => implode( ', ', $extensions ) ) ) ); return false; } $fileSize = $_FILES['file']['size']; if ( $minFileSize && ( ( $fileSize / 1024 ) < $minFileSize ) ) { $this->setError( CBTxt::T( 'ITEM_UPLOAD_TOO_SMALL', 'The file is too small, the minimum is [size]!', array( '[size]' => cbgalleryClass::getFormattedFileSize( $minFileSize * 1024 ) ) ) ); return false; } if ( $maxFileSize && ( ( $fileSize / 1024 ) > $maxFileSize ) ) { $this->setError( CBTxt::T( 'ITEM_UPLOAD_TOO_LARGE', 'The file size exceeds the maximum of [size]!', array( '[size]' => cbgalleryClass::getFormattedFileSize( $maxFileSize * 1024 ) ) ) ); return false; } } else { $linkDomain = preg_replace( '/^(?:(?:\w+\.)*)?(\w+)\..+$/', '\1', parse_url( $this->get( 'value' ), PHP_URL_HOST ) ); if ( $linkDomain && ( ! ( in_array( $linkDomain, array( 'youtube', 'youtu' ) ) && ( $this->get( 'type' ) == 'videos' ) ) ) ) { $linkExists = false; try { $request = new GuzzleHttp\Client(); $header = $request->head( $this->get( 'value' ) ); if ( ( $header !== false ) && ( $header->getStatusCode() == 200 ) ) { $linkExists = true; } } catch( Exception $e ) {} if ( ! $linkExists ) { $this->setError( CBTxt::T( 'ITEM_LINK_INVALID_URL', 'Invalid file URL. Please ensure the URL exists!' ) ); return false; } $linkExtension = strtolower( pathinfo( $this->get( 'value' ), PATHINFO_EXTENSION ) ); if ( ( ! $linkExtension ) || ( ! in_array( $linkExtension, $extensions ) ) ) { if ( $this->get( 'type' ) == 'videos' ) { $extensions[] = 'youtube'; } $this->setError( CBTxt::T( 'ITEM_LINK_INVALID_EXT', 'Invalid file extension [ext]. Please upload only [exts]!', array( '[ext]' => $linkExtension, '[exts]' => implode( ', ', $extensions ) ) ) ); return false; } } } return true; }
/** * Displays item create/edit page * * @param int $id * @param string $type * @param TabTable $tab * @param UserTable $user * @param UserTable $viewer * @param null|string $message * @param null|string $messageType */ public function showItemEdit( $id, $type, $tab, $user, $viewer, $message = null, $messageType = 'error' ) { global $_CB_framework, $_CB_database; /** @var Registry $params */ $params = $tab->params; $row = new cbgalleryItemTable(); $row->load( (int) $id ); if ( ! $row->get( 'id' ) ) { $row->set( 'folder', $this->input( 'folder', 0, GetterInterface::INT ) ); } $cbModerator = Application::User( (int) $viewer->get( 'id' ) )->isGlobalModerator(); $canAccess = false; if ( ! $row->get( 'id' ) ) { if ( ( $user->get( 'id' ) != $viewer->get( 'id' ) ) && ( ! $cbModerator ) ) { $user = $viewer; } $canAccess = cbgalleryClass::canUserCreate( $viewer, $type, false ); } elseif ( ( $row->get( 'type' ) == $type ) && ( $cbModerator || ( $viewer->get( 'id' ) == $row->get( 'user_id' ) ) ) ) { $canAccess = true; } if ( $row->get( 'folder' ) ) { $returnUrl = $_CB_framework->pluginClassUrl( $this->element, false, array( 'action' => 'folders', 'func' => 'show', 'type' => $type, 'id' => (int) $row->get( 'folder' ), 'user' => (int) $user->get( 'id' ), 'tab' => (int) $tab->get( 'tabid' ) ) ); } else { $returnUrl = $_CB_framework->userProfileUrl( (int) $row->get( 'user_id', $user->get( 'id' ) ), false, $tab->get( 'tabid' ) ); } if ( ! $canAccess ) { cbRedirect( $returnUrl, CBTxt::T( 'Not authorized.' ), 'error' ); } $minFileSize = $this->params->get( $type . '_item_min_size', 0 ); $maxFileSize = $this->params->get( $type . '_item_max_size', 1024 ); switch( $type ) { case 'photos': $typeTranslated = CBTxt::T( 'Photo' ); break; case 'files': $typeTranslated = CBTxt::T( 'File' ); break; case 'videos': $typeTranslated = CBTxt::T( 'Video' ); break; case 'music': $typeTranslated = CBTxt::T( 'Music' ); break; default: $typeTranslated = CBTxt::T( 'Item' ); break; } $extLimit = cbgalleryClass::getExtensions( $type ); switch( $type ) { case 'photos': case 'videos': case 'music': $folderType = CBTxt::T( 'Album' ); break; default: $folderType = CBTxt::T( 'Folder' ); break; } cbgalleryClass::getTemplate( 'item_edit' ); $input = array(); $publishedTooltip = cbTooltip( null, CBTxt::T( 'ITEM_PUBLISHED_DESCRIPTION', 'Select publish status of the [type]. If unpublished the [type] will not be visible to the public.', array( '[type]' => $typeTranslated ) ), null, null, null, null, null, 'data-hascbtooltip="true"' ); $input['published'] = moscomprofilerHTML::yesnoSelectList( 'published', 'class="form-control"' . ( $publishedTooltip ? ' ' . $publishedTooltip : null ), (int) $this->input( 'post/published', $row->get( 'published', 1 ), GetterInterface::INT ) ); $titleTooltip = cbTooltip( null, CBTxt::T( 'ITEM_TITLE_DESCRIPTION', 'Optionally input a title. If no title is provided the filename will be displayed as the title.', array( '[type]' => $typeTranslated ) ), null, null, null, null, null, 'data-hascbtooltip="true"' ); $input['title'] = '<input type="title" id="title" name="title" value="' . htmlspecialchars( $this->input( 'post/title', $row->get( 'title' ), GetterInterface::STRING ) ) . '" class="form-control" size="25"' . ( $titleTooltip ? ' ' . $titleTooltip : null ) . ' />'; $listFolders = array(); if ( cbgalleryClass::canUserCreate( $viewer, $type, true ) ) { $listFolders[] = moscomprofilerHTML::makeOption( -1, CBTxt::T( 'ITEM_NEW_FOLDER', 'New [type]', array( '[type]' => $folderType ) ) ); } if ( $params->get( 'tab_' . $type . '_uncategorized', 1 ) ) { $listFolders[] = moscomprofilerHTML::makeOption( 0, CBTxt::T( 'Uncategorized' ) ); } $query = 'SELECT *' . "\n FROM " . $_CB_database->NameQuote( '#__comprofiler_plugin_gallery_folders' ) . "\n WHERE " . $_CB_database->NameQuote( 'type' ) . " = " . $_CB_database->Quote( $type ) . "\n AND " . $_CB_database->NameQuote( 'user_id' ) . " = " . (int) $row->get( 'user_id', $user->get( 'id' ) ) . "\n ORDER BY " . $_CB_database->NameQuote( 'date' ) . " DESC"; $_CB_database->setQuery( $query ); $folders = $_CB_database->loadObjectList( null, 'cbgalleryFolderTable', array( $_CB_database ) ); /** @var cbgalleryFolderTable[] $folders */ foreach ( $folders as $folder ) { $listFolders[] = moscomprofilerHTML::makeOption( (int) $folder->get( 'id' ), ( $folder->get( 'title' ) ? $folder->get( 'title' ) : cbFormatDate( $folder->get( 'date' ), true, false ) ) ); } $folderTooltip = cbTooltip( null, CBTxt::T( 'ITEM_FOLDER_DESCRIPTION', 'Select the [folder_type] for this [type].', array( '[folder_type]' => $folderType, '[type]' => $typeTranslated ) ), null, null, null, null, null, 'data-hascbtooltip="true"' ); $input['folder'] = moscomprofilerHTML::selectList( $listFolders, 'folder', 'class="form-control"' . ( $folderTooltip ? ' ' . $folderTooltip : null ), 'value', 'text', $this->input( 'post/folder', $row->get( 'folder', 0 ), GetterInterface::INT ), 1, false, false ); $allowUpload = $this->params->get( $type . '_item_upload', 1 ); $allowLink = $this->params->get( $type . '_item_link', 0 ); if ( $allowUpload && $allowLink ) { $uploadButton = CBTxt::T( 'UPLOAD_ITEM_TYPE', 'Upload [type]', array( '[type]' => $typeTranslated ) ); $linkButton = CBTxt::T( 'LINK_ITEM_TYPE', 'Link [type]', array( '[type]' => $typeTranslated ) ); $js = "$( '#method' ).on( 'change', function() {" . "var value = $( this ).val();" . "if ( value == 1 ) {" . "$( '#itemUpload' ).removeClass( 'hidden' ).find( 'input' ).removeClass( 'cbValidationDisabled' );" . "$( '#itemLink' ).addClass( 'hidden' ).find( 'input' ).addClass( 'cbValidationDisabled' );"; if ( ! $row->get( 'id' ) ) { $js .= "$( '.galleryButtonSubmit' ).val( '" . addslashes( $uploadButton ) . "' );"; } $js .= "} else if ( value == 2 ) {" . "$( '#itemUpload' ).addClass( 'hidden' ).find( 'input' ).addClass( 'cbValidationDisabled' ).val( '' );" . "$( '#itemLink' ).removeClass( 'hidden' ).find( 'input' ).removeClass( 'cbValidationDisabled' );"; if ( ! $row->get( 'id' ) ) { $js .= "$( '.galleryButtonSubmit' ).val( '" . addslashes( $linkButton ) . "' );"; } $js .= "} else {" . "$( '#itemUpload' ).addClass( 'hidden' ).find( 'input' ).addClass( 'cbValidationDisabled' ).val( '' );" . "$( '#itemLink' ).addClass( 'hidden' ).find( 'input' ).addClass( 'cbValidationDisabled' );" . "}" . "}).change();"; $_CB_framework->outputCbJQuery( $js ); $listMethods = array(); if ( $row->get( 'id' ) ) { $listMethods[] = moscomprofilerHTML::makeOption( 0, CBTxt::T( 'No Change' ) ); } if ( $allowUpload ) { $listMethods[] = moscomprofilerHTML::makeOption( 1, CBTxt::T( 'Upload' ) ); } if ( $allowLink ) { $listMethods[] = moscomprofilerHTML::makeOption( 2, CBTxt::T( 'Link' ) ); } $input['method'] = moscomprofilerHTML::selectList( $listMethods, 'method', 'class="form-control"', 'value', 'text', $this->input( 'post/method', 0, GetterInterface::INT ), 1, false, false ); } else { $input['method'] = null; } $fileValidation = array(); if ( $minFileSize || $maxFileSize ) { $fileValidation[] = cbValidator::getRuleHtmlAttributes( 'filesize', array( $minFileSize, $maxFileSize, 'KB' ) ); } if ( $extLimit ) { $fileValidation[] = cbValidator::getRuleHtmlAttributes( 'extension', implode( ',', $extLimit ) ); } if ( $allowUpload ) { $fileTooltip = cbTooltip( null, CBTxt::T( 'ITEM_UPLOAD_DESCRIPTION', 'Select the file to upload.', array( '[type]' => $typeTranslated ) ), null, null, null, null, null, 'data-hascbtooltip="true"' ); $input['upload'] = '<input type="file" id="file" name="file" value="" class="form-control' . ( ! $row->get( 'id' ) ? ' required' : null ) . '"' . ( $fileTooltip ? ' ' . $fileTooltip : null ) . ( $fileValidation ? implode( ' ', $fileValidation ) : null ) . ' />'; $input['upload_limits'] = array(); if ( $extLimit ) { $input['upload_limits'][] = CBTxt::T( 'ITEM_UPLOAD_LIMITS_EXT', 'Your file must be of [ext] type.', array( '[ext]' => implode( ', ', $extLimit ) ) ); } if ( $minFileSize ) { $input['upload_limits'][] = CBTxt::T( 'ITEM_UPLOAD_LIMITS_MIN', 'Your file should exceed [size].', array( '[size]' => cbgalleryClass::getFormattedFileSize( $minFileSize * 1024 ) ) ); } if ( $maxFileSize ) { $input['upload_limits'][] = CBTxt::T( 'ITEM_UPLOAD_LIMITS_MAX', 'Your file should not exceed [size].', array( '[size]' => cbgalleryClass::getFormattedFileSize( $maxFileSize * 1024 ) ) ); } } else { $input['upload'] = null; $input['upload_limits'] = null; } if ( $allowLink ) { $linkTooltip = cbTooltip( null, CBTxt::T( 'ITEM_LINK_DESCRIPTION', 'Input the URL to the file to link.', array( '[type]' => $typeTranslated ) ), null, null, null, null, null, 'data-hascbtooltip="true"' ); $input['link'] = '<input type="text" id="value" name="value" value="' . htmlspecialchars( $this->input( 'post/value', ( $row->getLinkDomain() ? $row->get( 'value' ) : null ), GetterInterface::STRING ) ) . '" size="40" class="form-control' . ( ! $row->get( 'id' ) ? ' required' : null ) . '"' . ( $linkTooltip ? ' ' . $linkTooltip : null ) . ' />'; $input['link_limits'] = array(); if ( $extLimit ) { if ( $type == 'videos' ) { $extLimit[] = 'youtube'; } $input['link_limits'][] = CBTxt::T( 'ITEM_LINK_LIMITS_EXT', 'Your file must be of [ext] type.', array( '[ext]' => implode( ', ', $extLimit ) ) ); } } else { $input['link'] = null; $input['link_limits'] = null; } $descriptionTooltip = cbTooltip( null, CBTxt::T( 'ITEM_DESCRIPTION_DESCRIPTION', 'Optionally input a description.', array( '[type]' => $typeTranslated ) ), null, null, null, null, null, 'data-hascbtooltip="true"' ); $input['description'] = '<textarea id="description" name="description" class="form-control" cols="40" rows="5"' . ( $descriptionTooltip ? ' ' . $descriptionTooltip : null ) . '>' . htmlspecialchars( $this->input( 'post/description', $row->get( 'description' ), GetterInterface::STRING ) ) . '</textarea>'; $ownerTooltip = cbTooltip( null, CBTxt::T( 'ITEM_OWNER_DESCRIPTION', 'Input owner as single integer user_id.', array( '[type]' => $typeTranslated ) ), null, null, null, null, null, 'data-hascbtooltip="true"' ); $input['user_id'] = '<input type="text" id="user_id" name="user_id" value="' . (int) $this->input( 'post/user_id', $row->get( 'user_id', $user->get( 'id' ) ), GetterInterface::INT ) . '" class="digits required form-control" size="6"' . ( $ownerTooltip ? ' ' . $ownerTooltip : null ) . ' />'; if ( $message ) { $_CB_framework->enqueueMessage( $message, $messageType ); } HTML_cbgalleryItemEdit::showItemEdit( $row, $input, $type, $tab, $user, $viewer, $this ); }