joomla-component/admin/models/notes.php
Robot 8d583feb3f
Stable release of v2.1.0
Move all JText to use the namespaced class Text directly. Move all JHtml to use the namespaced class Html directly. Move all JFactory to use the namespaced class Factory directly. Move all JRoute to use the namespaced class Route directly. Move all JFormHelper to use the namespaced class FormHelper directly. Move all JLayout to use the namespaced class FileLayout directly. Move all JLanguageMultilang to use the namespaced class Multilanguage directly. Move all JComponentHelper to use the namespaced class ComponentHelper directly. Move all JCategoryNode to use the namespaced class CategoryNode directly. Move all JComponentHelper to use the namespaced class ComponentHelper directly. Move all JToolbar to use the namespaced class Toolbar directly. Move all JToolbarHelper to use the namespaced class ToolbarHelper directly. Convert all addStyleSheet to make use of Html class instead. Convert all addScript to make use of Html class instead.
2023-12-23 18:05:05 +02:00

441 lines
12 KiB
PHP

<?php
/*----------------------------------------------------------------------------------| io.vdm.dev |----/
Vast Development Method
/-------------------------------------------------------------------------------------------------------/
@package getBible.net
@created 3rd December, 2015
@author Llewellyn van der Merwe <https://getbible.net>
@git Get Bible <https://git.vdm.dev/getBible>
@github Get Bible <https://github.com/getBible>
@support Get Bible <https://git.vdm.dev/getBible/support>
@copyright Copyright (C) 2015. All Rights Reserved
@license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
/------------------------------------------------------------------------------------------------------*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\MVC\Model\ListModel;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\Utilities\ArrayHelper;
use VDM\Joomla\Utilities\ArrayHelper as UtilitiesArrayHelper;
use VDM\Joomla\Utilities\ObjectHelper;
use VDM\Joomla\Utilities\StringHelper;
/**
* Notes List Model
*/
class GetbibleModelNotes extends ListModel
{
public function __construct($config = [])
{
if (empty($config['filter_fields']))
{
$config['filter_fields'] = array(
'a.id','id',
'a.published','published',
'a.access','access',
'a.ordering','ordering',
'a.created_by','created_by',
'a.modified_by','modified_by',
'a.book_nr','book_nr',
'g.name','linker',
'a.verse','verse',
'a.chapter','chapter'
);
}
parent::__construct($config);
}
/**
* Method to auto-populate the model state.
*
* Note. Calling getState in this method will result in recursion.
*
* @param string $ordering An optional ordering field.
* @param string $direction An optional direction (asc|desc).
*
* @return void
*
*/
protected function populateState($ordering = null, $direction = null)
{
$app = Factory::getApplication();
// Adjust the context to support modal layouts.
if ($layout = $app->input->get('layout'))
{
$this->context .= '.' . $layout;
}
// Check if the form was submitted
$formSubmited = $app->input->post->get('form_submited');
$published = $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', '');
$this->setState('filter.published', $published);
$created_by = $this->getUserStateFromRequest($this->context . '.filter.created_by', 'filter_created_by', '');
$this->setState('filter.created_by', $created_by);
$created = $this->getUserStateFromRequest($this->context . '.filter.created', 'filter_created');
$this->setState('filter.created', $created);
$sorting = $this->getUserStateFromRequest($this->context . '.filter.sorting', 'filter_sorting', 0, 'int');
$this->setState('filter.sorting', $sorting);
$search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
$this->setState('filter.search', $search);
$book_nr = $this->getUserStateFromRequest($this->context . '.filter.book_nr', 'filter_book_nr');
if ($formSubmited)
{
$book_nr = $app->input->post->get('book_nr');
$this->setState('filter.book_nr', $book_nr);
}
$linker = $this->getUserStateFromRequest($this->context . '.filter.linker', 'filter_linker');
if ($formSubmited)
{
$linker = $app->input->post->get('linker');
$this->setState('filter.linker', $linker);
}
$access = $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access');
if ($formSubmited)
{
$access = $app->input->post->get('access');
$this->setState('filter.access', $access);
}
$verse = $this->getUserStateFromRequest($this->context . '.filter.verse', 'filter_verse');
if ($formSubmited)
{
$verse = $app->input->post->get('verse');
$this->setState('filter.verse', $verse);
}
$chapter = $this->getUserStateFromRequest($this->context . '.filter.chapter', 'filter_chapter');
if ($formSubmited)
{
$chapter = $app->input->post->get('chapter');
$this->setState('filter.chapter', $chapter);
}
// List state information.
parent::populateState($ordering, $direction);
}
/**
* Method to get an array of data items.
*
* @return mixed An array of data items on success, false on failure.
*/
public function getItems()
{
// Check in items
$this->checkInNow();
// load parent items
$items = parent::getItems();
// Set values to display correctly.
if (UtilitiesArrayHelper::check($items))
{
// Get the user object if not set.
if (!isset($user) || !ObjectHelper::check($user))
{
$user = Factory::getUser();
}
foreach ($items as $nr => &$item)
{
// Remove items the user can't access.
$access = ($user->authorise('note.access', 'com_getbible.note.' . (int) $item->id) && $user->authorise('note.access', 'com_getbible'));
if (!$access)
{
unset($items[$nr]);
continue;
}
$item->book_nr = $item->book_nr . ' ' . $item->chapter . ':' . $item->verse;
}
}
// set selection value to a translatable value
if (UtilitiesArrayHelper::check($items))
{
foreach ($items as $nr => &$item)
{
// convert access
$item->access = $this->selectionTranslation($item->access, 'access');
}
}
// return items
return $items;
}
/**
* Method to convert selection values to translatable string.
*
* @return translatable string
*/
public function selectionTranslation($value,$name)
{
// Array of access language strings
if ($name === 'access')
{
$accessArray = array(
1 => 'COM_GETBIBLE_NOTE_PUBLIC',
0 => 'COM_GETBIBLE_NOTE_PRIVATE'
);
// Now check if value is found in this array
if (isset($accessArray[$value]) && StringHelper::check($accessArray[$value]))
{
return $accessArray[$value];
}
}
return $value;
}
/**
* Method to build an SQL query to load the list data.
*
* @return string An SQL query
*/
protected function getListQuery()
{
// Get the user object.
$user = Factory::getUser();
// Create a new query object.
$db = Factory::getDBO();
$query = $db->getQuery(true);
// Select some fields
$query->select('a.*');
// From the getbible_item table
$query->from($db->quoteName('#__getbible_note', 'a'));
// From the getbible_linker table.
$query->select($db->quoteName(['g.name','g.id'],['linker_name','linker_id']));
$query->join('LEFT', $db->quoteName('#__getbible_linker', 'g') . ' ON (' . $db->quoteName('a.linker') . ' = ' . $db->quoteName('g.guid') . ')');
// Filter by published state
$published = $this->getState('filter.published');
if (is_numeric($published))
{
$query->where('a.published = ' . (int) $published);
}
elseif ($published === '')
{
$query->where('(a.published = 0 OR a.published = 1)');
}
// Join over the asset groups.
$query->select('ag.title AS access_level');
$query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access');
// Implement View Level Access
if (!$user->authorise('core.options', 'com_getbible'))
{
$groups = implode(',', $user->getAuthorisedViewLevels());
$query->where('a.access IN (' . $groups . ')');
}
// Filter by search.
$search = $this->getState('filter.search');
if (!empty($search))
{
if (stripos($search, 'id:') === 0)
{
$query->where('a.id = ' . (int) substr($search, 3));
}
else
{
$search = $db->quote('%' . $db->escape($search) . '%');
$query->where('(a.book_nr LIKE '.$search.' OR a.linker LIKE '.$search.' OR g.name LIKE '.$search.' OR a.note LIKE '.$search.')');
}
}
// Filter by Book_nr.
$_book_nr = $this->getState('filter.book_nr');
if (is_numeric($_book_nr))
{
if (is_float($_book_nr))
{
$query->where('a.book_nr = ' . (float) $_book_nr);
}
else
{
$query->where('a.book_nr = ' . (int) $_book_nr);
}
}
elseif (GetbibleHelper::checkString($_book_nr))
{
$query->where('a.book_nr = ' . $db->quote($db->escape($_book_nr)));
}
// Filter by Linker.
$_linker = $this->getState('filter.linker');
if (is_numeric($_linker))
{
if (is_float($_linker))
{
$query->where('a.linker = ' . (float) $_linker);
}
else
{
$query->where('a.linker = ' . (int) $_linker);
}
}
elseif (GetbibleHelper::checkString($_linker))
{
$query->where('a.linker = ' . $db->quote($db->escape($_linker)));
}
// Filter by Access.
$_access = $this->getState('filter.access');
if (is_numeric($_access))
{
if (is_float($_access))
{
$query->where('a.access = ' . (float) $_access);
}
else
{
$query->where('a.access = ' . (int) $_access);
}
}
elseif (GetbibleHelper::checkString($_access))
{
$query->where('a.access = ' . $db->quote($db->escape($_access)));
}
// Filter by Verse.
$_verse = $this->getState('filter.verse');
if (is_numeric($_verse))
{
if (is_float($_verse))
{
$query->where('a.verse = ' . (float) $_verse);
}
else
{
$query->where('a.verse = ' . (int) $_verse);
}
}
elseif (GetbibleHelper::checkString($_verse))
{
$query->where('a.verse = ' . $db->quote($db->escape($_verse)));
}
// Filter by Chapter.
$_chapter = $this->getState('filter.chapter');
if (is_numeric($_chapter))
{
if (is_float($_chapter))
{
$query->where('a.chapter = ' . (float) $_chapter);
}
else
{
$query->where('a.chapter = ' . (int) $_chapter);
}
}
elseif (GetbibleHelper::checkString($_chapter))
{
$query->where('a.chapter = ' . $db->quote($db->escape($_chapter)));
}
// Add the list ordering clause.
$orderCol = $this->state->get('list.ordering', 'a.id');
$orderDirn = $this->state->get('list.direction', 'desc');
if ($orderCol != '')
{
$query->order($db->escape($orderCol . ' ' . $orderDirn));
}
return $query;
}
/**
* Method to get a store id based on model configuration state.
*
* @return string A store id.
*
*/
protected function getStoreId($id = '')
{
// Compile the store id.
$id .= ':' . $this->getState('filter.id');
$id .= ':' . $this->getState('filter.search');
$id .= ':' . $this->getState('filter.published');
$id .= ':' . $this->getState('filter.ordering');
$id .= ':' . $this->getState('filter.created_by');
$id .= ':' . $this->getState('filter.modified_by');
$id .= ':' . $this->getState('filter.book_nr');
$id .= ':' . $this->getState('filter.linker');
$id .= ':' . $this->getState('filter.verse');
$id .= ':' . $this->getState('filter.chapter');
return parent::getStoreId($id);
}
/**
* Build an SQL query to checkin all items left checked out longer then a set time.
*
* @return a bool
*
*/
protected function checkInNow()
{
// Get set check in time
$time = ComponentHelper::getParams('com_getbible')->get('check_in');
if ($time)
{
// Get a db connection.
$db = Factory::getDbo();
// Reset query.
$query = $db->getQuery(true);
$query->select('*');
$query->from($db->quoteName('#__getbible_note'));
// Only select items that are checked out.
$query->where($db->quoteName('checked_out') . '!=0');
$db->setQuery($query, 0, 1);
$db->execute();
if ($db->getNumRows())
{
// Get Yesterdays date.
$date = Factory::getDate()->modify($time)->toSql();
// Reset query.
$query = $db->getQuery(true);
// Fields to update.
$fields = array(
$db->quoteName('checked_out_time') . '=\'0000-00-00 00:00:00\'',
$db->quoteName('checked_out') . '=0'
);
// Conditions for which records should be updated.
$conditions = array(
$db->quoteName('checked_out') . '!=0',
$db->quoteName('checked_out_time') . '<\''.$date.'\''
);
// Check table.
$query->update($db->quoteName('#__getbible_note'))->set($fields)->where($conditions);
$db->setQuery($query);
$db->execute();
}
}
return false;
}
}