X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Ffilefield_sources%2Fsrc%2FPlugin%2FFilefieldSource%2FImce.php;fp=web%2Fmodules%2Fcontrib%2Ffilefield_sources%2Fsrc%2FPlugin%2FFilefieldSource%2FImce.php;h=5830a862f879ea7e6ad7083b146529bf259a21a2;hp=0000000000000000000000000000000000000000;hb=8acec36f19c470dfcda1ae2336826a782f41874c;hpb=e0411c4e83ba0d079034db83c3f7f55be24a0e35 diff --git a/web/modules/contrib/filefield_sources/src/Plugin/FilefieldSource/Imce.php b/web/modules/contrib/filefield_sources/src/Plugin/FilefieldSource/Imce.php new file mode 100644 index 000000000..5830a862f --- /dev/null +++ b/web/modules/contrib/filefield_sources/src/Plugin/FilefieldSource/Imce.php @@ -0,0 +1,216 @@ +getSettings(); + $scheme = $field_settings['uri_scheme']; + $imce_paths = explode(':', $input['filefield_imce']['imce_paths']); + $uris = []; + + foreach ($imce_paths as $imce_path) { + //$wrapper = \Drupal::service('stream_wrapper_manager')->getViaScheme($scheme); + //$file_directory_prefix = $scheme == 'private' ? 'system/files' : $wrapper->getDirectoryPath(); + //$uri = preg_replace('/^' . preg_quote(base_path() . $file_directory_prefix . '/', '/') . '/', $scheme . '://', $imce_path); + $uri = rawurldecode($scheme . '://' . $imce_path); + $uris[] = $uri; + } + + // Resolve the file path to an FID. + $fids = db_select('file_managed', 'f') + ->condition('uri', $uris, 'IN') + ->fields('f', array('fid')) + ->execute() + ->fetchCol(); + if ($fids) { + $files = file_load_multiple($fids); + foreach ($files as $file) { + if (filefield_sources_element_validate($element, $file, $form_state)) { + if (!in_array($file->id(), $input['fids'])) { + $input['fids'][] = $file->id(); + } + } + } + } + else { + $form_state->setError($element, t('The selected file could not be used because the file does not exist in the database.')); + } + // No matter what happens, clear the value from the file path field. + $input['filefield_imce']['imce_paths'] = ''; + } + } + + /** + * {@inheritdoc} + */ + public static function process(array &$element, FormStateInterface $form_state, array &$complete_form) { + $instance = entity_load('field_config', $element['#entity_type'] . '.' . $element['#bundle'] . '.' . $element['#field_name']); + + $element['filefield_imce'] = array( + '#weight' => 100.5, + '#theme' => 'filefield_sources_element', + '#source_id' => 'imce', + // Required for proper theming. + '#filefield_source' => TRUE, + '#description' => filefield_sources_element_validation_help($element['#upload_validators']), + ); + + $imce_url = \Drupal::url('filefield_sources.imce', array( + 'entity_type' => $element['#entity_type'], + 'bundle_name' => $element['#bundle'], + 'field_name' => $element['#field_name'], + ), + array( + 'query' => array( + 'sendto' => 'imceFileField.sendto', + 'fieldId' => $element['#attributes']['data-drupal-selector'] . '-filefield-imce', + ), + )); + $element['filefield_imce']['browse'] = array( + '#type' => 'markup', + '#markup' => '' . t('No file selected') . ' (' . t('browse') . ')', + ); + + $element['#attached']['library'][] = 'imce/drupal.imce.filefield'; + // Set the pre-renderer to conditionally disable the elements. + $element['#pre_render'][] = array(get_called_class(), 'preRenderWidget'); + + // Path input + $element['filefield_imce']['imce_paths'] = array( + '#type' => 'hidden', + // Reset value to prevent consistent errors + '#value' => '', + ); + + $class = '\Drupal\file\Element\ManagedFile'; + $ajax_settings = [ + 'callback' => [$class, 'uploadAjaxCallback'], + 'options' => [ + 'query' => [ + 'element_parents' => implode('/', $element['#array_parents']), + ], + ], + 'wrapper' => $element['upload_button']['#ajax']['wrapper'], + 'effect' => 'fade', + ]; + + $element['filefield_imce']['imce_button'] = array( + '#name' => implode('_', $element['#parents']) . '_imce_select', + '#type' => 'submit', + '#value' => t('Select'), + '#attributes' => ['class' => ['js-hide']], + '#validate' => [], + '#submit' => ['filefield_sources_field_submit'], + '#limit_validation_errors' => [$element['#parents']], + '#ajax' => $ajax_settings, + ); + + return $element; + } + + /** + * Theme the output of the imce element. + */ + public static function element($variables) { + $element = $variables['element']; + + $output = drupal_render_children($element); + return '
' . $output . '
'; + } + + /** + * Define routes for Imce source. + * + * @return array + * Array of routes. + */ + public static function routes() { + $routes = array(); + + $routes['filefield_sources.imce'] = new Route( + '/file/imce/{entity_type}/{bundle_name}/{field_name}', + array( + '_controller' => '\Drupal\filefield_sources\Controller\ImceController::page', + '_title' => 'File Manager', + ), + array( + '_access_filefield_sources_field' => 'TRUE', + ) + ); + + return $routes; + } + + /** + * Implements hook_filefield_source_settings(). + */ + public static function settings(WidgetInterface $plugin) { + $settings = $plugin->getThirdPartySetting('filefield_sources', 'filefield_sources', array( + 'source_imce' => array( + 'imce_mode' => 0, + ), + )); + + $return['source_imce'] = array( + '#title' => t('IMCE file browser settings'), + '#type' => 'details', + '#access' => \Drupal::moduleHandler()->moduleExists('imce'), + ); + + // $imce_admin_url = \Drupal::url('imce.admin'); + $imce_admin_url = 'admin/config/media/imce'; + $return['source_imce']['imce_mode'] = array( + '#type' => 'radios', + '#title' => t('File browser mode'), + '#options' => array( + 0 => t('Restricted: Users can only browse the field directory. No file operations are allowed.'), + 1 => t('Full: Browsable directories are defined by IMCE configuration profiles. File operations are allowed.', array(':imce-admin-url' => $imce_admin_url)), + ), + '#default_value' => isset($settings['source_imce']['imce_mode']) ? $settings['source_imce']['imce_mode'] : 0, + ); + + return $return; + + } + + /** + * Pre-renders widget form. + */ + public static function preRenderWidget($element) { + // Hide elements if there is already an uploaded file. + if (!empty($element['#value']['fids'])) { + $element['filefield_imce']['imce_paths']['#access'] = FALSE; + $element['filefield_imce']['imce_button']['#access'] = FALSE; + } + return $element; + } + +}