Я разрабатываю приложение, используя slim, backbone.js и jquery mobile с серверной частью MySQL.
Рабочий процесс идет по схеме:
1) Найдите модуль uni. 2) Перечислите соответствующие модули. 3) Выберите и просмотрите страницу сведений о модуле. 4) Список лекторов, связанных с модулем. 5) Выберите и просмотрите лектора.
Я выполнил шаги с 1 по 4, но не могу отобразить страницу сведений о лекторе. Я думаю, что, возможно, я неправильно передаю идентификатор в вызов API, или моя маршрутизация испорчена.
В моем index.php у меня есть список вызовов API:
$app = новый Slim();
$app->get('/modules', 'getModules'); $app->get('/modules/:id', 'getModule'); $app->get('/modules/search/:query', 'getModulesByName'); $app->get('/modules/:id/students', 'getStudents'); $app->get('/modules/:id/lecturers', 'getLecturers'); $app->get('/modules/lecturers/:id/lecturer', 'getLecturer');
Последние два относятся к вытягиванию списка лекторов, связанных с модулем, а затем вытягиванию отдельного лектора, когда вы нажимаете на них, показывая подробности.
getLecturers работает и находится здесь для справки:
function getLecturers($id) { $sql = "выберите l.staffNumber, l.firstName, l.lastName, l.moduleNo1, l.moduleNo2, l.email, m.moduleNo из таблицы лекторов l, таблицы модулей m, где m.moduleNo= :id И (l.moduleNo1=:id ИЛИ l.moduleNo2=:id)";
try { $db = getConnection(); $stmt = $db->prepare($sql); $stmt->bindParam("id", $id); $stmt->execute(); $lecturer = $stmt->fetchAll(PDO::FETCH_OBJ); $db = null; if (!isset($_GET['callback'])) { echo json_encode($lecturer); } else { echo $_GET['callback'] . '(' . json_encode($lecturer) . ');'; } } catch(PDOException $e) { echo '{"error":{"text":'. $e->getMessage() .'}}'; } }
getLecturer (сингл) находится здесь:
function getLecturer($id) { $sql = "выберите l.staffNumber, l.firstName, l.lastName, l.moduleNo1, l.moduleNo2, l.email из лекторской таблицы l, где l.staffNumber=:id";
try { $db = getConnection(); $stmt = $db->prepare($sql); $stmt->bindParam("id", $id); $stmt->execute(); $lecturer = $stmt->fetchObject(); $db = null; if (!isset($_GET['callback'])) { echo json_encode($lecturer); } else { echo $_GET['callback'] . '(' . json_encode($lecturer) . ');'; } } catch(PDOException $e) { echo '{"error":{"text":'. $e->getMessage() .'}}'; } }
Вот мои маршруты в main.js:
var AppRouter = Backbone.Router.extend({
routes:{ "":"list", "list":"list", "modules/:id":"moduleDetails", "modules/:id/students":"moduleStudents", "modules/:id/lecturers":"moduleLecturers", "modules/:id/lecturers/:id/lecturer":"lecturerDetails" },
и соответствующие функции moduleLecturers и LectorDetails:
moduleLecturers: function (id) { var module = new Module({id:id}); модуль.лекторы.fetch(); this.changePage(новый ModuleLecturersPage({model:module.lecturers})); },
lecturerDetails:function (id) { var lecturer = new Lecturer({id:id}); var self = this; module.lecturers.lecturer.fetch({ success:function (data) { self.changePage(new LecturerView({model:data})); } }); },
Затем у меня есть модели лекторов и лекторов, а также коллекция лекторов:
window.Lecturers = Backbone.Model.extend({
urlRoot:"../api/lecturers", initialize:function () { this.lecturers = new lecturersCollection(); this.lecturers.url = '../api/modules/' + this.id + '/lecturers'; }
});
window.lecturersCollection = Backbone.Collection.extend({
model:Lecturers, url:"../api/lecturers",
});
//новый
window.Lecturer = Backbone.Model.extend({
urlRoot:"../api/lecturer",
});
и представление лектора, указывающее на html-шаблон «детали лектора», который не отображается:
window.LecturerView = Backbone.View.extend({
initialize:function () { this.template = _.template(tpl.get('lecturer-details')); }, render:function (eventName) { $(this.el).html(this.template(this.model.toJSON())); return this; }
});
Элемент списка лекторов, при нажатии на который должен отображаться подробный вид, содержит ссылку: href='#modules/‹%= moduleNo %>/#lecturers/‹%= staffNumber %>'
Хотя URL-адрес кажется правильным в браузере (... jquerymobile/#modules/999003/#lecturers/123001), страница сведений о лекторе просто не отображается.
Я уже пару дней ломаю голову над этим - если кто-нибудь заметит что-то не на месте, буду очень признателен!