/**
  * Add extra items to the shortcodes stream.
  *
  * @param string $group   The group name to add the extra items to.
  * @param any    $extra   The item to store.
  */
 public function addExtra($group, $method, $arguments = null)
 {
     $header = $this->page->header();
     $arguments = is_array($arguments) ? $arguments : [$arguments];
     // Modify page header
     $shortcodes = isset($header->shortcodes) ? $header->shortcodes : [];
     $shortcodes['extra'][$group][] = [$method, $arguments];
     // Temporally store Shortcode extras in page header
     $this->page->modifyHeader('shortcodes', $shortcodes);
     if ($this->page->id() == self::getGrav()['page']->id()) {
         $object = $group != 'page' ? self::getGrav()[$group] : $page;
         call_user_func_array([$object, $method], $arguments);
     }
 }
Example #2
0
 /**
  * Merge global and page configurations.
  *
  * @param  Page $page   The page to merge the configurations with the
  *                      plugin settings.
  *
  * @param bool  $deep   Should you use deep or shallow merging
  *
  * @return \Grav\Common\Data\Data
  */
 protected function mergeConfig(Page $page, $deep = false)
 {
     $class_name = $this->name;
     $class_name_merged = $class_name . '.merged';
     $defaults = $this->config->get('plugins.' . $class_name, array());
     $header = array();
     if (isset($page->header()->{$class_name_merged})) {
         $merged = $page->header()->{$class_name_merged};
         if (count($merged) > 0) {
             return $merged;
         } else {
             return new Data($defaults);
         }
     }
     // Get default plugin configurations and retrieve page header configuration
     if (isset($page->header()->{$class_name})) {
         if ($deep) {
             $header = array_replace_recursive($defaults, $page->header()->{$class_name});
         } else {
             $header = array_merge($defaults, $page->header()->{$class_name});
         }
     } else {
         $header = $defaults;
     }
     // Create new config object and set it on the page object so it's cached for next time
     $config = new Data($header);
     $page->modifyHeader($class_name_merged, $config);
     // Return configurations as a new data config class
     return $config;
 }
Example #3
0
 /**
  * Merge global and page configurations.
  *
  * @param Page  $page    The page to merge the configurations with the
  *                       plugin settings.
  * @param bool  $deep    Should you use deep or shallow merging
  * @param array $params  Array of additional configuration options to
  *                       merge with the plugin settings.
  *
  * @return \Grav\Common\Data\Data
  */
 protected function mergeConfig(Page $page, $deep = false, $params = [])
 {
     $class_name = $this->name;
     $class_name_merged = $class_name . '.merged';
     $defaults = $this->config->get('plugins.' . $class_name, []);
     $page_header = $page->header();
     $header = [];
     if (!isset($page_header->{$class_name_merged}) && isset($page_header->{$class_name})) {
         // Get default plugin configurations and retrieve page header configuration
         $config = $page_header->{$class_name};
         if (is_bool($config)) {
             // Overwrite enabled option with boolean value in page header
             $config = ['enabled' => $config];
         }
         // Merge page header settings using deep or shallow merging technique
         if ($deep) {
             $header = array_replace_recursive($defaults, $config);
         } else {
             $header = array_merge($defaults, $config);
         }
         // Create new config object and set it on the page object so it's cached for next time
         $page->modifyHeader($class_name_merged, new Data($header));
     } else {
         if (isset($page_header->{$class_name_merged})) {
             $merged = $page_header->{$class_name_merged};
             $header = $merged->toArray();
         }
     }
     if (empty($header)) {
         $header = $defaults;
     }
     // Merge additional parameter with configuration options
     if ($deep) {
         $header = array_replace_recursive($header, $params);
     } else {
         $header = array_merge($header, $params);
     }
     // Return configurations as a new data config class
     return new Data($header);
 }
 /**
  * @param \Grav\Common\Page\Page|\Grav\Common\Data\Data $obj
  *
  * @return \Grav\Common\Page\Page|\Grav\Common\Data\Data
  */
 protected function storeFiles($obj)
 {
     // Process previously uploaded files for the current URI
     // and finally store them. Everything else will get discarded
     $queue = $this->admin->session()->getFlashObject('files-upload');
     $queue = $queue[base64_encode($this->grav['uri']->url())];
     if (is_array($queue)) {
         foreach ($queue as $key => $files) {
             foreach ($files as $destination => $file) {
                 if (!rename($file['tmp_name'], $destination)) {
                     throw new \RuntimeException(sprintf($this->admin->translate('PLUGIN_ADMIN.FILEUPLOAD_UNABLE_TO_MOVE', null), '"' . $file['tmp_name'] . '"', $destination));
                 }
                 unset($files[$destination]['tmp_name']);
             }
             if ($this->view == 'pages') {
                 $keys = explode('.', preg_replace('/^header./', '', $key));
                 $init_key = array_shift($keys);
                 if (count($keys) > 0) {
                     $new_data = isset($obj->header()->{$init_key}) ? $obj->header()->{$init_key} : [];
                     Utils::setDotNotation($new_data, implode('.', $keys), $files, true);
                 } else {
                     $new_data = $files;
                 }
                 if (isset($data['header'][$init_key])) {
                     $obj->modifyHeader($init_key, array_replace_recursive([], $data['header'][$init_key], $new_data));
                 } else {
                     $obj->modifyHeader($init_key, $new_data);
                 }
             } else {
                 // TODO: [this is JS handled] if it's single file, remove existing and use set, if it's multiple, use join
                 $obj->join($key, $files);
                 // stores
             }
         }
     }
     return $obj;
 }