Как вывести только те новости, которые принадлежат к определенной категории?

247
08 апреля 2017, 00:50

Вообщем ситуация в том, чтобы в блоке вывести только те новости, которые принадлежат к определенной категории. Уже долго сижу над этим, но не могу сообразить. Вот несколько ссылок на мой код, чтобы немного прояснить ситуацию. Ссылка на Блок с категориями и отображением всех Item, Controller, ItemsModel, CategoryModel, Mysql таблица категорий, Mysql таблица Items, Smarty шаблон.

Заранее спасибо!

Для удобства добавляю код в сам вопрос:
MainController:

class MainController implements \Interfaces\ControllersInterface
{
  public function index()
  {
    global $smarty;
    $news = CategoriesModel::getAll();
    $items = [];
    foreach ($news as $new){
        $id = $new['category_id'];
        $items**[$id]**[] = ItemsModel::getItemsByCategoryId($id);
    }
    $smarty->assign('items', $items);
    $smarty->assign('news', $news);
    $smarty->display('main.tpl');
  }
}

CategoriesModel:

class CategoriesModel{
    public static function getAll()
{
    $query = "SELECT * FROM categories ORDER BY weight DESC";
    $db = DB::getConnection();
    return $db->query($query)->fetch_all(MYSQLI_ASSOC);
}
public static function getCategoryId()
{
    $query = "SELECT category_id FROM categories";
    $db = DB::getConnection();
    return $db->query($query)->fetch_all(MYSQLI_ASSOC);
}
public static function getItemsByCategoryId($id)
{
    $query = "SELECT * FROM items WHERE category_id = '$id'";
    $db = DB::getConnection();
    return $db->query($query)->fetch_all(MYSQLI_ASSOC);
}
}

ItemsModel:

class ItemsModel{
public $name;
public $description;
public $category_id;
public static function itemsList()
{
    $db = DB::getConnection();
    $query = "SELECT * FROM items";
    return $db->query($query)->fetch_all(MYSQLI_ASSOC);
}
public static function getSingleItem($id)
{
    $db = DB::getConnection();
    $query = "SELECT * FROM items WHERE id = '$id'";
    return $db->query($query)->fetch_all(MYSQLI_ASSOC);
}
public static function getItemsByCategoryId($id)
{
    $query = "SELECT * FROM items WHERE category_id = '$id'";
    $db = DB::getConnection();
    return $db->query($query)->fetch_all(MYSQLI_ASSOC);
}
}

Шаблон где происходит вывод:

<div class="col-md-3">
    <div class="label label-info"><a href="/news">Show all latest news</a></div><br /><br />
    {foreach $news as $article}
    <div class="panel panel-info">
        <div class="panel-heading">{$article["name"]}</div>
        <div class="panel-body">
            {foreach $items*[$article["category_id"]* as $it}
                {foreach $it as $i}
                    {$i["name"]}
                {/foreach}
            {/foreach}
        </div>
    </div>
    {/foreach}
</div>
Answer 1

Проиндексируйте $items по id категории, заполняя массив таким образом: $items[$id] = ItemsModel::getItemsByCategoryId($id);. А в шаблоне, внутри цикла {foreach $news as $article} обходите не все $items, а только $items[$article['id']].

READ ALSO
Как получить свойства объекта?

Как получить свойства объекта?

есть такой объект

219
ElasticSearch - сортировка по расстоянию от точки

ElasticSearch - сортировка по расстоянию от точки

Я использую Elasticsearch для поиска заведений по названиюМне нужно отсортировать результаты по количеству совпадений (_score) и расстоянию до координат...

271
Проверка ряда значений через empty

Проверка ряда значений через empty

Есть задача: нужно проверить на предмет наличия значений в ряде переменныхЕсть ли какой-то "человеческий" способ или каждую нужно перебирать...

203
Скрипт лайков на WordPress + Ajax

Скрипт лайков на WordPress + Ajax

Пытаюсь без сторонних плагинов сделать лайкиТак чтобы нажал один раз - "+1" лайк, нажал второй раз - "-1" лайк

308