206 lines
6.0 KiB
PHP
206 lines
6.0 KiB
PHP
<?php
|
|
/**
|
|
* Attachments component attachment table
|
|
*
|
|
* @package Attachments
|
|
* @subpackage Attachments_Component
|
|
*
|
|
* @copyright Copyright (C) 2007-2018 Jonathan M. Cameron, All Rights Reserved
|
|
* @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL
|
|
* @link http://joomlacode.org/gf/project/attachments/frs/
|
|
* @author Jonathan M. Cameron
|
|
*/
|
|
|
|
// No direct access
|
|
defined('_JEXEC') or die('Restricted access');
|
|
|
|
// import Joomla table library
|
|
jimport('joomla.database.table');
|
|
|
|
/** Load the Attachments helper */
|
|
require_once(JPATH_SITE.'/components/com_attachments/helper.php');
|
|
|
|
|
|
/**
|
|
* Attachments table class
|
|
*
|
|
* @package Attachments
|
|
*/
|
|
class AttachmentsTableAttachment extends JTable
|
|
{
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @param object Database connector object
|
|
*/
|
|
public function __construct(&$db)
|
|
{
|
|
parent::__construct('#__attachments', 'id', $db);
|
|
}
|
|
|
|
|
|
/**
|
|
* Method to set the publishing state for a row or list of rows in the database
|
|
* table. The method respects checked out rows by other users and will attempt
|
|
* to checkin rows that it can after adjustments are made.
|
|
*
|
|
* @param mixed An optional array of primary key values to update. If not
|
|
* set the instance property value is used.
|
|
* @param integer The publishing state. eg. [0 = unpublished, 1 = published]
|
|
* @param integer The user id of the user performing the operation.
|
|
* @return int Number of attachments published ( false if 0 )
|
|
* @since 1.0.4
|
|
* @link http://docs.joomla.org/JTable/publish
|
|
*/
|
|
public function publish($pks = null, $state = 1, $userId = 0)
|
|
{
|
|
// Initialise variables.
|
|
$k = $this->_tbl_key;
|
|
|
|
// Sanitize input.
|
|
JArrayHelper::toInteger($pks);
|
|
$userId = (int) $userId;
|
|
$state = (int) $state;
|
|
|
|
// If there are no primary keys set check to see if the instance key is set.
|
|
if (empty($pks)) {
|
|
if ($this->$k) {
|
|
$pks = array($this->$k);
|
|
}
|
|
// Nothing to set publishing state on, return false.
|
|
else {
|
|
$e = new JException(JText::_('JLIB_DATABASE_ERROR_NO_ROWS_SELECTED'));
|
|
$this->setError($e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Get the article/parent handler
|
|
JPluginHelper::importPlugin('attachments');
|
|
$apm = getAttachmentsPluginManager();
|
|
|
|
// Remove any attachments that the user may not publish/unpublish
|
|
$bad_ids = Array();
|
|
foreach ($pks as $id)
|
|
{
|
|
// Get the info about this attachment
|
|
$query = $this->_db->getQuery(true);
|
|
$query->select('*')->from($this->_tbl);
|
|
$query->where('id='.(int)$id);
|
|
$this->_db->setQuery($query);
|
|
$attachment = $this->_db->loadObject();
|
|
if ( $this->_db->getErrorNum() ) {
|
|
$errmsg = $db->stderr() . ' (ERR 108)';
|
|
JError::raiseError(500, $errmsg);
|
|
}
|
|
|
|
$parent_id = $attachment->parent_id;
|
|
$parent_type = $attachment->parent_type;
|
|
$parent_entity = $attachment->parent_entity;
|
|
|
|
if ( !$apm->attachmentsPluginInstalled($parent_type) ) {
|
|
$errmsg = JText::sprintf('ATTACH_ERROR_INVALID_PARENT_TYPE_S', $parent_type) . ' (ERR 109)';
|
|
JError::raiseError(500, $errmsg);
|
|
}
|
|
$parent = $apm->getAttachmentsPlugin($parent_type);
|
|
|
|
// If we may not change it's state, complain!
|
|
if ( !$parent->userMayChangeAttachmentState($parent_id, $parent_entity,
|
|
$attachment->created_by) )
|
|
{
|
|
// Note the bad ID
|
|
$bad_ids[] = $id;
|
|
|
|
// If the user is not authorized, complain
|
|
$app = JFactory::getApplication();
|
|
$parent_entity = $parent->getCanonicalEntityId($parent_entity);
|
|
$errmsg = JText::sprintf('ATTACH_ERROR_NO_PERMISSION_TO_PUBLISH_S_ATTACHMENT_S_ID_N',
|
|
$parent_entity, $attachment->filename, $id) . ' (ERR 110)';
|
|
$app->enqueueMessage($errmsg, 'error');
|
|
}
|
|
}
|
|
|
|
// Remove any offending attachments
|
|
$pks = array_diff($pks, $bad_ids);
|
|
|
|
// Exit if there are no attachments the user can change the state of
|
|
if ( empty($pks) )
|
|
{
|
|
// No warning needed because warnings already issued for attachments user cannot change
|
|
return false;
|
|
}
|
|
|
|
// Update the publishing state for rows with the given primary keys.
|
|
$query = $this->_db->getQuery(true);
|
|
$query->update($this->_tbl);
|
|
$query->set('state = '.(int) $state);
|
|
|
|
// Determine if there is checkin support for the table.
|
|
if (property_exists($this, 'checked_out') || property_exists($this, 'checked_out_time')) {
|
|
$query->where('(checked_out = 0 OR checked_out = '.(int) $userId.')');
|
|
$checkin = true;
|
|
}
|
|
else {
|
|
$checkin = false;
|
|
}
|
|
|
|
// Build the WHERE clause for the primary keys.
|
|
$query->where($k.' = '.implode(' OR '.$k.' = ', $pks));
|
|
|
|
$this->_db->setQuery($query);
|
|
|
|
// Check for a database error.
|
|
if (!$this->_db->query()) {
|
|
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_PUBLISH_FAILED',
|
|
get_class($this), $this->_db->getErrorMsg()) . ' (ERR 111)');
|
|
$this->setError($e);
|
|
return false;
|
|
}
|
|
|
|
// If checkin is supported and all rows were adjusted, check them in.
|
|
if ($checkin && (count($pks) == $this->_db->getAffectedRows())) {
|
|
// Checkin the rows.
|
|
foreach($pks as $pk)
|
|
{
|
|
$this->checkin($pk);
|
|
}
|
|
}
|
|
|
|
// If the JTable instance value is in the list of primary keys that were set, set the instance.
|
|
if (in_array($this->$k, $pks)) {
|
|
$this->state = $state;
|
|
}
|
|
|
|
$this->setError('');
|
|
return count($pks);
|
|
}
|
|
|
|
|
|
/**
|
|
* Store the attachment into the database
|
|
*
|
|
* Extend base class function to encode description and display_name safely
|
|
*
|
|
* @param boolean $updateNulls True to update fields even if they are null.
|
|
*
|
|
* @return boolean True on success.
|
|
*
|
|
* @link http://docs.joomla.org/JTable/store
|
|
*/
|
|
public function store($updateNulls = false)
|
|
{
|
|
// make sure the display name and description are escaped since they may contain quotes
|
|
$this->display_name = $this->_db->escape($this->display_name);
|
|
$this->description = $this->_db->escape($this->description);
|
|
|
|
$this->user_field_1 = $this->_db->escape($this->user_field_1);
|
|
$this->user_field_2 = $this->_db->escape($this->user_field_2);
|
|
$this->user_field_3 = $this->_db->escape($this->user_field_3);
|
|
|
|
// Let the parent class do the real work!
|
|
return parent::store($updateNulls);
|
|
}
|
|
|
|
}
|
|
|