Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 10.51 KB | None | 0 0
  1. <?php
  2.  
  3. // Namespace
  4. namespace Leximo;
  5.  
  6. /**
  7.  * Metabox
  8.  * @author Jan Doušek <mail@jandousek.cz>
  9.  */
  10.  
  11. class Metabox {
  12.  
  13.   /* @var string */
  14.   const POSTS = 'posts';
  15.  
  16.   /* @var string */
  17.   const TYPES = 'types';
  18.  
  19.   /* @var string */
  20.   const TEMPLATES = 'templates';
  21.  
  22.   /* @var string */
  23.   const IDS = 'ids';
  24.  
  25.   /* @var object */
  26.   public static $template = null;
  27.  
  28.   /* @var string */
  29.   private $id = null;
  30.  
  31.   /* @var string */
  32.   private $title = null;
  33.  
  34.   /* @var string */
  35.   private $prefix = null;
  36.  
  37.   /* @var string */
  38.   private $position = 'content';
  39.  
  40.   /* @var array */
  41.   private $limits = []; // [self::POSTS => [self::TYPES => [], self::TEMPLATES => [], self::IDS => []]]
  42.  
  43.   /* @var array */
  44.   private $contents = [];
  45.  
  46.   /* @var object */
  47.   private $form = null;
  48.  
  49.   /* @var object */
  50.   private $object = null;
  51.  
  52.   /* @var array */
  53.   private $errors = [];
  54.  
  55.   /* @var object */
  56.   private $presenter = null;
  57.  
  58.   /**
  59.    * Constructor
  60.    * @param string $id
  61.    * @param string $title
  62.    * @param array $limits
  63.    * @return void
  64.    */
  65.  
  66.   public function __construct($id, $title, array $limits) {
  67.  
  68.     // Set id
  69.     $this->id = LEXIMO_SLUG . '_metabox-' . $id;
  70.  
  71.     // Set title
  72.     $this->title = $title;
  73.  
  74.     // Set limits
  75.     $this->setLimits($limits);
  76.  
  77.     // Set presenter
  78.     $this->presenter = Presenter::getInstance();
  79.  
  80.     // Set template
  81.     self::$template = $this->presenter::$templatesPrivate . '/metabox';
  82.  
  83.     // Init new form
  84.     $this->form = new Forms\Form($id);
  85.  
  86.     // Set form method
  87.     $this->form->setMethod($this->form::POST);
  88.  
  89.     // Set object
  90.     $this->setObject();
  91.  
  92.     // Set errors
  93.     $this->setErrors();
  94.  
  95.     // Render draft message
  96.     $this->renderDraftMessage();
  97.  
  98.     // Save
  99.     $this->save();
  100.  
  101.   }
  102.  
  103.   /**
  104.    * Set position
  105.    * @param string $position
  106.    * @return void
  107.    */
  108.  
  109.   public function setPosition($position) {
  110.  
  111.     // Set position
  112.     $this->position = $position;
  113.  
  114.     // Return class
  115.     return $this;
  116.  
  117.   }
  118.  
  119.   /**
  120.    * Set prefix
  121.    * @param string $prefix
  122.    * @return void
  123.    */
  124.  
  125.   public function setPrefix($prefix) {
  126.  
  127.     // Set prefix
  128.     $this->prefix = $prefix;
  129.  
  130.     // Return class
  131.     return $this;
  132.  
  133.   }
  134.  
  135.   /**
  136.    * Set limits
  137.    * @param array $limits
  138.    * @return void
  139.    */
  140.  
  141.   private function setLimits($limits) {
  142.  
  143.     // Set limits
  144.     $this->limits = $limits;
  145.  
  146.     // OLD version of set limits
  147.     /* foreach($limits as $key=>$limit) {
  148.       $this->limits[$key] = array_replace($this->limits[$key], $limit);
  149.     } */
  150.  
  151.   }
  152.  
  153.   /**
  154.    * Add title
  155.    * @param string $id
  156.    * @param string $title
  157.    * @return void
  158.    */
  159.  
  160.   public function addTitle($id, $title) {
  161.     $this->contents[$id] = (object) ['type' => 'title', 'content' => $title];
  162.   }
  163.  
  164.   /**
  165.    * Add content
  166.    * @param string $id
  167.    * @param string $content
  168.    * @return void
  169.    */
  170.  
  171.   public function addContent($id, $content) {
  172.     $this->contents[$id] = (object) ['type' => 'content', 'content' => $content];
  173.   }
  174.  
  175.   /**
  176.    * Add separator
  177.    * @param int $height
  178.    * @return void
  179.    */
  180.  
  181.   public function addSeparator($height = 1) {
  182.     $this->contents[] = (object) ['type' => 'separator', 'height' => intval($height)];
  183.   }
  184.  
  185.   /**
  186.    * Set object
  187.    * @param int $id
  188.    * @return void
  189.    */
  190.  
  191.   private function setObject($id = null) {
  192.  
  193.     // Get globals
  194.     global $pagenow;
  195.  
  196.     // Post
  197.     if($pagenow == 'post.php' && $id = lex_value($id, $this->presenter->request->post)) {
  198.       $this->object = new Posts\Single(['post_type' => $this->limits[self::POSTS][self::TYPES], 'post_status' => ['publish', 'draft', 'pending', 'private'], 'id' => $id]);
  199.     }
  200.  
  201.   }
  202.  
  203.   /**
  204.    * Set errors
  205.    * @param void
  206.    * @return void
  207.    */
  208.  
  209.   private function setErrors() {
  210.     $this->errors = !empty($this->object) && !$this->object->isEmpty() ? $this->object->meta->{$this->id . '_errors'} : [];
  211.   }
  212.  
  213.   /**
  214.    * Get errors
  215.    * @param void
  216.    * @return array
  217.    */
  218.  
  219.   public function getErrors() {
  220.     return !empty($this->errors) ? $this->errors : [];
  221.   }
  222.  
  223.   /**
  224.    * Get contents
  225.    * @param string $id
  226.    * @param string $content
  227.    * @return void
  228.    */
  229.  
  230.   public function getContents() {
  231.     return $this->contents;
  232.   }
  233.  
  234.   /**
  235.    * Get form
  236.    * @param void
  237.    * @return object
  238.    */
  239.  
  240.   public function getForm() {
  241.     return $this->form;
  242.   }
  243.  
  244.   /**
  245.    * Save
  246.    * @param void
  247.    * @return void
  248.    */
  249.  
  250.   private function save() {
  251.  
  252.     // Check post data
  253.     if(!isset($_POST) || count($_POST) < 1) return false;
  254.  
  255.     // HOOK - save_post
  256.     add_action('save_post', function() { global $post;
  257.  
  258.       // Clear form errors
  259.       $this->form->clearErrors();
  260.  
  261.       // Form succeed
  262.       $this->form->succeed();
  263.  
  264.       // Save post
  265.       $this->savePost($post, $this->form->getErrors());
  266.  
  267.     });
  268.  
  269.     // HOOK - edit_term
  270.     add_action('edit_term', function() {
  271.  
  272.     });
  273.  
  274.   }
  275.  
  276.   /**
  277.    * Save post
  278.    * @param object $id
  279.    * @param array $errors
  280.    * @return void
  281.    */
  282.  
  283.   private function savePost($post, array $errors = []) {
  284.  
  285.     // Set globals
  286.     global $pagenow;
  287.  
  288.     // Check pagenow
  289.     if(!in_array($pagenow, ['post.php', 'edit.php'])) return;
  290.  
  291.     // Check post type and set object
  292.     if(in_array($post->post_type, $this->limits[self::POSTS][self::TYPES])) {
  293.       $this->setObject($post->ID);
  294.     }
  295.  
  296.     // Check object
  297.     if(!empty($this->object) && !$this->object->isEmpty()) {
  298.  
  299.       // Save meta informations
  300.       foreach($this->form->getData(['form']) as $key=>$value) {
  301.         if(isset($_POST) && isset($_POST[$key])) $this->object->meta->updateSingle($key, $value);
  302.       }
  303.  
  304.       // Save errors
  305.       $this->savePostErrors($this->object, $errors);
  306.  
  307.       // Change post status
  308.       if(!empty($errors)) {
  309.         $this->changePostStatus($this->object->id);
  310.       }
  311.  
  312.     }
  313.  
  314.   }
  315.  
  316.   /**
  317.    * Change post status
  318.    * @param int $id
  319.    * @param string $status
  320.    * @return bool
  321.    */
  322.  
  323.   private function changePostStatus($id, $status = 'draft') { global $wpdb;
  324.     return $wpdb->update($wpdb->posts, ['post_status' => $status], ['id' => $id]);
  325.   }
  326.  
  327.   /**
  328.    * Save post errors
  329.    * @param object $post
  330.    * @param array $errors
  331.    * @return bool
  332.    */
  333.  
  334.   private function savePostErrors($post, array $errors = []) {
  335.  
  336.     // Set key
  337.     $key = $this->id . '_errors';
  338.  
  339.     // Delete whole meta information
  340.     if(empty($errors)) {
  341.       return $post->meta->deleteSingle($key);
  342.     }
  343.  
  344.     // Add or update meta information
  345.     else {
  346.       return $post->meta->updateSingle($key, $errors);
  347.     }
  348.  
  349.   }
  350.  
  351.   /**
  352.    * Register
  353.    * @param void
  354.    * @return void
  355.    */
  356.  
  357.   public function register() {
  358.  
  359.     // Add metabox for post type
  360.     if(!empty($this->limits['posts']['types']) && $this->isCorrectPostScreen()) {
  361.  
  362.       lex_print($this->id);
  363.  
  364.       // Create metabox for post
  365.       $this->createMetaboxForPost();
  366.  
  367.     }
  368.  
  369.     // Add metabox for taxonomies
  370.     if(!empty($this->limits['taxonomies']['types'])) {
  371.  
  372.       // Create metabox for taxonomies
  373.       $this->createMetaboxForTaxonomies();
  374.  
  375.     }
  376.  
  377.   }
  378.  
  379.   /**
  380.    * Is correct post screen
  381.    * @param void
  382.    * @return bool
  383.    */
  384.  
  385.   private function isCorrectPostScreen() {
  386.  
  387.     // Check post types
  388.     if(!empty($this->limits[self::POSTS][self::TYPES]) && empty($this->limits[self::POSTS][self::TEMPLATES]) && empty($this->limits[self::POSTS][self::IDS])) {
  389.       lex_print('mrd');
  390.       return true;
  391.     }
  392.  
  393.     // Check object
  394.     if(!empty($this->object) && !$this->object->isEmpty()) {
  395.  
  396.       // Check templates
  397.       if(!empty($this->limits[self::POSTS][self::TEMPLATES]) && in_array($this->object->template, $this->limits[self::POSTS][self::TEMPLATES])) {
  398.         return true;
  399.       }
  400.  
  401.       // Check IDs
  402.       if(!empty($this->limits[self::POSTS][self::IDS]) && in_array($this->object->id, $this->limits[self::POSTS][self::IDS])) {
  403.         return true;
  404.       }
  405.  
  406.     }
  407.  
  408.   }
  409.  
  410.   /**
  411.    * Create metabox for post
  412.    * @param void
  413.    * @return void
  414.    */
  415.  
  416.   private function createMetaboxForPost() {
  417.  
  418.     // Add action
  419.     add_action('add_meta_boxes', function() {
  420.  
  421.       // Add metabox
  422.       add_meta_box($this->id, $this->title, function() {
  423.  
  424.         // Add metabox to presenter
  425.         $this->presenter->metabox = $this;
  426.  
  427.         // Render metabox
  428.         $this->presenter->render(self::$template);
  429.  
  430.       },
  431.  
  432.       // Limit metabox to specific post types
  433.       $this->limits[self::POSTS][self::TYPES]);
  434.  
  435.     });
  436.  
  437.   }
  438.  
  439.   /**
  440.    * Create metabox for term
  441.    * @param void
  442.    * @return void
  443.    */
  444.  
  445.   private function createMetaboxForTerm() {
  446.     /* TODO */
  447.   }
  448.  
  449.   /**
  450.    * Render draft message
  451.    * @param void
  452.    * @return void
  453.    */
  454.  
  455.   private function renderDraftMessage() {
  456.  
  457.     // Get globals
  458.     global $pagenow;
  459.  
  460.     // Post
  461.     if($pagenow == 'post.php' && !empty($this->errors) && $this->object->status == 'draft') {
  462.  
  463.       // HOOK action - edit_form_after_title
  464.       add_action('edit_form_after_title', function() {
  465.  
  466.         // Render message
  467.         $this->presenter->render($this->presenter::$templatesPrivate . '/flash', ['type' => 'danger', 'title' => LEXIMO_MESSAGES[301]]);
  468.  
  469.       });
  470.     }
  471.  
  472.   }
  473.  
  474.   /**
  475.    * Add field
  476.    * @param string $method
  477.    * @param array $args
  478.    * @return mixed
  479.    */
  480.  
  481.   private function addField($method, $args) {
  482.  
  483.     // Add prefix
  484.     if($this->prefix) {
  485.       $args[0] = $this->prefix . '_' . $args[0];
  486.     }
  487.  
  488.     // Add field to form
  489.     call_user_func_array([$this->form, $method], $args);
  490.  
  491.     // Get field
  492.     $field = $this->form->getField($args[0])->setClasses(LEXIMO_SLUG . '-input');
  493.  
  494.     // Add field to contents
  495.     $this->contents[$args[0]] = (object) ['type' => 'field'];
  496.  
  497.     // Check object
  498.     if(!empty($this->object) && !$this->object->isEmpty()) {
  499.  
  500.       // Add value and set error
  501.       $field->{($field->type == 'checkbox' ? 'setValue' : 'setDefault')}($this->object->meta->{$args[0]})
  502.         ->setError(isset($this->errors[$args[0]]) ? $this->errors[$args[0]] : null);
  503.  
  504.     }
  505.  
  506.     // Return field
  507.     return $field;
  508.  
  509.   }
  510.  
  511.   /**
  512.    * __ Call
  513.    * @param string $method
  514.    * @param array $args
  515.    * @return mixed
  516.    */
  517.  
  518.   public function __call($method, $args) {
  519.  
  520.     // Add field
  521.     if(substr($method, 0, 3) === 'add') {
  522.  
  523.       // Change file into media
  524.       if($method == 'addFile') $method = 'addMedia';
  525.  
  526.       // Add field
  527.       return $this->addField($method, $args);
  528.  
  529.     }
  530.  
  531.   }
  532.  
  533. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement