/administrator/components/com_content/controller.php
PHP | 1451 lines | 998 code | 226 blank | 227 comment | 134 complexity | 7e6d1ff17abcfd0d1d88c85dab65bcd6 MD5 | raw file
- <?php
- /**
- * @version $Id: controller.php 10094 2008-03-02 04:35:10Z instance $
- * @package Joomla
- * @subpackage Content
- * @copyright Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
- * @license GNU/GPL, see LICENSE.php
- * Joomla! is free software. This version may have been modified pursuant to the
- * GNU General Public License, and as distributed it includes or is derivative
- * of works licensed under the GNU General Public License or other free or open
- * source software licenses. See COPYRIGHT.php for copyright notices and
- * details.
- */
- // Check to ensure this file is included in Joomla!
- defined('_JEXEC') or die( 'Restricted access' );
- jimport('joomla.application.component.controller');
- /**
- * Content Component Controller
- *
- * @package Joomla
- * @subpackage Content
- * @since 1.5
- */
- class ContentController extends JController
- {
- /**
- * Articles element
- */
- function element()
- {
- $model = &$this->getModel( 'element' );
- $view = &$this->getView( 'element');
- $view->setModel( $model, true );
- $view->display();
- }
- /**
- * Compiles a list of installed or defined modules
- * @param database A database connector object
- */
- function viewContent()
- {
- global $mainframe;
- // Initialize variables
- $db =& JFactory::getDBO();
- $filter = null;
- // Get some variables from the request
- $sectionid = JRequest::getVar( 'sectionid', -1, '', 'int' );
- $redirect = $sectionid;
- $option = JRequest::getCmd( 'option' );
- $context = 'com_content.viewcontent';
- $filter_order = $mainframe->getUserStateFromRequest( $context.'filter_order', 'filter_order', '', 'cmd' );
- $filter_order_Dir = $mainframe->getUserStateFromRequest( $context.'filter_order_Dir', 'filter_order_Dir', '', 'word' );
- $filter_state = $mainframe->getUserStateFromRequest( $context.'filter_state', 'filter_state', '', 'word' );
- $catid = $mainframe->getUserStateFromRequest( $context.'catid', 'catid', 0, 'int' );
- $filter_authorid = $mainframe->getUserStateFromRequest( $context.'filter_authorid', 'filter_authorid', 0, 'int' );
- $filter_sectionid = $mainframe->getUserStateFromRequest( $context.'filter_sectionid', 'filter_sectionid', -1, 'int' );
- $search = $mainframe->getUserStateFromRequest( $context.'search', 'search', '', 'string' );
- $search = JString::strtolower($search);
- $limit = $mainframe->getUserStateFromRequest('global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int');
- $limitstart = $mainframe->getUserStateFromRequest($context.'limitstart', 'limitstart', 0, 'int');
- // In case limit has been changed, adjust limitstart accordingly
- $limitstart = ( $limit != 0 ? (floor($limitstart / $limit) * $limit) : 0 );
- //$where[] = "c.state >= 0";
- $where[] = 'c.state != -2';
- if (!$filter_order) {
- $filter_order = 'section_name';
- }
- $order = ' ORDER BY '. $filter_order .' '. $filter_order_Dir .', section_name, cc.title, c.ordering';
- $all = 1;
- if ($filter_sectionid >= 0) {
- $filter = ' WHERE cc.section = '. (int) $filter_sectionid;
- }
- $section->title = 'All Articles';
- $section->id = 0;
- /*
- * Add the filter specific information to the where clause
- */
- // Section filter
- if ($filter_sectionid >= 0) {
- $where[] = 'c.sectionid = ' . (int) $filter_sectionid;
- }
- // Category filter
- if ($catid > 0) {
- $where[] = 'c.catid = ' . (int) $catid;
- }
- // Author filter
- if ($filter_authorid > 0) {
- $where[] = 'c.created_by = ' . (int) $filter_authorid;
- }
- // Content state filter
- if ($filter_state) {
- if ($filter_state == 'P') {
- $where[] = 'c.state = 1';
- } else {
- if ($filter_state == 'U') {
- $where[] = 'c.state = 0';
- } else if ($filter_state == 'A') {
- $where[] = 'c.state = -1';
- } else {
- $where[] = 'c.state != -2';
- }
- }
- }
- // Keyword filter
- if ($search) {
- $where[] = '(LOWER( c.title ) LIKE '.$db->Quote( '%'.$db->getEscaped( $search, true ).'%', false ) .
- ' OR c.id = ' . (int) $search . ')';
- }
- // Build the where clause of the content record query
- $where = (count($where) ? ' WHERE '.implode(' AND ', $where) : '');
- // Get the total number of records
- $query = 'SELECT COUNT(*)' .
- ' FROM #__content AS c' .
- ' LEFT JOIN #__categories AS cc ON cc.id = c.catid' .
- ' LEFT JOIN #__sections AS s ON s.id = c.sectionid' .
- $where;
- $db->setQuery($query);
- $total = $db->loadResult();
- // Create the pagination object
- jimport('joomla.html.pagination');
- $pagination = new JPagination($total, $limitstart, $limit);
- // Get the articles
- $query = 'SELECT c.*, g.name AS groupname, cc.title AS name, u.name AS editor, f.content_id AS frontpage, s.title AS section_name, v.name AS author' .
- ' FROM #__content AS c' .
- ' LEFT JOIN #__categories AS cc ON cc.id = c.catid' .
- ' LEFT JOIN #__sections AS s ON s.id = c.sectionid' .
- ' LEFT JOIN #__groups AS g ON g.id = c.access' .
- ' LEFT JOIN #__users AS u ON u.id = c.checked_out' .
- ' LEFT JOIN #__users AS v ON v.id = c.created_by' .
- ' LEFT JOIN #__content_frontpage AS f ON f.content_id = c.id' .
- $where .
- $order;
- $db->setQuery($query, $pagination->limitstart, $pagination->limit);
- $rows = $db->loadObjectList();
- // If there is a database query error, throw a HTTP 500 and exit
- if ($db->getErrorNum()) {
- JError::raiseError( 500, $db->stderr() );
- return false;
- }
- // get list of categories for dropdown filter
- $query = 'SELECT cc.id AS value, cc.title AS text, section' .
- ' FROM #__categories AS cc' .
- ' INNER JOIN #__sections AS s ON s.id = cc.section ' .
- $filter .
- ' ORDER BY s.ordering, cc.ordering';
- $lists['catid'] = ContentHelper::filterCategory($query, $catid);
- // get list of sections for dropdown filter
- $javascript = 'onchange="document.adminForm.submit();"';
- $lists['sectionid'] = JHTML::_('list.section', 'filter_sectionid', $filter_sectionid, $javascript);
- // get list of Authors for dropdown filter
- $query = 'SELECT c.created_by, u.name' .
- ' FROM #__content AS c' .
- ' INNER JOIN #__sections AS s ON s.id = c.sectionid' .
- ' LEFT JOIN #__users AS u ON u.id = c.created_by' .
- ' WHERE c.state <> -1' .
- ' AND c.state <> -2' .
- ' GROUP BY u.name' .
- ' ORDER BY u.name';
- $authors[] = JHTML::_('select.option', '0', '- '.JText::_('Select Author').' -', 'created_by', 'name');
- $db->setQuery($query);
- $authors = array_merge($authors, $db->loadObjectList());
- $lists['authorid'] = JHTML::_('select.genericlist', $authors, 'filter_authorid', 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'created_by', 'name', $filter_authorid);
- // state filter
- $lists['state'] = JHTML::_('grid.state', $filter_state, 'Published', 'Unpublished', 'Archived');
- // table ordering
- $lists['order_Dir'] = $filter_order_Dir;
- $lists['order'] = $filter_order;
- // search filter
- $lists['search'] = $search;
- ContentView::showContent($rows, $lists, $pagination, $redirect);
- }
- /**
- * Shows a list of archived articles
- * @param int The section id
- */
- function viewArchive()
- {
- global $mainframe;
- // Initialize variables
- $db =& JFactory::getDBO();
- $sectionid = JRequest::getVar( 'sectionid', 0, '', 'int' );
- $option = JRequest::getCmd( 'option' );
- $filter_order = $mainframe->getUserStateFromRequest("$option.$sectionid.viewarchive.filter_order", 'filter_order', 'sectname', 'cmd');
- $filter_order_Dir = $mainframe->getUserStateFromRequest("$option.$sectionid.viewarchive.filter_order_Dir", 'filter_order_Dir', '', 'word');
- $catid = $mainframe->getUserStateFromRequest("$option.$sectionid.viewarchive.catid", 'catid', 0, 'int');
- $limit = $mainframe->getUserStateFromRequest('global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int');
- $limitstart = $mainframe->getUserStateFromRequest("$option.$sectionid.viewarchive.limitstart", 'limitstart', 0, 'int');
- $filter_authorid = $mainframe->getUserStateFromRequest("$option.$sectionid.viewarchive.filter_authorid", 'filter_authorid', 0, 'int');
- $filter_sectionid = $mainframe->getUserStateFromRequest("$option.$sectionid.viewarchive.filter_sectionid", 'filter_sectionid', 0, 'int');
- $search = $mainframe->getUserStateFromRequest("$option.$sectionid.viewarchive.search", 'search', '', 'string');
- $search = JString::strtolower($search);
- $redirect = $sectionid;
- // A section id of zero means view all articles [all sections]
- if ($sectionid == 0)
- {
- $where = array ('c.state = -1', 'c.catid = cc.id', 'cc.section = s.id', 's.scope = "content"');
- $filter = ' , #__sections AS s WHERE s.id = c.section';
- $all = 1;
- }
- else
- {
- //We are viewing a specific section
- $where = array ('c.state = -1', 'c.catid = cc.id', 'cc.section = s.id', 's.scope = "content"', 'c.sectionid= '.(int) $sectionid);
- $filter = ' WHERE section = '.$db->Quote($sectionid);
- $all = NULL;
- }
- // Section filter
- if ($filter_sectionid > 0)
- {
- $where[] = 'c.sectionid = ' . (int) $filter_sectionid;
- }
- // Author filter
- if ($filter_authorid > 0)
- {
- $where[] = 'c.created_by = ' . (int) $filter_authorid;
- }
- // Category filter
- if ($catid > 0)
- {
- $where[] = 'c.catid = ' . (int) $catid;
- }
- // Keyword filter
- if ($search)
- {
- $where[] = 'LOWER( c.title ) LIKE '.$db->Quote( '%'.$db->getEscaped( $search, true ).'%', false );
- }
- // TODO: Sanitise $filter_order
- $filter_order_Dir = ($filter_order_Dir == 'ASC' ? 'ASC' : 'DESC');
- $orderby = ' ORDER BY '. $filter_order .' '. $filter_order_Dir .', sectname, cc.name, c.ordering';
- $where = (count($where) ? ' WHERE '.implode(' AND ', $where) : '');
- // get the total number of records
- $query = 'SELECT COUNT(*)' .
- ' FROM #__content AS c' .
- ' LEFT JOIN #__categories AS cc ON cc.id = c.catid' .
- ' LEFT JOIN #__sections AS s ON s.id = c.sectionid' .
- $where;
- $db->setQuery($query);
- $total = $db->loadResult();
- jimport('joomla.html.pagination');
- $pagination = new JPagination($total, $limitstart, $limit);
- $query = 'SELECT c.*, g.name AS groupname, cc.name, v.name AS author, s.title AS sectname' .
- ' FROM #__content AS c' .
- ' LEFT JOIN #__categories AS cc ON cc.id = c.catid' .
- ' LEFT JOIN #__sections AS s ON s.id = c.sectionid' .
- ' LEFT JOIN #__groups AS g ON g.id = c.access' .
- ' LEFT JOIN #__users AS v ON v.id = c.created_by' .
- $where .
- $orderby;
- $db->setQuery($query, $pagination->limitstart, $pagination->limit);
- $rows = $db->loadObjectList();
- // If there is a database query error, throw a HTTP 500 and exit
- if ($db->getErrorNum())
- {
- JError::raiseError( 500, $db->stderr() );
- return false;
- }
- // get list of categories for dropdown filter
- $query = 'SELECT c.id AS value, c.title AS text' .
- ' FROM #__categories AS c' .
- $filter .
- ' ORDER BY c.ordering';
- $lists['catid'] = ContentHelper::filterCategory($query, $catid);
- // get list of sections for dropdown filter
- $javascript = 'onchange="document.adminForm.submit();"';
- $lists['sectionid'] = JAdminMenus::SelectSection('filter_sectionid', $filter_sectionid, $javascript);
- $section = & JTable::getInstance('section');
- $section->load($sectionid);
- // get list of Authors for dropdown filter
- $query = 'SELECT c.created_by, u.name' .
- ' FROM #__content AS c' .
- ' INNER JOIN #__sections AS s ON s.id = c.sectionid' .
- ' LEFT JOIN #__users AS u ON u.id = c.created_by' .
- ' WHERE c.state = -1' .
- ' GROUP BY u.name' .
- ' ORDER BY u.name';
- $db->setQuery($query);
- $authors[] = JHTML::_('select.option', '0', '- '.JText::_('Select Author').' -', 'created_by', 'name');
- $authors = array_merge($authors, $db->loadObjectList());
- $lists['authorid'] = JHTML::_('select.genericlist', $authors, 'filter_authorid', 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'created_by', 'name', $filter_authorid);
- // table ordering
- $lists['order_Dir'] = $filter_order_Dir;
- $lists['order'] = $filter_order;
- // search filter
- $lists['search'] = $search;
- ContentView::showArchive($rows, $section, $lists, $pagination, $option, $all, $redirect);
- }
- /**
- * Compiles information to add or edit the record
- *
- * @param database A database connector object
- * @param integer The unique id of the record to edit (0 if new)
- * @param integer The id of the content section
- */
- function editContent($edit)
- {
- global $mainframe;
- // Initialize variables
- $db = & JFactory::getDBO();
- $user = & JFactory::getUser();
- $cid = JRequest::getVar( 'cid', array(0), '', 'array' );
- JArrayHelper::toInteger($cid, array(0));
- $id = JRequest::getVar( 'id', $cid[0], '', 'int' );
- $option = JRequest::getCmd( 'option' );
- $nullDate = $db->getNullDate();
- $contentSection = '';
- $sectionid = 0;
- // Create and load the content table row
- $row = & JTable::getInstance('content');
- if($edit)
- $row->load($id);
- if ($id) {
- $sectionid = $row->sectionid;
- if ($row->state < 0) {
- $mainframe->redirect('index.php?option=com_content', JText::_('You cannot edit an archived item'));
- }
- }
- // A sectionid of zero means grab from all sections
- if ($sectionid == 0) {
- $where = ' WHERE section NOT LIKE "%com_%"';
- } else {
- // Grab from the specific section
- $where = ' WHERE section = '. $db->Quote( $sectionid );
- }
- /*
- * If the item is checked out we cannot edit it... unless it was checked
- * out by the current user.
- */
- if ( JTable::isCheckedOut($user->get ('id'), $row->checked_out ))
- {
- $msg = JText::sprintf('DESCBEINGEDITTED', JText::_('The item'), $row->title);
- $mainframe->redirect('index.php?option=com_content', $msg);
- }
- if ($id)
- {
- $row->checkout($user->get('id'));
- if (trim($row->images)) {
- $row->images = explode("\n", $row->images);
- } else {
- $row->images = array ();
- }
- $query = 'SELECT name' .
- ' FROM #__users'.
- ' WHERE id = '. (int) $row->created_by;
- $db->setQuery($query);
- $row->creator = $db->loadResult();
- // test to reduce unneeded query
- if ($row->created_by == $row->modified_by) {
- $row->modifier = $row->creator;
- } else {
- $query = 'SELECT name' .
- ' FROM #__users' .
- ' WHERE id = '. (int) $row->modified_by;
- $db->setQuery($query);
- $row->modifier = $db->loadResult();
- }
- $query = 'SELECT COUNT(content_id)' .
- ' FROM #__content_frontpage' .
- ' WHERE content_id = '. (int) $row->id;
- $db->setQuery($query);
- $row->frontpage = $db->loadResult();
- if (!$row->frontpage) {
- $row->frontpage = 0;
- }
- }
- else
- {
- if (!$sectionid && JRequest::getInt('filter_sectionid')) {
- $sectionid =JRequest::getInt('filter_sectionid');
- }
- if (JRequest::getInt('catid'))
- {
- $row->catid = JRequest::getInt('catid');
- $category = & JTable::getInstance('category');
- $category->load($row->catid);
- $sectionid = $category->section;
- } else {
- $row->catid = NULL;
- }
- $createdate =& JFactory::getDate();
- $row->sectionid = $sectionid;
- $row->version = 0;
- $row->state = 1;
- $row->ordering = 0;
- $row->images = array ();
- $row->publish_up = $createdate->toUnix();
- $row->publish_down = JText::_('Never');
- $row->creator = '';
- $row->created = $createdate->toUnix();
- $row->modified = $nullDate;
- $row->modifier = '';
- $row->frontpage = 0;
- }
- $javascript = "onchange=\"changeDynaList( 'catid', sectioncategories, document.adminForm.sectionid.options[document.adminForm.sectionid.selectedIndex].value, 0, 0);\"";
- $query = 'SELECT s.id, s.title' .
- ' FROM #__sections AS s' .
- ' ORDER BY s.ordering';
- $db->setQuery($query);
- $sections[] = JHTML::_('select.option', '-1', '- '.JText::_('Select Section').' -', 'id', 'title');
- $sections[] = JHTML::_('select.option', '0', JText::_('Uncategorized'), 'id', 'title');
- $sections = array_merge($sections, $db->loadObjectList());
- $lists['sectionid'] = JHTML::_('select.genericlist', $sections, 'sectionid', 'class="inputbox" size="1" '.$javascript, 'id', 'title', intval($row->sectionid));
- foreach ($sections as $section)
- {
- $section_list[] = (int) $section->id;
- // get the type name - which is a special category
- if ($row->sectionid) {
- if ($section->id == $row->sectionid) {
- $contentSection = $section->title;
- }
- } else {
- if ($section->id == $sectionid) {
- $contentSection = $section->title;
- }
- }
- }
- $sectioncategories = array ();
- $sectioncategories[-1] = array ();
- $sectioncategories[-1][] = JHTML::_('select.option', '-1', JText::_( 'Select Category' ), 'id', 'title');
- $section_list = implode('\', \'', $section_list);
- $query = 'SELECT id, title, section' .
- ' FROM #__categories' .
- ' WHERE section IN ( \''.$section_list.'\' )' .
- ' ORDER BY ordering';
- $db->setQuery($query);
- $cat_list = $db->loadObjectList();
- // Uncategorized category mapped to uncategorized section
- $uncat = new stdClass();
- $uncat->id = 0;
- $uncat->title = JText::_('Uncategorized');
- $uncat->section = 0;
- $cat_list[] = $uncat;
- foreach ($sections as $section)
- {
- $sectioncategories[$section->id] = array ();
- $rows2 = array ();
- foreach ($cat_list as $cat)
- {
- if ($cat->section == $section->id) {
- $rows2[] = $cat;
- }
- }
- foreach ($rows2 as $row2) {
- $sectioncategories[$section->id][] = JHTML::_('select.option', $row2->id, $row2->title, 'id', 'title');
- }
- }
- $sectioncategories['-1'][] = JHTML::_('select.option', '-1', JText::_( 'Select Category' ), 'id', 'title');
- $categories = array();
- foreach ($cat_list as $cat) {
- if($cat->section == $row->sectionid)
- $categories[] = $cat;
- }
- $categories[] = JHTML::_('select.option', '-1', JText::_( 'Select Category' ), 'id', 'title');
- $lists['catid'] = JHTML::_('select.genericlist', $categories, 'catid', 'class="inputbox" size="1"', 'id', 'title', intval($row->catid));
- // build the html select list for ordering
- $query = 'SELECT ordering AS value, title AS text' .
- ' FROM #__content' .
- ' WHERE catid = ' . (int) $row->catid .
- ' AND state >= 0' .
- ' ORDER BY ordering';
- if($edit)
- $lists['ordering'] = JHTML::_('list.specificordering', $row, $id, $query, 1);
- else
- $lists['ordering'] = JHTML::_('list.specificordering', $row, '', $query, 1);
- // build the html radio buttons for frontpage
- $lists['frontpage'] = JHTML::_('select.booleanlist', 'frontpage', '', $row->frontpage);
- // build the html radio buttons for published
- $lists['state'] = JHTML::_('select.booleanlist', 'state', '', $row->state);
- /*
- * We need to unify the introtext and fulltext fields and have the
- * fields separated by the {readmore} tag, so lets do that now.
- */
- if (JString::strlen($row->fulltext) > 1) {
- $row->text = $row->introtext . "<hr id=\"system-readmore\" />" . $row->fulltext;
- } else {
- $row->text = $row->introtext;
- }
- // Create the form
- $form = new JParameter('', JPATH_COMPONENT.DS.'models'.DS.'article.xml');
- // Details Group
- $active = (intval($row->created_by) ? intval($row->created_by) : $user->get('id'));
- $form->set('created_by', $active);
- $form->set('access', $row->access);
- $form->set('created_by_alias', $row->created_by_alias);
- $form->set('created', JHTML::_('date', $row->created, '%Y-%m-%d %H:%M:%S'));
- $form->set('publish_up', JHTML::_('date', $row->publish_up, '%Y-%m-%d %H:%M:%S'));
- if (JHTML::_('date', $row->publish_down, '%Y') <= 1969 || $row->publish_down == $db->getNullDate()) {
- $form->set('publish_down', JText::_('Never'));
- } else {
- $form->set('publish_down', JHTML::_('date', $row->publish_down, '%Y-%m-%d %H:%M:%S'));
- }
- // Advanced Group
- $form->loadINI($row->attribs);
- // Metadata Group
- $form->set('description', $row->metadesc);
- $form->set('keywords', $row->metakey);
- $form->loadINI($row->metadata);
- ContentView::editContent($row, $contentSection, $lists, $sectioncategories, $option, $form);
- }
- /**
- * Saves the article an edit form submit
- * @param database A database connector object
- */
- function saveContent()
- {
- global $mainframe;
- // Check for request forgeries
- JRequest::checkToken() or jexit( 'Invalid Token' );
- // Initialize variables
- $db = & JFactory::getDBO();
- $user = & JFactory::getUser();
- $details = JRequest::getVar( 'details', array(), 'post', 'array');
- $option = JRequest::getCmd( 'option' );
- $task = JRequest::getCmd( 'task' );
- $sectionid = JRequest::getVar( 'sectionid', 0, '', 'int' );
- $redirect = JRequest::getVar( 'redirect', $sectionid, 'post', 'int' );
- $menu = JRequest::getVar( 'menu', 'mainmenu', 'post', 'cmd' );
- $menuid = JRequest::getVar( 'menuid', 0, 'post', 'int' );
- $nullDate = $db->getNullDate();
- $row = & JTable::getInstance('content');
- if (!$row->bind(JRequest::get('post'))) {
- JError::raiseError( 500, $db->stderr() );
- return false;
- }
- $row->bind($details);
- // sanitise id field
- $row->id = (int) $row->id;
- // Are we saving from an item edit?
- if ($row->id) {
- $datenow =& JFactory::getDate();
- $row->modified = $datenow->toMySQL();
- $row->modified_by = $user->get('id');
- }
- $row->created_by = $row->created_by ? $row->created_by : $user->get('id');
- if ($row->created && strlen(trim( $row->created )) <= 10) {
- $row->created .= ' 00:00:00';
- }
- $config =& JFactory::getConfig();
- $tzoffset = $config->getValue('config.offset');
- $date =& JFactory::getDate($row->created, $tzoffset);
- $row->created = $date->toMySQL();
- // Append time if not added to publish date
- if (strlen(trim($row->publish_up)) <= 10) {
- $row->publish_up .= ' 00:00:00';
- }
- $date =& JFactory::getDate($row->publish_up, $tzoffset);
- $row->publish_up = $date->toMySQL();
- // Handle never unpublish date
- if (trim($row->publish_down) == JText::_('Never') || trim( $row->publish_down ) == '')
- {
- $row->publish_down = $nullDate;
- }
- else
- {
- if (strlen(trim( $row->publish_down )) <= 10) {
- $row->publish_down .= ' 00:00:00';
- }
- $date =& JFactory::getDate($row->publish_down, $tzoffset);
- $row->publish_down = $date->toMySQL();
- }
- // Get a state and parameter variables from the request
- $row->state = JRequest::getVar( 'state', 0, '', 'int' );
- $params = JRequest::getVar( 'params', null, 'post', 'array' );
- // Build parameter INI string
- if (is_array($params))
- {
- $txt = array ();
- foreach ($params as $k => $v) {
- $txt[] = "$k=$v";
- }
- $row->attribs = implode("\n", $txt);
- }
- // Get metadata string
- $metadata = JRequest::getVar( 'meta', null, 'post', 'array');
- if (is_array($params))
- {
- $txt = array();
- foreach ($metadata as $k => $v) {
- if ($k == 'description') {
- $row->metadesc = $v;
- } elseif ($k == 'keywords') {
- $row->metakey = $v;
- } else {
- $txt[] = "$k=$v";
- }
- }
- $row->metadata = implode("\n", $txt);
- }
- // Prepare the content for saving to the database
- ContentHelper::saveContentPrep( $row );
- // Make sure the data is valid
- if (!$row->check()) {
- JError::raiseError( 500, $db->stderr() );
- return false;
- }
- // Increment the content version number
- $row->version++;
- // Store the content to the database
- if (!$row->store()) {
- JError::raiseError( 500, $db->stderr() );
- return false;
- }
- // Check the article and update item order
- $row->checkin();
- $row->reorder('catid = '.(int) $row->catid.' AND state >= 0');
- /*
- * We need to update frontpage status for the article.
- *
- * First we include the frontpage table and instantiate an instance of it.
- */
- require_once (JPATH_ADMINISTRATOR.DS.'components'.DS.'com_frontpage'.DS.'tables'.DS.'frontpage.php');
- $fp = new TableFrontPage($db);
- // Is the article viewable on the frontpage?
- if (JRequest::getVar( 'frontpage', 0, '', 'int' ))
- {
- // Is the item already viewable on the frontpage?
- if (!$fp->load($row->id))
- {
- // Insert the new entry
- $query = 'INSERT INTO #__content_frontpage' .
- ' VALUES ( '. (int) $row->id .', 1 )';
- $db->setQuery($query);
- if (!$db->query())
- {
- JError::raiseError( 500, $db->stderr() );
- return false;
- }
- $fp->ordering = 1;
- }
- }
- else
- {
- // Delete the item from frontpage if it exists
- if (!$fp->delete($row->id)) {
- $msg .= $fp->stderr();
- }
- $fp->ordering = 0;
- }
- $fp->reorder();
- $cache = & JFactory::getCache('com_content');
- $cache->clean();
- switch ($task)
- {
- case 'go2menu' :
- $mainframe->redirect('index.php?option=com_menus&menutype='.$menu);
- break;
- case 'go2menuitem' :
- $mainframe->redirect('index.php?option=com_menus&menutype='.$menu.'&task=edit&id='.$menuid);
- break;
- case 'menulink' :
- ContentHelper::menuLink($redirect, $row->id);
- break;
- case 'resethits' :
- ContentHelper::resetHits($redirect, $row->id);
- break;
- case 'apply' :
- $msg = JText::sprintf('SUCCESSFULLY SAVED CHANGES TO ARTICLE', $row->title);
- $mainframe->redirect('index.php?option=com_content§ionid='.$redirect.'&task=edit&cid[]='.$row->id, $msg);
- break;
- case 'save' :
- default :
- $msg = JText::sprintf('Successfully Saved Article', $row->title);
- $mainframe->redirect('index.php?option=com_content§ionid='.$redirect, $msg);
- break;
- }
- }
- /**
- * Changes the state of one or more content pages
- *
- * @param string The name of the category section
- * @param integer A unique category id (passed from an edit form)
- * @param array An array of unique category id numbers
- * @param integer 0 if unpublishing, 1 if publishing
- * @param string The name of the current user
- */
- function changeContent( $state = 0 )
- {
- global $mainframe;
- // Check for request forgeries
- JRequest::checkToken() or jexit( 'Invalid Token' );
- // Initialize variables
- $db = & JFactory::getDBO();
- $user = & JFactory::getUser();
- $cid = JRequest::getVar( 'cid', array(), 'post', 'array' );
- JArrayHelper::toInteger($cid);
- $option = JRequest::getCmd( 'option' );
- $task = JRequest::getCmd( 'task' );
- $rtask = JRequest::getCmd( 'returntask', '', 'post' );
- if ($rtask) {
- $rtask = '&task='.$rtask;
- }
- if (count($cid) < 1) {
- $redirect = JRequest::getVar( 'redirect', '', 'post', 'int' );
- $action = ($state == 1) ? 'publish' : ($state == -1 ? 'archive' : 'unpublish');
- $msg = JText::_('Select an item to') . ' ' . JText::_($action);
- $mainframe->redirect('index.php?option='.$option.$rtask.'§ionid='.$redirect, $msg, 'error');
- }
- // Get some variables for the query
- $uid = $user->get('id');
- $total = count($cid);
- $cids = implode(',', $cid);
- $query = 'UPDATE #__content' .
- ' SET state = '. (int) $state .
- ' WHERE id IN ( '. $cids .' ) AND ( checked_out = 0 OR (checked_out = '. (int) $uid .' ) )';
- $db->setQuery($query);
- if (!$db->query()) {
- JError::raiseError( 500, $db->getErrorMsg() );
- return false;
- }
- if (count($cid) == 1) {
- $row = & JTable::getInstance('content');
- $row->checkin($cid[0]);
- }
- switch ($state)
- {
- case -1 :
- $msg = JText::sprintf('Item(s) successfully Archived', $total);
- break;
- case 1 :
- $msg = JText::sprintf('Item(s) successfully Published', $total);
- break;
- case 0 :
- default :
- if ($task == 'unarchive') {
- $msg = JText::sprintf('Item(s) successfully Unarchived', $total);
- } else {
- $msg = JText::sprintf('Item(s) successfully Unpublished', $total);
- }
- break;
- }
- $cache = & JFactory::getCache('com_content');
- $cache->clean();
- // Get some return/redirect information from the request
- $redirect = JRequest::getVar( 'redirect', $row->sectionid, 'post', 'int' );
- $mainframe->redirect('index.php?option='.$option.$rtask.'§ionid='.$redirect, $msg);
- }
- /**
- * Changes the frontpage state of one or more articles
- *
- */
- function toggleFrontPage()
- {
- global $mainframe;
- // Check for request forgeries
- JRequest::checkToken() or jexit( 'Invalid Token' );
- // Initialize variables
- $db =& JFactory::getDBO();
- $cid = JRequest::getVar( 'cid', array(), 'post', 'array' );
- $option = JRequest::getCmd( 'option' );
- $msg = null;
- JArrayHelper::toInteger($cid);
- if (count($cid) < 1) {
- $msg = JText::_('Select an item to toggle');
- $mainframe->redirect('index.php?option='.$option, $msg, 'error');
- }
- /*
- * We need to update frontpage status for the articles.
- *
- * First we include the frontpage table and instantiate an instance of
- * it.
- */
- require_once (JPATH_ADMINISTRATOR.DS.'components'.DS.'com_frontpage'.DS.'tables'.DS.'frontpage.php');
- $fp = new TableFrontPage($db);
- foreach ($cid as $id)
- {
- // toggles go to first place
- if ($fp->load($id)) {
- if (!$fp->delete($id)) {
- $msg .= $fp->stderr();
- }
- $fp->ordering = 0;
- } else {
- // new entry
- $query = 'INSERT INTO #__content_frontpage' .
- ' VALUES ( '. (int) $id .', 0 )';
- $db->setQuery($query);
- if (!$db->query()) {
- JError::raiseError( 500, $db->stderr() );
- return false;
- }
- $fp->ordering = 0;
- }
- $fp->reorder();
- }
- $cache = & JFactory::getCache('com_content');
- $cache->clean();
- $mainframe->redirect('index.php?option='.$option, $msg);
- }
- function removeContent()
- {
- global $mainframe;
- // Check for request forgeries
- JRequest::checkToken() or jexit( 'Invalid Token' );
- // Initialize variables
- $db = & JFactory::getDBO();
- $cid = JRequest::getVar( 'cid', array(), 'post', 'array' );
- $option = JRequest::getCmd( 'option' );
- $return = JRequest::getCmd( 'returntask', '', 'post' );
- $nullDate = $db->getNullDate();
- JArrayHelper::toInteger($cid);
- if (count($cid) < 1) {
- $msg = JText::_('Select an item to delete');
- $mainframe->redirect('index.php?option='.$option, $msg, 'error');
- }
- // Removed content gets put in the trash [state = -2] and ordering is always set to 0
- $state = '-2';
- $ordering = '0';
- // Get the list of content id numbers to send to trash.
- $cids = implode(',', $cid);
- // Update articles in the database
- $query = 'UPDATE #__content' .
- ' SET state = '.(int) $state .
- ', ordering = '.(int) $ordering .
- ', checked_out = 0, checked_out_time = '.$db->Quote($nullDate).
- ' WHERE id IN ( '. $cids. ' )';
- $db->setQuery($query);
- if (!$db->query())
- {
- JError::raiseError( 500, $db->getErrorMsg() );
- return false;
- }
- $cache = & JFactory::getCache('com_content');
- $cache->clean();
- $msg = JText::sprintf('Item(s) sent to the Trash', count($cid));
- $mainframe->redirect('index.php?option='.$option.'&task='.$return, $msg);
- }
- /**
- * Cancels an edit operation
- */
- function cancelContent()
- {
- global $mainframe;
- // Check for request forgeries
- JRequest::checkToken() or jexit( 'Invalid Token' );
- // Initialize variables
- $db = & JFactory::getDBO();
- // Check the article in if checked out
- $row = & JTable::getInstance('content');
- $row->bind(JRequest::get('post'));
- $row->checkin();
- $mainframe->redirect('index.php?option=com_content');
- }
- /**
- * Moves the order of a record
- * @param integer The increment to reorder by
- */
- function orderContent($direction)
- {
- global $mainframe;
- // Check for request forgeries
- JRequest::checkToken() or jexit( 'Invalid Token' );
- // Initialize variables
- $db = & JFactory::getDBO();
- $cid = JRequest::getVar( 'cid', array(), 'post', 'array' );
- if (isset( $cid[0] ))
- {
- $row = & JTable::getInstance('content');
- $row->load( (int) $cid[0] );
- $row->move($direction, 'catid = ' . (int) $row->catid . ' AND state >= 0' );
- $cache = & JFactory::getCache('com_content');
- $cache->clean();
- }
- $mainframe->redirect('index.php?option=com_content');
- }
- /**
- * Form for moving item(s) to a different section and category
- */
- function moveSection()
- {
- // Check for request forgeries
- JRequest::checkToken() or jexit( 'Invalid Token' );
- // Initialize variables
- $db =& JFactory::getDBO();
- $cid = JRequest::getVar( 'cid', array(), 'post', 'array' );
- $sectionid = JRequest::getVar( 'sectionid', 0, '', 'int' );
- JArrayHelper::toInteger($cid);
- if (count($cid) < 1) {
- $msg = JText::_('Select an item to move');
- $mainframe->redirect('index.php?option=com_content', $msg, 'error');
- }
- //seperate contentids
- $cids = implode(',', $cid);
- // Articles query
- $query = 'SELECT a.title' .
- ' FROM #__content AS a' .
- ' WHERE ( a.id IN ( '. $cids .' ) )' .
- ' ORDER BY a.title';
- $db->setQuery($query);
- $items = $db->loadObjectList();
- $query = 'SELECT CONCAT_WS( ", ", s.id, c.id ) AS `value`, CONCAT_WS( " / ", s.title, c.title ) AS `text`' .
- ' FROM #__sections AS s' .
- ' INNER JOIN #__categories AS c ON c.section = s.id' .
- ' WHERE s.scope = "content"' .
- ' ORDER BY s.title, c.title';
- $db->setQuery($query);
- $rows[] = JHTML::_('select.option', "0, 0", JText::_('UNCATEGORIZED'));
- $rows = array_merge($rows, $db->loadObjectList());
- // build the html select list
- $sectCatList = JHTML::_('select.genericlist', $rows, 'sectcat', 'class="inputbox" size="8"', 'value', 'text', null);
- ContentView::moveSection($cid, $sectCatList, 'com_content', $sectionid, $items);
- }
- /**
- * Save the changes to move item(s) to a different section and category
- */
- function moveSectionSave()
- {
- global $mainframe;
- // Check for request forgeries
- JRequest::checkToken() or jexit( 'Invalid Token' );
- // Initialize variables
- $db = & JFactory::getDBO();
- $user = & JFactory::getUser();
- $cid = JRequest::getVar( 'cid', array(0), 'post', 'array' );
- $sectionid = JRequest::getVar( 'sectionid', 0, '', 'int' );
- $option = JRequest::getCmd( 'option' );
- JArrayHelper::toInteger($cid, array(0));
- $sectcat = JRequest::getVar( 'sectcat', '', 'post', 'string' );
- $sectcat = explode(',', $sectcat);
- $newsect = (int) @$sectcat[0];
- $newcat = (int) @$sectcat[1];
- if ((!$newsect || !$newcat) && ($sectcat !== array('0', ' 0'))) {
- $mainframe->redirect("index.php?option=com_content§ionid=$sectionid", JText::_('An error has occurred'));
- }
- // find section name
- $query = 'SELECT a.title' .
- ' FROM #__sections AS a' .
- ' WHERE a.id = '. (int) $newsect;
- $db->setQuery($query);
- $section = $db->loadResult();
- // find category name
- $query = 'SELECT a.title' .
- ' FROM #__categories AS a' .
- ' WHERE a.id = '. (int) $newcat;
- $db->setQuery($query);
- $category = $db->loadResult();
- $total = count($cid);
- $cids = implode(',', $cid);
- $uid = $user->get('id');
- $row = & JTable::getInstance('content');
- // update old orders - put existing items in last place
- foreach ($cid as $id)
- {
- $row->load(intval($id));
- $row->ordering = 0;
- $row->store();
- $row->reorder('catid = '.(int) $row->catid.' AND state >= 0');
- }
- $query = 'UPDATE #__content SET sectionid = '.(int) $newsect.', catid = '.(int) $newcat.
- ' WHERE id IN ( '.$cids.' )' .
- ' AND ( checked_out = 0 OR ( checked_out = '.(int) $uid.' ) )';
- $db->setQuery($query);
- if (!$db->query())
- {
- JError::raiseError( 500, $db->getErrorMsg() );
- return false;
- }
- // update new orders - put items in last place
- foreach ($cid as $id)
- {
- $row->load(intval($id));
- $row->ordering = 0;
- $row->store();
- $row->reorder('catid = '.(int) $row->catid.' AND state >= 0');
- }
- if ($section && $category) {
- $msg = JText::sprintf('Item(s) successfully moved to Section', $total, $section, $category);
- } else {
- $msg = JText::sprintf('ITEM(S) SUCCESSFULLY MOVED TO UNCATEGORIZED', $total);
- }
- $mainframe->redirect('index.php?option='.$option.'§ionid='.$sectionid, $msg);
- }
- /**
- * Form for copying item(s)
- **/
- function copyItem()
- {
- // Check for request forgeries
- JRequest::checkToken() or jexit( 'Invalid Token' );
- // Initialize variables
- $db = & JFactory::getDBO();
- $cid = JRequest::getVar( 'cid', array(), 'post', 'array' );
- $sectionid = JRequest::getVar( 'sectionid', 0, '', 'int' );
- $option = JRequest::getCmd( 'option' );
- JArrayHelper::toInteger($cid);
- if (count($cid) < 1) {
- $msg = JText::_('Select an item to move');
- $mainframe->redirect('index.php?option='.$option, $msg, 'error');
- }
- //seperate contentids
- $cids = implode(',', $cid);
- ## Articles query
- $query = 'SELECT a.title' .
- ' FROM #__content AS a' .
- ' WHERE ( a.id IN ( '. $cids .' ) )' .
- ' ORDER BY a.title';
- $db->setQuery($query);
- $items = $db->loadObjectList();
- ## Section & Category query
- $query = 'SELECT CONCAT_WS(",",s.id,c.id) AS `value`, CONCAT_WS(" / ", s.title, c.title) AS `text`' .
- ' FROM #__sections AS s' .
- ' INNER JOIN #__categories AS c ON c.section = s.id' .
- ' WHERE s.scope = "content"' .
- ' ORDER BY s.title, c.title';
- $db->setQuery($query);
- // Add a row for uncategorized content
- $uncat = JHTML::_('select.option', '0,0', JText::_('UNCATEGORIZED'));
- $rows = $db->loadObjectList();
- array_unshift($rows, $uncat);
- // build the html select list
- $sectCatList = JHTML::_('select.genericlist', $rows, 'sectcat', 'class="inputbox" size="10"', 'value', 'text', NULL);
- ContentView::copySection($option, $cid, $sectCatList, $sectionid, $items);
- }
- /**
- * saves Copies of items
- **/
- function copyItemSave()
- {
- global $mainframe;
- // Check for request forgeries
- JRequest::checkToken() or jexit( 'Invalid Token' );
- // Initialize variables
- $db = & JFactory::getDBO();
- $cid = JRequest::getVar( 'cid', array(), 'post', 'array' );
- $sectionid = JRequest::getVar( 'sectionid', 0, '', 'int' );
- $option = JRequest::getCmd( 'option' );
- JArrayHelper::toInteger($cid);
- $item = null;
- $sectcat = JRequest::getVar( 'sectcat', '-1,-1', 'post', 'string' );
- //seperate sections and categories from selection
- $sectcat = explode(',', $sectcat);
- $newsect = (int) @$sectcat[0];
- $newcat = (int) @$sectcat[1];
- if (($newsect == -1) || ($newcat == -1)) {
- $mainframe->redirect('index.php?option=com_content§ionid='.$sectionid, JText::_('An error has occurred'));
- }
- // find section name
- $query = 'SELECT a.title' .
- ' FROM #__sections AS a' .
- ' WHERE a.id = '. (int) $newsect;
- $db->setQuery($query);
- $section = $db->loadResult();
- // find category name
- $query = 'SELECT a.title' .
- ' FROM #__categories AS a' .
- ' WHERE a.id = '. (int) $newcat;
- $db->setQuery($query);
- $category = $db->loadResult();
- if (($newsect == 0) && ($newcat == 0))
- {
- $section = JText::_('UNCATEGORIZED');
- $category = JText::_('UNCATEGORIZED');
- }
- $total = count($cid);
- for ($i = 0; $i < $total; $i ++)
- {
- $row = & JTable::getInstance('content');
- // main query
- $query = 'SELECT a.*' .
- ' FROM #__content AS a' .
- ' WHERE a.id = '.(int) $cid[$i];
- $db->setQuery($query, 0, 1);
- $item = $db->loadObject();
- // values loaded into array set for store
- $row->id = NULL;
- $row->sectionid = $newsect;
- $row->catid = $newcat;
- $row->hits = '0';
- $row->ordering = '0';
- $row->title = $item->title;
- $row->title_alias = $item->title_alias;
- $row->introtext = $item->introtext;
- $row->fulltext = $item->fulltext;
- $row->state = $item->state;
- $row->mask = $item->mask;
- $row->created = $item->created;
- $row->created_by = $item->created_by;
- $row->created_by_alias = $item->created_by_alias;
- $row->modified = $item->modified;
- $row->modified_by = $item->modified_by;
- $row->checked_out = $item->checked_out;
- $row->checked_out_time = $item->checked_out_time;
- $row->publish_up = $item->publish_up;
- $row->publish_down = $item->publish_down;
- $row->images = $item->images;
- $row->attribs = $item->attribs;
- $row->version = $item->parentid;
- $row->parentid = $item->parentid;
- $row->metakey = $item->metakey;
- $row->metadesc = $item->metadesc;
- $row->access = $item->access;
- if (!$row->check()) {
- JError::raiseError( 500, $row->getError() );
- return false;
- }
- if (!$row->store()) {
- JError::raiseError( 500, $row->getError() );
- return false;
- }
- $row->reorder('catid='.(int) $row->catid.' AND state >= 0');
- }
- $msg = JText::sprintf('Item(s) successfully copied to Section', $total, $section, $category);
- $mainframe->redirect('index.php?option='.$option.'§ionid='.$sectionid, $msg);
- }
- /**
- * @param integer The id of the article
- * @param integer The new access level
- * @param string The URL option
- */
- function accessMenu($access)
- {
- global $mainframe;
- // Check for request forgeries
- JRequest::checkToken() or jexit( 'Invalid Token' );
- // Initialize variables
- $db = & JFactory::getDBO();
- $cid = JRequest::getVar( 'cid', array(0), 'post', 'array' );
- $option = JRequest::getCmd( 'option' );
- $cid = $cid[0];
- // Create and load the article table object
- $row = & JTable::getInstance('content');
- $row->load($cid);
- $row->access = $access;
- // Ensure the article object is valid
- if (!$row->check()) {
- JError::raiseError( 500, $row->getError() );
- return false;
- }
- // Store the changes
- if (!$row->store()) {
- JError::raiseError( 500, $row->getError() );
- return false;
- }
- $cache = & JFactory::getCache('com_content');
- $cache->clean();
- $mainframe->redirect('index.php?option='.$option);
- }
- function saveOrder()
- {
- global $mainframe;
- // Check for request forgeries
- JRequest::checkToken() or jexit( 'Invalid Token' );
- // Initialize variables
- $db = & JFactory::getDBO();
- $cid = JRequest::getVar( 'cid', array(0), 'post', 'array' );
- $order = JRequest::getVar( 'order', array (0), 'post', 'array' );
- $redirect = JRequest::getVar( 'redirect', 0, 'post', 'int' );
- $rettask = JRequest::getVar( 'returntask', '', 'post', 'cmd' );
- $total = count($cid);
- $conditions = array ();
- JArrayHelper::toInteger($cid, array(0));
- JArrayHelper::toInteger($order, array(0));
- // Instantiate an article table object
- $row = & JTable::getInstance('content');
- // Update the ordering for items in the cid array
- for ($i = 0; $i < $total; $i ++)
- {
- $row->load( (int) $cid[$i] );
- if ($row->ordering != $order[$i]) {
- $row->ordering = $order[$i];
- if (!$row->store()) {
- JError::raiseError( 500, $db->getErrorMsg() );
- return false;
- }
- // remember to updateOrder this group
- $condition = 'catid = '.(int) $row->catid.' AND state >= 0';
- $found = false;
- foreach ($conditions as $cond)
- if ($cond[1] == $condition) {
- $found = true;
- break;
- }
- if (!$found)
- $conditions[] = array ($row->id, $condition);
- }
- }
- // execute updateOrder for each group
- foreach ($conditions as $cond)
- {
- $row->load($cond[0]);
- $row->reorder($cond[1]);
- }
- $cache = & JFactory::getCache('com_content');
- $cache->clean();
- $msg = JText::_('New ordering saved');
- switch ($rettask)
- {
- case 'showarchive' :
- $mainframe->redirect('index.php?option=com_content&task=showarchive§ionid='.$redirect, $msg);
- break;
- default :
- $mainframe->redirect('index.php?option=com_content§ionid='.$redirect, $msg);
- break;
- }
- }
- function previewContent()
- {
- // Initialize variables
- $document =& JFactory::getDocument();
- $db =& JFactory::getDBO();
- $id = JRequest::getVar( 'id', 0, '', 'int' );
- $option = JRequest::getCmd( 'option' );
- // Get the current default template
- $query = 'SELECT template' .
- ' FROM #__templates_menu' .
- ' WHERE client_id = 0' .
- ' AND menuid = 0';
- $db->setQuery($query);
- $template = $db->loadResult();
- // check if template editor stylesheet exists
- if (!file_exists( JPATH_SITE.DS.'templates'.DS.$template.DS.'css'.DS.'editor.css' )) {
- $template = 'system';
- }
- // Set page title
- $document->setTitle(JText::_('Article Preview'));
- $document->addStyleSheet('../templates/'.$template.'/css/editor.css');
- $document->setBase(JUri::root());
- // Render article preview
- ContentView::previewContent();
- }
- function insertPagebreak()
- {
- $document =& JFactory::getDocument();
- $document->setTitle(JText::_('PGB ARTICLE PAGEBRK'));
- ContentView::insertPagebreak();
- }
- }