Codeigniter и разметка вложенных вкладок

#codeigniter #tabs

#codeigniter #вкладки

Вопрос:

Мне нужно некоторое руководство. Простите меня за длинный пост, но мне нужно объясниться. В моем мире нет никого, кто понимает, о чем я говорю, поэтому мне приходится обращаться за помощью в Интернет.

Я архитектор, создающий свой собственный веб-сайт, потому что работа иссякла, и я планирую использовать улучшенный веб-сайт для маркетинговой кампании.

Я сделал то, что я бы назвал «доработкой» этого сайта, который функционирует нормально. Но он и близко не готов к публикации. Я пытаюсь реорганизовать его для этого и переношу все это на Codeigniter. Моя загадка связана с представлениями в Codeigniter.

Одной из главных страниц для потенциальных клиентов является страница проектов, на которой показана проделанная работа. Он использует вложенные вкладки. Как я уже сказал, я заставил это нормально работать в обычном процедурном PHP.

Обратите внимание, что проекты организованы по категориям, т. е. жилищные, коммерческие и т.д. В каждой категории есть проекты.

На самом деле вкладки создаются динамически с некоторой помощью jQuery. Под этим я подразумеваю, что мой домотканый php создает разметку на основе того, что возвращается из базы данных.

Разметка табуляции является обычной разметкой неупорядоченного списка, элементы li которого содержат привязки, чьи hrefs ссылаются на divs, расположенные ниже. Для достижения вложенности эти divs затем содержат другой ul с дополнительным набором связанных с ним divs.

Верхние вкладки соответствуют категории, например, жилье, коммерческое. Нижние вкладки соответствуют проектам внутри категории.

Я уже проделывал эту работу с четырьмя запросами ранее. Я думаю, что по крайней мере одна может быть избыточной, но я сказал, что это «дополнение».

Запрос 1: "select distinct pcat, pcatid from pcategory inner join projects on pcatid = projcat order by pcat desc"

Из этого запроса я получаю идентификатор, используемый в href.

Запрос 2: то же, что и выше, но на этот раз идентификатор используется для идентификатора div.

Следующий запрос является источником моего недоумения, потому что я не вижу, как воспроизвести его с помощью CI.

Запрос 3 :

 $jobcat=$row2['pcatid']; 
$queryall3 = "select projid, projtit, projcost, projdate from projects where projcat= '$jobcat'";
  

В этом запросе используется идентификатор категории — $jobcat — возвращаемый каждой итерацией предложения while, используемого для расширения результатов запроса 2. Другими словами, он выполняется внутри цикла выполнения запроса 2, чтобы получить идентификатор категории, а затем получить все проекты, связанные с ней.

Результаты запроса 3 используются для формирования нижних вкладок, а их значением href является идентификатор проекта.

Запрос 4: аналогичен запросу 3 и используется для заполнения нижних разделов данными из базы данных, относящимися к определенному проекту.

Итак, наконец, мой вопрос: мне кажется, что запросом 3 сложно управлять с помощью настроенного Codeigniter. Я могу представить массив результатов, зацикленных на представлении. Чего я не могу себе представить, так это как выполнить вызов модели в этом цикле.

Приношу извинения за многословный вопрос и любые допущенные ошибки в кодировании. Помощь была бы благословением.

Том

Ответ №1:

Я действительно не понимаю, о чем вы спрашиваете, но, похоже, вы хотите знать, как выполнять запросы в CI?

В этом случае я предлагаю вам хорошенько ознакомиться с документами

 $this->db->select('pcat, pcatid');
$this->db->distinct();
$this->db->from('pcategory');
$this->db->join('projects', 'pcategory.pcatid = projects.pid', 'inner');
$this->db->order_by('pcat', 'DESC');
$result = $this->db->get();
  

Я очень сомневаюсь, что это сработает, поскольку я не знаю структуру вашей таблицы, но могу дать вам представление о том, как использовать класс active record в CI.

Вы, конечно, можете просто использовать query метод:

$results = $this->db->query('YOUR QUERY HERE');

однако класс active record может выполнить за вас большую часть работы.

Что касается сложности выполнения в CI, это просто неправда — вам просто нужна более четкая картина и понимание того, чего вы хотите достичь.

Редактировать

 $jobcat=$row2['pcatid']; 
$queryall3 = "select projid, projtit, projcost, projdate from projects where projcat= '$jobcat'";

$results=$this->db->query($queryall3);
$data = $results->result_array(); // get the results of the 3rd query as an array


// new query
$this->db->select('query_4_select'); // select whatever you need
$this->db->from('whatever_table');
// this probably isn't the most efficient way, but for examples sake:
foreach($data as $row) // using the result_array from above
{
    $this->db->or_where('query_4_id', $row['id']); // the magic !!
}
$new_results = $this->db->get();
  

Итак, по сути, вы получаете идентификаторы из запроса 3, запускаете его через foreach и создаете where x=x or x=y or x=b запрос типа, который затем (надеюсь) вернет желаемые результаты.

Это один из способов, вам нужно будет его настроить.

Но похоже, что вы можете просто использовать join? Возможно, если бы вы могли опубликовать всю структуру ваших таблиц.

Комментарии:

1. Спасибо, Росс. Прошу прощения, если мой пост неясен. Иногда объяснение всего этого не помогает. Я спрашиваю, как вложить запрос в предложение while, используемое для перебора результатов другого запроса в представлении. Я уже знаком с docs и классом active record и другими хорошими вещами в CI.

2. привет, Росс, еще раз спасибо. Ваша правка помогла, и я проголосовал за нее. Ваши содержательные комментарии тоже полезны. Прежде чем я увидел вашу последнюю версию, я придумал свое собственное работоспособное решение: один запрос для всего, из чего я извлекаю категорию, используя unique_array(), сбрасываю все номера категорий в другой массив, перебираю эти числа и, если они совпадают с результатом основного запроса [‘catid’], затем печатаю их