#:::::::::::::::::::::::::::::::::::::::: # # Snippet Name: NewsPublisher # Short Desc: Create articles directly from front end (news, blogs, PR, etc.) # Created By: Raymond Irving (xwisdom@yahoo.com), August 2005 # # Version: 1.4 # Modified: December 13, 2005 # # Changelog: # Mar 05, 06 -- modx_ prefix removed [Mark] # Dec 13, 05 -- Now inherrits web/manager docgroups thanks to Jared Carlow # #:::::::::::::::::::::::::::::::::::::::: # Description: # Checks to see if users belong to a certain group and # displays the specified chunk if they do. Performs several # sanity checks and allows to be used multiple times on a page. # Only meant to be used once per page. #:::::::::::::::::::::::::::::::::::::::: # # Parameters: # &folder - folder id where comments are stored # &makefolder - set to 1 to automatically convert the parent document to a folder. Defaults to 0 # &postid - document id to load after posting news item. Defaults to the page created # &canpost - comma delimitted web groups that can post comments. leave blank for public posting # &badwords - comma delimited list of words not allowed in post # &template - name of template to use for news post # &headertpl - header template (chunk name) to be inserted at the begining of the news content # &footertpl - footer template (chunk name) to be inserted at the end of the news content # &formtpl - form template (chunk name) # &rtcontent - name of a richtext content form field # &rtsummary - name of a richtext summary form field # &showinmenu - sets the flag to true or false (1|0) as to whether or not it shows in the menu. defaults to false (0) # &aliastitle - set to 1 to use page title as alias suffix. Defaults to 0 - date created. # &clearcache - when set to 1 the system will automatically clear the site cache after publishing an article. # #:::::::::::::::::::::::::::::::::::::::: // get user groups that can post articles $postgrp = isset($canpost) ? explode(",",$canpost):array(); $allowAnyPost = count($postgrp)==0 ? true : false; // get clear cache $clearcache = isset($clearcache) ? 1:0; // get alias title $aliastitle = isset($aliastitle) ? 1:0; // get folder id where we should store articles // else store in current document $folder = isset($folder) ? intval($folder):$modx->documentIdentifier; // set rich text content field $rtcontent = isset($rtcontent) ? $rtcontent:'content'; // set rich text summary field $rtsummary = isset($rtsummary) ? $rtsummary:'introtext'; // get header $header = isset($headertpl) ? "{{".$headertpl."}}":''; // get footer $footer = isset($footertpl) ? "{{".$footertpl."}}":''; // get postback status $isPostBack = isset($_POST['NewsPublisherForm']) ? true:false; // get badwords if(isset($badwords)) { $badwords = str_replace(' ','', $badwords); $badwords = "/".str_replace(',','|', $badwords)."/i"; } // get menu status $hidemenu = isset($showinmenu) && $showinmenu==1 ? 0 : 1; // get template $template = isset($template) ? $modx->db->getValue('SELECT id FROM '.$modx->getFullTableName('site_templates').' WHERE templatename=\''.mysql_escape_string($template).'\''):$modx->config['default_template']; $message = ''; // get form template if(isset($formtpl)) $formTpl = $modx->getChunk($formtpl); if(empty($formTpl)) $formTpl = '
Page title:

Long title:

Description:

Published date:
Select date Remove date
Unpublished date:
Select date Remove date
Summary:

Content:

'; // switch block switch ($isPostBack) { case true: // process post back // remove magic quotes from POST if(get_magic_quotes_gpc()){ $_POST = array_map("stripslashes", $_POST); } if(trim($_POST['pagetitle'])=='') $modx->webAlert('Missing page title.'); elseif($_POST[$rtcontent]=='') $modx->webAlert('Missing news content.'); else { // get created date $createdon = time(); // set alias name of document used to store articles if(!$aliastitle) $alias = 'article-'.$createdon; else { $alias = $modx->stripTags($_POST['pagetitle']); $alias = strtolower($alias); $alias = preg_replace('/&.+?;/', '', $alias); // kill entities $alias = preg_replace('/[^\.%a-z0-9 _-]/', '', $alias); $alias = preg_replace('/\s+/', '-', $alias); $alias = preg_replace('|-+|', '-', $alias); $alias = trim($alias, '-'); $alias = 'article-'.$modx->db->escape($alias); } $user = $modx->getLoginUserName(); $userid = $modx->getLoginUserID(); if(!$user && $allowAnyPost) $user = 'anonymous'; // check if user has rights if(!$allowAnyPost && !$modx->isMemberOfWebGroup($postgrp)) { return 'You are not allowed to publish articles'; } $allowedTags = '


    1. '; // format content $content = $modx->stripTags($_POST[$rtcontent],$allowedTags); $content = str_replace('[+user+]',$user,$content); $content = str_replace('[+createdon+]',strftime('%d-%b-%Y %H:%M',$createdon),$content); foreach($_POST as $n=>$v) { if(!empty($badwords)) $v = preg_replace($badwords,'[Filtered]',$v); // remove badwords $v = $modx->stripTags(htmlspecialchars($v)); $v = str_replace("\n",'
      ',$v); $content = str_replace('[+'.$n.'+]',$v,$content); } $title = mysql_escape_string($modx->stripTags($_POST['pagetitle'])); $longtitle = mysql_escape_string($modx->stripTags($_POST['longtitle'])); $description = mysql_escape_string($modx->stripTags($_POST['description'])); $introtext = mysql_escape_string($modx->stripTags($_POST[$rtsummary],$allowedTags)); $pub_date = $_POST['pub_date']; $unpub_date = $_POST['unpub_date']; $published = 1; // check published date if($pub_date=="") { $pub_date="0"; } else { list($d, $m, $Y, $H, $M, $S) = sscanf($pub_date, "%2d-%2d-%4d %2d:%2d:%2d"); $pub_date = strtotime("$m/$d/$Y $H:$M:$S"); if($pub_date < $createdon) { $published = 1; } elseif($pub_date > $createdon) { $published = 0; } } // check unpublished date if($unpub_date=="") { $unpub_date="0"; } else { list($d, $m, $Y, $H, $M, $S) = sscanf($unpub_date, "%2d-%2d-%4d %2d:%2d:%2d"); $unpub_date = strtotime("$m/$d/$Y $H:$M:$S"); if($unpub_date < $createdon) { $published = 0; } } // set menu index $mnuidx = $modx->db->getValue('SELECT MAX(menuindex)+1 as \'mnuidx\' FROM '.$modx->getFullTableName('site_content').' WHERE parent=\''.$folder.'\''); if($mnuidx<1) $mnuidx = 0; // post news content $flds = array( 'pagetitle' => $title, 'longtitle' => $longtitle, 'description' => $description, 'introtext' => $introtext, 'alias' => $alias, 'parent' => $folder, 'createdon' => $createdon, 'createdby' => ($userid>0 ? $userid * -1:0), 'editedon' => '0', 'editedby' => '0', 'published' => $published, 'pub_date' => $pub_date, 'unpub_date' => $unpub_date, 'deleted' => '0', 'hidemenu' => $hidemenu, 'menuindex' => $mnuidx, 'template' => $template, 'content' => mysql_escape_string($header.$content.$footer) ); $redirectid = $modx->db->insert($flds,$modx->getFullTableName('site_content')); // Doc group thing // look in save_content.processor.php for tips (or below) $lastInsertId = $modx->db->getInsertId(); // Get doc groups based on $folder (parent id) $parentDocGroupsSql = "SELECT * FROM " . $modx->getFullTableName('document_groups'). " where document=".$folder; $parentDocGroupsRs = $modx->db->query($parentDocGroupsSql); $parentDocGroupsLimit = $modx->db->getRecordCount($parentDocGroupsRs); for ($pdgi = 0; $pdgi < $parentDocGroupsLimit; $pdgi++) { $currentDocGroup = $modx->db->getRow($parentDocGroupsRs); $parentDocGroupsArray[$pdgi] = $currentDocGroup['document_group']; } // put the document in the document_groups it should be in // check that up_perms are switched on! if($modx->config['use_udperms']==1) { if(is_array($parentDocGroupsArray)) { foreach ($parentDocGroupsArray as $dgKey=>$dgValue) { $insertDocSql = "INSERT INTO ".$modx->getFullTableName('document_groups')."(document_group, document) values(".stripslashes($dgValue).", $lastInsertId)"; $insertDocRs = $modx->db->query($insertDocSql); if(!$insertDocRs){ exit; } } // end foreach } // end if doc group array exists } // end if perms are used // Handle privateweb $modx->db->query("UPDATE ".$modx->getFullTableName("site_content")." SET privateweb = 0 WHERE id='$lastInsertId';"); $privatewebSql = " SELECT DISTINCT ".$modx->getFullTableName('document_groups').".document_group FROM ".$modx->getFullTableName('document_groups').", ".$modx->getFullTableName('webgroup_access')." WHERE ".$modx->getFullTableName('document_groups').".document_group = ".$modx->getFullTableName('webgroup_access').".documentgroup AND ".$modx->getFullTableName('document_groups').".document = $lastInsertId;"; $privatewebIds = $modx->db->getColumn("document_group",$privatewebSql); if(count($privatewebIds)>0) { $modx->db->query("UPDATE ".$modx->getFullTableName("site_content")." SET privateweb = 1 WHERE id = $lastInsertId;"); } // And privatemgr $modx->db->query("UPDATE ".$modx->getFullTableName("site_content")." SET privatemgr = 0 WHERE id='$lastInsertId';"); $privatemgrSql = " SELECT DISTINCT ".$modx->getFullTableName('document_groups').".document_group FROM ".$modx->getFullTableName('document_groups').", ".$modx->getFullTableName('membergroup_access')." WHERE ".$modx->getFullTableName('document_groups').".document_group = ".$modx->getFullTableName('membergroup_access')." .documentgroup AND ".$modx->getFullTableName('document_groups').".document = $lastInsertId;"; $privatemgrIds = $modx->db->getColumn("document_group",$privatemgrSql); if(count($privatemgrIds)>0) { $modx->db->query("UPDATE ".$modx->getFullTableName("site_content")." SET privatemgr = 1 WHERE id = $lastInsertId;"); } // end of document_groups stuff! if(!empty($makefolder)) { // convert parent into folder $modx->db->update(array('isfolder'=>'1'),$modx->getFullTableName('site_content'),'id=\''.$folder.'\''); } // empty cache if($clearcache==1){ include_once $modx->config['base_path']."manager/processors/cache_sync.class.processor.php"; $sync = new synccache(); $sync->setCachepath("assets/cache/"); $sync->setReport(false); $sync->emptyCache(); // first empty the cache } // get redirect/post id $redirectid = $modx->db->getValue('SELECT id as \'redirectid\' FROM '.$modx->getFullTableName('site_content').' WHERE createdon=\''.$createdon.'\''); $postid = isset($postid) ? $postid:$redirectid; // redirect to post id $modx->sendRedirect($modx->makeUrl($postid)); } default: // display news form // check if user has rights to post comments if(!$allowAnyPost && !$modx->isMemberOfWebGroup($postgrp)) { $formTpl = ''; } else { foreach($_POST as $n=>$v) { $formTpl = str_replace('[+'.$n.'+]',$v,$formTpl); } } // return form return $message.$formTpl; break; }