/** * @return void */ public function init() { $this->setMethod('post')->setName('psn_form_rule')->setAttrib('accept-charset', 'utf-8'); $this->setAttrib('class', 'ifw-wp-zend-form-ul'); $this->setDecorators(array('FormElements', 'Form')); $this->_fieldDecorators = array(new IfwPsn_Zend_Form_Decorator_SimpleInput(), array('HtmlTag', array('tag' => 'li')), 'Errors', 'Description'); $this->addElement('text', 'name', array('label' => __('Rule name', 'psn'), 'description' => __('Name of the rule', 'psn'), 'required' => true, 'filters' => array(new IfwPsn_Zend_Filter_SanitizeTextField()), 'maxlength' => 80, 'validators' => $_GET['appaction'] == 'create' ? array(new Psn_Admin_Form_Validate_Max()) : array(), 'decorators' => $this->getFieldDecorators(), 'order' => 10)); $postTypeOptions = array(); if ($this->isHideNonPublicPostTypes()) { $postTypeOptions['public'] = true; } /** * Post Type */ $postType = $this->createElement('select', 'posttype'); $postTypeOptions = array_merge(array('all' => __('all types', 'psn')), IfwPsn_Wp_Proxy_Post::getAllTypesWithLabels($postTypeOptions)); unset($postTypeOptions['attachment']); unset($postTypeOptions['nav_menu_item']); $postType->setLabel(__('Post type', 'psn'))->setDecorators($this->getFieldDecorators())->setFilters(array(new IfwPsn_Zend_Filter_SanitizeTextField()))->addMultiOptions($postTypeOptions)->setOrder(20); $this->addElement($postType); /** * Post status */ $statusValues = array_merge(array('new' => __('New', 'ifw'), 'not_published' => __('Not published', 'psn'), 'not_private' => __('Not private', 'psn'), 'not_pending' => __('Not pending', 'psn'), 'not_trash' => __('Not trash', 'psn')), IfwPsn_Wp_Proxy_Post::getAllStatusesWithLabels(array('show_domain' => true))); natcasesort($statusValues); $statusValues = array_merge(array('anything' => __('anything', 'psn')), $statusValues); /** * Status before */ $statusBefore = $this->createElement('select', 'status_before'); $statusBefore->setLabel(__('Status before', 'psn'))->setDecorators($this->getFieldDecorators())->setFilters(array(new IfwPsn_Zend_Filter_SanitizeTextField()))->addMultiOptions($statusValues)->setOrder(30); $this->addElement($statusBefore); /** * Status after */ $statusAfter = $this->createElement('select', 'status_after'); $statusAfter->setLabel(__('Status after', 'psn'))->setDecorators($this->getFieldDecorators())->setFilters(array(new IfwPsn_Zend_Filter_SanitizeTextField()))->addMultiOptions($statusValues)->setOrder(40); $this->addElement($statusAfter); /** * Subject */ $this->addElement('text', 'notification_subject', array('label' => __('Subject', 'psn'), 'description' => sprintf(__('Open the help menu in the upper right corner to see a list of all <a %s>supported placeholders</a>.', 'psn'), 'href="javascript:void(0)" class="placeholder_help"') . ' ' . sprintf(__('Supports <a %s>conditions</a> (if activated in the options).', 'psn'), 'href="javascript:void(0)" class="conditions_help"'), 'required' => true, 'filters' => array('StringTrim', 'StripTags'), 'maxlength' => 200, 'decorators' => $this->getFieldDecorators(), 'order' => 50)); $this->getElement('notification_subject')->getDecorator('Description')->setEscape(false); /** * Body */ $this->addElement('textarea', 'notification_body', array('label' => __('Text', 'psn'), 'description' => sprintf(__('Open the help menu in the upper right corner to see a list of all <a %s>supported placeholders</a>.', 'psn'), 'href="javascript:void(0)" class="placeholder_help"') . ' ' . sprintf(__('Supports <a %s>conditions</a> (if activated in the options).', 'psn'), 'href="javascript:void(0)" class="conditions_help"'), 'validators' => array(new Psn_Admin_Form_Validate_MailBody()), 'required' => false, 'filters' => array('StringTrim', 'HtmlEntities'), 'cols' => 80, 'rows' => 10, 'allowempty' => false, 'decorators' => $this->getFieldDecorators(), 'order' => 60)); $this->getElement('notification_body')->getDecorator('Description')->setEscape(false); /** * Recipients */ $recipients = IfwPsn_Wp_Proxy_Filter::apply('psn_rule_form_recipients_options', array('admin' => __('Blog admin', 'psn'), 'author' => __('Post author', 'psn'))); /** * TO */ $recipient = $this->createElement('multiselect', 'recipient'); $recipient->setLabel(__('Recipient', 'psn'))->setDescription(__('To select multiple recipients hold down the control button (ctrl) on Windows or command button (cmd) on Mac.', 'psn'))->setRequired(false)->setValidators(array(new Psn_Admin_Form_Validate_ToEmail()))->setAllowEmpty(false)->setRegisterInArrayValidator(false)->setDecorators($this->getFieldDecorators())->setFilters(array('StringTrim', 'StripTags'))->setAttrib('size', 10)->addMultiOptions($recipients)->setOrder(70); $this->addElement($recipient); /** * CC */ $cc_select = $this->createElement('multiselect', 'cc_select'); $cc_select->setLabel(__('CC', 'psn'))->setDescription(__('To select multiple cc recipients hold down the control button (ctrl) on Windows or command button (cmd) on Mac.', 'psn'))->setDecorators($this->getFieldDecorators())->setFilters(array('StringTrim', 'StripTags'))->setAttrib('size', 10)->addMultiOptions($recipients)->setOrder(80); $this->addElement($cc_select); $this->addElement('textarea', 'cc', array('label' => __('Custom CC', 'psn'), 'description' => IfwPsn_Wp_Proxy_Filter::apply('psn_rule_form_description_cc', sprintf(__('Add additional recipient emails. Comma separated. Supports placeholders like [author_email], [blog_admin_email], [current_user_email] or the dynamic [recipient_*] placeholders. Check the <a %s>placeholders help</a>.', 'psn'), 'href="javascript:void(0)" class="placeholder_help"')), 'filters' => array('StringTrim', 'HtmlEntities', new Psn_Admin_Form_Filter_Cc(IfwPsn_Wp_Plugin_Manager::getInstance('Psn')->isPremium())), 'cols' => 80, 'rows' => 1, 'decorators' => $this->getFieldDecorators(), 'order' => 85)); $this->getElement('cc')->getDecorator('Description')->setEscape(false); /** * BCC */ $bcc_select = $this->createElement('multiselect', 'bcc_select'); $bcc_select->setLabel(__('BCC', 'psn'))->setDescription(__('To select multiple bcc recipients hold down the control button (ctrl) on Windows or command button (cmd) on Mac.', 'psn'))->setDecorators($this->getFieldDecorators())->setFilters(array('StringTrim', 'StripTags'))->setAttrib('size', 10)->addMultiOptions($recipients)->setOrder(90); $this->addElement($bcc_select); $this->addElement('textarea', 'bcc', array('label' => __('Custom BCC', 'psn'), 'description' => IfwPsn_Wp_Proxy_Filter::apply('psn_rule_form_description_bcc', sprintf(__('Add bcc recipient emails. Comma separated. Supports placeholders like [author_email], [blog_admin_email], [current_user_email] or the dynamic [recipient_*] placeholders. Check the <a %s>placeholders help</a>.', 'psn'), 'href="javascript:void(0)" class="placeholder_help"')), 'escape' => false, 'filters' => array('StringTrim', 'HtmlEntities', new Psn_Admin_Form_Filter_Bcc(IfwPsn_Wp_Plugin_Manager::getInstance('Psn')->isPremium())), 'cols' => 80, 'rows' => 1, 'decorators' => $this->getFieldDecorators(), 'order' => 95)); $this->getElement('bcc')->getDecorator('Description')->setEscape(false); /** * Active */ $active = $this->createElement('checkbox', 'active'); $active->setLabel(__('Active', 'psn'))->setDecorators($this->getFieldDecorators())->setDescription(__('Only active rules take affect on post transition changes', 'psn'))->setChecked(true)->setCheckedValue(1)->setOrder(100); $this->addElement($active); /** * Service email */ $email = $this->createElement('checkbox', 'service_email'); $email->setLabel(__('Email', 'psn'))->setDecorators($this->getFieldDecorators())->setDescription(__('When the rule matches, an email will be send to the recipient with subject and text', 'psn'))->setChecked(true)->setCheckedValue(1)->setOrder(110); $this->addElement($email); if (isset($_REQUEST['id'])) { $this->addElement('hidden', 'id', array('value' => $_REQUEST['id'], 'decorators' => array('ViewHelper'))); } $this->setNonce('psn-form-rule'); $this->addElement('note', 'p', array('label' => '-', 'value' => ' ', 'decorators' => array('ViewHelper', array('HtmlTag', array('tag' => 'p'))), 'order' => 999)); /** * Submit button */ $this->addElement('submit', 'submit', array('ignore' => true, 'label' => __('Save', 'psn'), 'class' => 'button-primary', 'decorators' => array('ViewHelper', array('HtmlTag', array('tag' => 'span'))), 'order' => 1000)); $this->addElement('note', 'divider', array('label' => '-', 'value' => ' — ', 'decorators' => array('ViewHelper', array('HtmlTag', array('tag' => 'span'))), 'order' => 1001)); $this->addElement('submit', 'submit_and_stay', array('ignore' => true, 'label' => __('Save and stay on page', 'psn'), 'class' => 'button', 'decorators' => array('ViewHelper', array('HtmlTag', array('tag' => 'span'))), 'order' => 1002)); }
/** * @return array */ public static function getAllTypesCategories() { $result = array(); foreach (IfwPsn_Wp_Proxy_Post::getAllTypesWithLabels() as $posttype => $params) { $categories = IfwPsn_Wp_Proxy_Categories::getByPosttype($posttype); if (!empty($categories)) { if (!isset($result[$posttype])) { $result[$posttype] = array(); } foreach ($categories as $cat) { array_push($result[$posttype], array('id' => (int) $cat->term_id, 'name' => $cat->name)); } } } // $result = array_merge($result, array('post' => self::getAllCategories())); // $result = array_merge($result, self::getCustomPostTypesCategories()); return $result; }
/** * @param $post * @return bool */ public function matchesCategories($post) { $categories = $this->getCategories(); if ($categories === null) { // no categories filter set return true; } $postCategories = IfwPsn_Wp_Proxy_Post::getAttachedCategoriesIds($post); if (isset($categories['include'])) { $include = $categories['include']; } else { // no include set, get all $include = IfwPsn_Wp_Proxy_Post::getAllCategoryIds(IfwPsn_Wp_Proxy_Post::getType($post)); } $exclude = array(); if (isset($categories['exclude'])) { $exclude = $categories['exclude']; } // the includes which are not dominated by excludes $includeDiff = array_diff($include, $exclude); if (count(array_intersect($postCategories, $includeDiff)) > 0) { // post has cats that should be included return true; } return false; }
/** * Initializes commonly used properties */ protected function _initFormView() { require_once $this->_pm->getPathinfo()->getRootLib() . 'Psn/Patch/Database.php'; require_once $this->_pm->getPathinfo()->getRootLib() . 'Psn/Admin/Form/NotificationRule.php'; require_once $this->_pm->getPathinfo()->getRootLib() . 'Psn/Notification/Placeholders.php'; require_once $this->_pm->getPathinfo()->getRootLib() . 'IfwPsn/Wp/Plugin/Menu/Help.php'; $dbPatcher = new Psn_Patch_Database(); $this->view->dbPatcher = $dbPatcher; if (!$this->_pm->isPremium()) { IfwPsn_Wp_Proxy_Filter::add('psn_rule_form_description_cc', create_function('$var', 'return $var . " " . __("Limited to 1. Get the Premium version for unlimited Cc emails.", "psn");')); IfwPsn_Wp_Proxy_Filter::add('psn_rule_form_description_bcc', create_function('$var', 'return $var . " " . __("(Premium feature)", "psn");')); } $formOptions = array(); if ($this->_pm->getOptionsManager()->getOption('psn_hide_nonpublic_posttypes') != null) { $formOptions['hide_nonpublic_posttypes'] = true; } $this->_form = new Psn_Admin_Form_NotificationRule($formOptions); if (!$this->_pm->isPremium()) { $this->_form->getElement('recipient')->setDescription(__('Get additional recipients like user roles (including custom roles) or all users with the Premium version.', 'psn')); } $this->_helper->viewRenderer('form'); $placeholders = new Psn_Notification_Placeholders(); $help = new IfwPsn_Wp_Plugin_Menu_Help($this->_pm); $help->setTitle(__('Placeholders', 'psn'))->setId('placeholders')->setHelp($placeholders->getOnScreenHelp())->setSidebar($this->_getHelpSidebar())->load(); $help = new IfwPsn_Wp_Plugin_Menu_Help($this->_pm); $help->setTitle(__('Conditions', 'psn'))->setId('conditions')->setHelp(IfwPsn_Wp_Tpl::getFilesytemInstance($this->_pm)->render('admin_help_conditions.html.twig', array('pm' => $this->_pm)))->setSidebar($this->_getHelpSidebar())->load(); $this->view->langListOfPlaceholdersLabel = __('Show list of placeholders available for subject and text', 'psn'); $this->view->langListOfPlaceholdersLink = __('List of placeholders', 'psn'); $this->view->langHelp = __('Help', 'ifw'); if (Psn_Model_Rule::hasMax() && Psn_Model_Rule::reachedMax() && $this->getRequest()->getActionName() == 'create') { $this->view->maxReached = __(sprintf('You reached the maximum number of rules (%s) for the free version. Get the <a href="%s" target="_blank">Premium Version</a> for unlimmited rules and more features.', Psn_Model_Rule::getMax(), $this->_pm->getConfig()->plugin->premiumUrl), 'psn'); } if ($this->_request->getActionName() == 'create') { $this->view->langHeadline = __('Create new rule', 'psn'); IfwPsn_Wp_Proxy_Script::loadAdmin('psn_rule_examples', $this->_pm->getEnv()->getUrlAdminJs() . 'rule_examples.js', array(), $this->_pm->getEnv()->getVersion()); IfwPsn_Wp_Proxy_Script::localize('psn_rule_examples', 'PsnExampleRule', array('ThePendingPost' => __('The pending post', 'psn'), 'ThePendingPostSubject' => __('[blog_name]: New post is waiting for review', 'psn'), 'ThePendingPostBody' => str_replace('<br>', "\n", __('Howdy admin,<br>there is a new post by [author_display_name] waiting for review:<br>"[post_title]".<br><br>Here is the permalink: [post_permalink]<br><br>Here is the backend edit link: [post_editlink]<br><br>The author\'s email address is [author_email]<br><br>[blog_wpurl]', 'psn')), 'TheHappyAuthor' => __('The happy author', 'psn'), 'TheHappyAuthorSubject' => __('Your post on [blog_name] got published!', 'psn'), 'TheHappyAuthorBody' => str_replace('<br>', "\n", __('Howdy [author_display_name],<br>we are happy to tell you that your post "[post_title]" got published.<br><br>Here is the permalink: [post_permalink]<br><br>Thanks for your good work,<br>your [blog_name]-Team<br><br>[blog_wpurl]', 'psn')), 'ThePedanticAdmin' => __('The pedantic admin', 'psn'), 'ThePedanticAdminSubject' => __('[blog_name]: Post status transition from [post_status_before] to [post_status_after]', 'psn'), 'ThePedanticAdminBody' => str_replace('<br>', "\n", __('Howdy admin,<br>a post status transition was a detected on "[post_title]".<br><br>Status before: [post_status_before]<br>Status after: [post_status_after]<br><br>Post permalink: [post_permalink]', 'psn')))); IfwPsn_Wp_Proxy_Style::loadAdmin('psn_rule_examples', $this->_pm->getEnv()->getUrlAdminCss() . 'rule_examples.css'); $this->view->langExamples = __('Examples', 'psn'); $this->view->langExamplesDesc = __('Click the buttons below to get an idea of how you can set up notification rules.', 'psn'); $this->view->langExamplesRuleThePendingPost = __('The pending post', 'psn'); $this->view->langExamplesRuleThePendingPostDesc = __('This rule sends a notification when a new post got submitted for review.', 'psn'); $this->view->langExamplesRuleTheHappyAuthor = __('The happy author', 'psn'); $this->view->langExamplesRuleTheHappyAuthorDesc = __('This rule sends an email to the author of a post when it got published.', 'psn'); $this->view->langExamplesRuleThePedanticAdmin = __('The pedantic admin', 'psn'); $this->view->langExamplesRuleThePedanticAdminDesc = __('This rule is for blog admins who want to be informed about every single post status change.', 'psn'); $this->view->langExamplesRuleDebug = __('Debug rule', 'psn'); $this->view->langExamplesRuleDebugDesc = __('This rule is just for creating log entries to monitor all available values when the rule matched. Remember to activate option Logger / Log rule matches.', 'psn') . ' ' . sprintf('<a href="%s" target="_blank">' . __('More details', 'psn') . '</a>', $this->_pm->getConfig()->plugin->docUrl . 'rules.html#debug-rule'); } else { $this->view->langHeadline = __('Edit notification rule', 'psn'); $this->_form->getElement('submit')->setLabel(__('Update', 'psn')); $this->_form->getElement('submit_and_stay')->setLabel(__('Update and stay on page', 'psn')); } $this->view->actionName = $this->_request->getActionName(); IfwPsn_Wp_Proxy_Script::loadAdmin('psn_rule_form', $this->_pm->getEnv()->getUrlAdminJs() . 'rule_form.js', array(), $this->_pm->getEnv()->getVersion()); IfwPsn_Wp_Proxy_Script::localize('psn_rule_form', 'psn', array('is_premium' => $this->_pm->isPremium())); IfwPsn_Wp_Proxy_Script::localize('psn_rule_form', 'psn_taxonomies', array_merge(IfwPsn_Wp_Proxy_Post::getAllTypesCategories(), array('lang_Categories' => __('Categories', 'psn'), 'lang_categories_help' => sprintf(__('To select multiple categories hold down the control button (ctrl) on Windows or command button (cmd) on Mac.<br>If nothing is selected, all categories get included.<br>Exclude is dominant. See the <a href="%s" target="_blank">docs</a> for more details.', 'psn'), 'http://docs.ifeelweb.de/post-status-notifier/rules.html#category-filter'), 'lang_include_categories' => __('Include only these categories', 'psn'), 'lang_exclude_categories' => __('Exclude categories', 'psn'), 'lang_select_all' => __('select all', 'psn'), 'lang_remove_all' => __('remove all', 'psn'), 'lang_no_categories' => __('Post type "%s" has no categories.', 'psn'), 'lang_premium_feature' => sprintf(__('This is a <a href="%s" target="_blank">Premium</a> feature.', 'psn'), $this->_pm->getConfig()->plugin->premiumUrl)))); IfwPsn_Wp_Proxy_Action::doAction('psn_rule_form', $this->_form); }
/** * @return array */ protected function _getPostData() { $result = array(); foreach (get_object_vars($this->_post) as $k => $v) { if (strpos($k, 'post_') === false) { $k = 'post_' . $k; } $result[$k] = $v; } $result['post_permalink'] = IfwPsn_Wp_Proxy_Post::getPermalink($this->_post); $result['post_editlink'] = IfwPsn_Wp_Proxy_Post::getEditLink($this->_post->ID); $result['post_format'] = IfwPsn_Wp_Proxy_Post::getFormat($this->_post); $result['post_preview_25'] = IfwPsn_Wp_Proxy_Post::getWords($this->_post, 25); $result['post_preview_50'] = IfwPsn_Wp_Proxy_Post::getWords($this->_post, 50); $result['post_preview_75'] = IfwPsn_Wp_Proxy_Post::getWords($this->_post, 75); $result['post_preview_100'] = IfwPsn_Wp_Proxy_Post::getWords($this->_post, 100); $strippedContent = strip_tags($this->_post->post_content); $result['post_content_strip_tags'] = trim(preg_replace('/\\[.*?\\]/U', '', $strippedContent)); // get the post's categories $categories = IfwPsn_Wp_Proxy_Post::getAttachedCategoriesNames($this->_post); $result['post_categories'] = implode(', ', $categories); $categoriesSlugs = IfwPsn_Wp_Proxy_Post::getAttachedCategoriesSlugs($this->_post); $result['post_categories_slugs_array'] = $categoriesSlugs; $result['post_categories_slugs'] = implode(', ', $categoriesSlugs); // get the post's tags $tags = IfwPsn_Wp_Proxy_Post::getAttachedTagsNames($this->_post); $result['post_tags'] = implode(', ', $tags); $tagsSlugs = IfwPsn_Wp_Proxy_Post::getAttachedTagsSlugs($this->_post); $result['post_tags_slugs_array'] = $tagsSlugs; $result['post_tags_slugs'] = implode(', ', $tagsSlugs); // custom keys $customKeys = IfwPsn_Wp_Proxy_Post::getCustomKeys($this->_post); $result['post_custom_fields'] = implode(', ', $customKeys); // custom keys and values $customFields = IfwPsn_Wp_Proxy_Post::getCustomKeysAndValues($this->_post); $custom_keys_and_values = array(); foreach ($customFields as $key => $value) { array_push($custom_keys_and_values, $key . ': ' . $value); } $result['post_custom_fields_and_values'] = implode(', ', $custom_keys_and_values); // featured image if (has_post_thumbnail($this->_post->ID)) { $featuredImgData = wp_get_attachment_image_src(get_post_thumbnail_id($this->_post->ID)); if ($featuredImgData != false) { $result['post_featured_image_url'] = $featuredImgData[0]; $result['post_featured_image_width'] = $featuredImgData[1]; $result['post_featured_image_height'] = $featuredImgData[2]; } } else { $result['post_featured_image_url'] = ''; $result['post_featured_image_width'] = ''; $result['post_featured_image_height'] = ''; } return $result; }
public function getPost($id) { $id = (int) $id; return IfwPsn_Wp_Proxy_Post::get($id); }
/** * @param $status * @return string|void */ protected function _getStatusLabel($status) { $result = ''; if ($status == 'new') { $result = __('New', 'ifw'); } elseif ($status == 'anything') { $result = __('anything', 'psn'); } elseif ($status == 'not_published') { $result = __('Not published', 'psn'); } elseif ($status == 'not_private') { $result = __('Not private', 'psn'); } elseif ($status == 'not_pending') { $result = __('Not pending', 'psn'); } elseif ($status == 'not_trash') { $result = __('Not trash', 'psn'); } else { $result = IfwPsn_Wp_Proxy_Post::getStatusLabel($status); } return $result; }