Before anything, I must say this code works as well for the English language, but in Persian it never works.
I use this code on model/celebrities.php. This code shows my frontend model:
class AvisamoviedbModelCelebrities extends ListModel
{
protected function populateState($ordering = null, $direction = null)
{
$app = Factory::getApplication('site');
$params = $app->getParams();
$this->setState('list.start', $app->input->get('limitstart',0,'unit'));
$limit = $params->get('celebrities_limit');
$this->setState('list.limit', $limit);
}
/**
* Method to get a JDatabaseQuery object for retrieving the data set from a database.
*
* @return JDatabaseQuery A JDatabaseQuery object to retrieve the data set.
*
* @since 1.0.0
*/
public function getListQuery($overrideLimits = false)
{
if (Factory::getApplication()->isClient('site')) {
// Get Params
$app = Factory::getApplication();
$params = $app->getMenu()->getActive()->getParams(); // get the active item
$order_by = $params->get('order_by', '');
$celebrity_type = $params->get('celebrities_type', '');
$gender = $params->get('gender', '');
}
$inputs = Factory::getApplication()->input;
$alphaindex = $inputs->get('alphaindex', '', 'WORD');
//for celebrities per page limit
$cparams = ComponentHelper::getParams('com_avisamoviedb');
$start = $app->input->get('start', 0, 'INT');
$limit = $cparams->get('celebrities_limit');
$db = $this->getDbo();
$query = $db->getQuery(true);
$query->select(array('a.*'));
$query->from($db->quoteName('#__avisamoviedb_celebrities', 'a'));
if (Factory::getApplication()->isClient('site')) {
if ($alphaindex) {
$query->where($db->quoteName('a.title') . " LIKE " . $db->quote(($alphaindex) . '%'));
}
$query->where($db->quoteName('a.published') . " = " . $db->quote('1'));
$query->setLimit($limit, $start);
if ($order_by == 'desc') {
$query->order($db->quoteName('a.created') . ' DESC');
} elseif ($order_by == 'asc') {
$query->order($db->quoteName('a.created') . ' ASC');
} elseif ($order_by == 'featured') {
$query->where($db->quoteName('a.featured') . ' = 1');
$query->order($db->quoteName('a.ordering') . ' DESC');
} else {
$query->order($db->quoteName('a.ordering') . ' DESC');
}
if ($celebrity_type == 'actors') {
$query->where('a.celebrity_type in (' . $db->quote('actor') . ',' . $db->quote('both') . ')');
} elseif ($celebrity_type == 'directors') {
$query->where('a.celebrity_type in (' . $db->quote('director') . ',' . $db->quote('both') . ')');
}
if ($gender == 'male') {
$query->where($db->quoteName('a.gender') . ' = ' . $db->quote('male'));
} elseif ($gender == 'female') {
$query->where($db->quoteName('a.gender') . ' = ' . $db->quote('female'));
} elseif ($gender == 'others') {
$query->where($db->quoteName('a.gender') . ' = ' . $db->quote('others'));
}
//Language
$query->where('a.language in (' . $db->quote(Factory::getLanguage()->getTag()) . ',' . $db->quote('*') . ')');
//Access
$query->where($db->quoteName('a.access') . " IN (" . implode(',', Factory::getUser()->getAuthorisedViewLevels()) . ")");
} else {
$query->order($db->quoteName('a.ordering') . ' DESC');
}
return $query;
}
/**
* get total celebrity
*
* @return mixed
*/
public static function getCountCelebrities()
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select(array('COUNT(a.id) as total_celebrities'));
$query->from($db->quoteName('#__avisamoviedb_celebrities', 'a'));
$query->where($db->quoteName('a.published') . " = " . $db->quote('1'));
$db->setQuery($query);
return $db->loadObject();
}
}
And this code to site/view/celebrities/view.html.php:
class AvisamoviedbViewCelebrities extends HtmlView
{
protected $items;
protected $pagination;
/**
* Display the view
*
* @param string The name of the template file to parse; automatically searches through the template paths.
*
* @return mixed A string if successful, otherwise an Error object.
*/
public function display($tpl = null)
{
$model = $this->getModel();
$this->pagination = $model->getPagination();
$this->items = $model->getItems();
$params = ComponentHelper::getParams('com_avisamoviedb');
$this->columns = $params->get('celebrities_columns', 4);
// Get model
$this->total_celebrities = $model->getCountCelebrities()->total_celebrities ?? 0;
$this->alphabets = ['ا', 'ب', 'پ', 'ت', 'ث', 'ج', 'چ', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'ژ', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ک', 'گ', 'ل', 'م', 'ن', 'و', 'ه', 'ی'];
foreach ($this->items as &$this->item) {
$this->item->url = Route::_('index.php?option=com_avisamoviedb&view=celebrity&id=' . $this->item->id . ':' . $this->item->alias . AvisamoviedbHelper::getItemid('celebrities'));
}
return parent::display($tpl = null);
}
}
And this one to site/view/celebrities/tmpl/default.php:
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;
$input = Factory::getApplication()->input;
$Itemid = $input->get('Itemid', 0, 'INT');
$alphaindex = $input->get('alphaindex', 'all', 'WORD');
$allAlphaUrl = 'index.php?option=com_avisamoviedb&view=celebrities&Itemid=' . $Itemid;
if ($alphaindex) {
$alphaUrl = 'index.php?option=com_avisamoviedb&view=celebrities&alphaindex=' . $alphaindex . '&Itemid=' . $Itemid;
} else {
$alphaUrl = 'index.php?option=com_avisamoviedb&view=celebrities&Itemid=' . $Itemid;
}
?>
<div id="com-avisa-moviedb" class="avisamoviedb avisa-moviedb avisa-moviedb-view-celebrities">
<div class="moviedb-filters">
<div class="pull-left">
<ul>
<li class="<?php echo ($alphaindex == 'all') ? 'active' : ''; ?>">
<a href="<?php echo Route::_($allAlphaUrl); ?>"><?php echo Text::_('COM_AVISAMOVIEDB_ALL'); ?></a>
</li>
<?php foreach ($this->alphabets as $alphabet) { ?>
<li class="<?php echo ($alphaindex == $alphabet) ? 'active' : ''; ?>">
<a href="<?php echo Route::_($alphaUrl . '&alphaindex=' . $alphabet); ?>">
<?php echo $alphabet; ?>
</a>
</li>
<?php } ?>
</ul>
</div>
<div class="pull-right">
<?php echo Text::_('COM_AVISAMOVIEDB_TOTAL'); ?>:
<strong><?php echo $this->total_celebrities; ?></strong>
</div>
</div>
<?php if (!count($this->items)) { ?>
<div class="alert alert-warning">
<?php echo Text::_('COM_AVISAMOVIEDB_NOTHING_FOUND'); ?>
</div>
<?php } ?>
<?php foreach (array_chunk($this->items, $this->columns) as $this->items) { ?>
<div class="avisamoviedb-row">
<?php foreach ($this->items as $celebrity) { ?>
<div class="item avisamoviedb-col-sm-<?php echo round(12 / $this->columns); ?>">
<div class="celebritie-poster">
<img src="<?php echo Uri::root() . $celebrity->profile_image; ?>" alt="<?php echo $celebrity->title; ?>">
<a href="<?php echo $celebrity->url; ?>" class="play-icon"><i class="avisamoviedb-icon-celebrities"></i></a>
</div>
<div class="celebritie-details">
<div class="celebritie-name">
<a href="<?php echo $celebrity->url; ?>">
<h4 class="celebritie-title"><?php echo $celebrity->title; ?></h4>
</a>
<span><?php echo $celebrity->designation; ?></span>
</div>
</div>
</div>
<?php } ?>
</div>
<?php } ?>
<?php
if ($this->pagination->pagesTotal > 1) { ?>
<?php echo $this->pagination->getPagesLinks(); ?>
<?php } ?>
</div>
But this code doesn’t filter my celebrities in my site. What’s wrong?
Here you can see I choose 'ص', but I can see all items. All these items must hide... And if I choose the right alphabet, these items must show. This code must work as some filter.