Back to MediaField class

Method getLayoutData

public array
getLayoutData
()
Get the data that is going to be passed to the layout
Returns
  • array
Class: MediaField
Project: Joomla

Method getLayoutData - Source code

/**
 * Get the data that is going to be passed to the layout
 *
 * @return  array
 */
public function getLayoutData()
{
    // Get the basic field data
    $data = parent::getLayoutData();
    $asset = $this->asset;
    if ($asset === '') {
        $asset = Factory::getApplication()->input->get('option');
    }
    // Value in new format such as images/headers/blue-flower.jpg#joomlaImage://local-images/headers/blue-flower.jpg?width=700&height=180
    if ($this->value && strpos($this->value, '#') !== false) {
        $uri = new Uri(explode('#', $this->value)[1]);
        $adapter = $uri->getHost();
        $path = $uri->getPath();
        // Remove filename from stored path to get the path to the folder which file is stored
        $pos = strrpos($path, '/');
        if ($pos !== false) {
            $path = substr($path, 0, $pos);
        }
        if ($path === '') {
            $path = '/';
        }
        $this->folder = $adapter . ':' . $path;
    } elseif ($this->value && is_file(JPATH_ROOT . '/' . $this->value)) {
        /**
         * Local image, for example images/sampledata/cassiopeia/nasa2-640.jpg . We need to validate and make sure
         * the top level folder is one of the directory configured in filesystem local plugin to avoid error message
         * displayed in manage when users click on Select button to select a new image
         */
        $paths = explode('/', $this->value);
        // Remove filename from $paths array
        array_pop($paths);
        if (MediaHelper::isValidLocalDirectory($paths[0])) {
            $adapterName = array_shift($paths);
            $this->folder = 'local-' . $adapterName . ':/' . implode('/', $paths);
        }
    } elseif ($this->directory && is_dir(JPATH_ROOT . '/' . ComponentHelper::getParams('com_media')->get('image_path', 'images') . '/' . $this->directory)) {
        /**
         * This is the case where a folder is configured in directory attribute of the form field. The directory needs
         * to be a relative folder of the folder configured in Path to Images Folder config option of Media component.
         * Same with a already stored local image above, we need to validate and make sure top level folder is one of the directory
         * configured in filesystem local plugin
         */
        $path = ComponentHelper::getParams('com_media')->get('image_path', 'images') . '/' . $this->directory;
        $paths = explode('/', $path);
        if (MediaHelper::isValidLocalDirectory($paths[0])) {
            $adapterName = array_shift($paths);
            $this->folder = 'local-' . $adapterName . ':/' . implode('/', $paths);
        }
    } elseif ($this->directory && strpos($this->directory, ':')) {
        /**
         * Directory contains adapter information and path, for example via programming or directly defined in xml
         * via directory attribute
         */
        $this->folder = $this->directory;
    } else {
        $this->folder = '';
    }
    $mediaTypes = array_map('trim', explode(',', $this->types));
    $types = [];
    $imagesExt = array_map('trim', explode(',', ComponentHelper::getParams('com_media')->get('image_extensions', 'bmp,gif,jpg,jpeg,png,webp')));
    $audiosExt = array_map('trim', explode(',', ComponentHelper::getParams('com_media')->get('audio_extensions', 'mp3,m4a,mp4a,ogg')));
    $videosExt = array_map('trim', explode(',', ComponentHelper::getParams('com_media')->get('video_extensions', 'mp4,mp4v,mpeg,mov,webm')));
    $documentsExt = array_map('trim', explode(',', ComponentHelper::getParams('com_media')->get('doc_extensions', 'doc,odg,odp,ods,odt,pdf,ppt,txt,xcf,xls,csv')));
    $imagesAllowedExt = [];
    $audiosAllowedExt = [];
    $videosAllowedExt = [];
    $documentsAllowedExt = [];
    // Cleanup the media types
    array_map(function ($mediaType) use(&$types, &$imagesAllowedExt, &$audiosAllowedExt, &$videosAllowedExt, &$documentsAllowedExt, $imagesExt, $audiosExt, $videosExt, $documentsExt) {
        switch ($mediaType) {
            case 'images':
                $types[] = '0';
                $imagesAllowedExt = $imagesExt;
                break;
            case 'audios':
                $types[] = '1';
                $audiosAllowedExt = $audiosExt;
                break;
            case 'videos':
                $types[] = '2';
                $videosAllowedExt = $videosExt;
                break;
            case 'documents':
                $types[] = '3';
                $documentsAllowedExt = $documentsExt;
                break;
            default:
                break;
        }
    }, $mediaTypes);
    sort($types);
    $extraData = array('asset' => $asset, 'authorField' => $this->authorField, 'authorId' => $this->form->getValue($this->authorField), 'folder' => $this->folder, 'link' => $this->link, 'preview' => $this->preview, 'previewHeight' => $this->previewHeight, 'previewWidth' => $this->previewWidth, 'mediaTypes' => implode(',', $types), 'imagesExt' => $imagesExt, 'audiosExt' => $audiosExt, 'videosExt' => $videosExt, 'documentsExt' => $documentsExt, 'imagesAllowedExt' => $imagesAllowedExt, 'audiosAllowedExt' => $audiosAllowedExt, 'videosAllowedExt' => $videosAllowedExt, 'documentsAllowedExt' => $documentsAllowedExt);
    return array_merge($data, $extraData);
}