Grav\Plugin\Admin\Admin::getPagePathFromToken PHP Метод

getPagePathFromToken() публичный Метод

public getPagePathFromToken ( $path )
    public function getPagePathFromToken($path)
    {
        $path_parts = pathinfo($path);
        $page = null;
        $basename = '';
        if (isset($path_parts['extension'])) {
            $basename = '/' . $path_parts['basename'];
            $path = $path_parts['dirname'];
        }
        $regex = '/(@self|self@)|((?:@page|page@):(?:.*))|((?:@theme|theme@):(?:.*))/';
        preg_match($regex, $path, $matches);
        if ($matches) {
            if ($matches[1]) {
                // self@
                $page = $this->page(true);
            } elseif ($matches[2]) {
                // page@
                $parts = explode(':', $path);
                $route = $parts[1];
                $page = $this->grav['page']->find($route);
            } elseif ($matches[3]) {
                // theme@
                $parts = explode(':', $path);
                $route = $parts[1];
                $theme = str_replace(ROOT_DIR, '', $this->grav['locator']->findResource("theme://"));
                return $theme . $route . $basename;
            }
        } else {
            return $path . $basename;
        }
        if (!$page) {
            throw new \RuntimeException('Page route not found: ' . $path);
        }
        $path = str_replace($matches[0], rtrim($page->relativePagePath(), '/'), $path);
        return $path . $basename;
    }

Usage Example

 /**
  * Used by the filepicker field to get a list of files in a folder.
  */
 protected function taskGetFilesInFolder()
 {
     if (!$this->authorizeTask('save', $this->dataPermissions())) {
         return false;
     }
     $data = $this->view == 'pages' ? $this->admin->page(true) : $this->prepareData([]);
     $settings = $data->blueprints()->schema()->getProperty($this->post['name']);
     if (isset($settings['folder'])) {
         $folder = $settings['folder'];
     } else {
         $folder = '@self';
     }
     // Do not use self@ outside of pages
     if ($this->view != 'pages' && in_array($folder, ['@self', 'self@'])) {
         $this->admin->json_response = ['status' => 'error', 'message' => sprintf($this->admin->translate('PLUGIN_ADMIN.FILEUPLOAD_PREVENT_SELF', null), $folder)];
         return false;
     }
     // Set destination
     $folder = Folder::getRelativePath(rtrim($folder, '/'));
     $folder = $this->admin->getPagePathFromToken($folder);
     $media = new Media($folder);
     $available_files = [];
     foreach ($media->all() as $name => $medium) {
         $available_files[] = $name;
     }
     // Peak in the flashObject for optimistic filepicker updates
     $pending_files = [];
     $sessionField = base64_encode($this->grav['uri']->url());
     $flash = $this->admin->session()->getFlashObject('files-upload');
     if ($flash && isset($flash[$sessionField])) {
         foreach ($flash[$sessionField] as $field => $data) {
             foreach ($data as $file) {
                 if (dirname($file['path']) === $folder) {
                     $pending_files[] = $file['name'];
                 }
             }
         }
     }
     $this->admin->session()->setFlashObject('files-upload', $flash);
     // Handle Accepted file types
     // Accept can only be file extensions (.pdf|.jpg)
     if (isset($settings['accept'])) {
         $available_files = array_filter($available_files, function ($file) use($settings) {
             return $this->filterAcceptedFiles($file, $settings);
         });
         $pending_files = array_filter($pending_files, function ($file) use($settings) {
             return $this->filterAcceptedFiles($file, $settings);
         });
     }
     $this->admin->json_response = ['status' => 'success', 'files' => array_values($available_files), 'pending' => array_values($pending_files), 'folder' => $folder];
     return true;
 }