Мы сделали первую страницу, на которой выводится пять самых свежих заголовка новостей. Сформулируем новую задачу: на главной странице заголовки новостей необходимо сделать ссылками, при нажатии на которые открывается страница с полным текстом новости. Задача предполагает создание второго метода, который будет отображать выбранную новость в виде заголовка, даты публикации и полного текста.
До сих пор мы работали с методом "index", прикрепленного непосредственно к проекту. Теперь нам необходимо создать второй метод. Перед тем, как это сделать, сделаем небольшое теоретическое отступление.
Метод в XS2 можно прикреплять к трем различным сущностям: непосредственно к проекту (именно так мы поступили с "index"), к любому из модулей, к любому из типов в модуле. В нашем случае помимо самого проекта, мы можем прикрепить новый метод к модулю "news" или к типу "news_post". От чего зависит выбор варианта размещения, и на что он влияет? Зависит он от желания разработчика логически отделить одну группу методов от другой. Логично, если метод главной страницы сайта прикрепляется непосредственно к проекту, а метод, выводящий, например, новость, к объекту "Новость". Общий критерий выбора варианта размещения метода можно сформулировать так: метод лучше прикреплять к той сущности, вывод подсущностей которой является основной задачей данного метода. Говоря проще, если основной задачей метода является вывод последних новостей, свежих статей, последних сообщений из блога, информации о проекте, то есть узлов из совершенно разных модулей, то этот метод лучше прикрепить к проекту, поскольку именно проект является той сущностью, для которой все выводимые узлы являются подсущностями. Если же необходимо вывести текст одной новости, то единственной сущностью, для которой конкретный узел-новость является подсущностью, это тип "Новость". От того, к какой сущности прикреплен метод, зависит URL, по которому его можно вызвать в браузере.
Если метод прикреплен непосредственно к проекту, то его URL имеет вид http://имя домена/имя метода/
Если метод прикреплен к модулю, то его URL имеет вид http://имя домена/имя модуля/имя метода
Если метод прикреплен к типу, то его URL имеет вид http://имя домена/имя модуля/имя типа/имя метода/
Итак, приняв во внимание теоретические соображения, мы прикрепим новый метод для вывода страницы с текстом новости к типу "Новость". Назовем наш метод "show", поскольку он показывает узлы того типа, к которому он прикреплен. Название метода совершенно ни на что не влияет: разработчик волен выбирать удобные для него и для пользователя названия. Единственное требования к ним - соответствие стандарту на системные названия XS2.
Для добавления метода к типу "Новость", щелкните правой кнопкой мыши на пункте "Новостное сообщение" в дереве проектов. В появившемся контекстном меню выберите действие "Методы". Дальнейшие действия абсолютно аналогичны тем, что мы выполняли при добавлении метода "index".
Теперь напишем код метода:
Этот код практически полностью повторяет Листинг 2, за исключением строки №6, где вместо жесткого указания идентификатора узла, мы подставили значение из переменной $_THE.PARAMS[0]. Снова немного теории.
Наш метод отображает одну конкретную новость. Возникает попрос: а как указать методу, какую именно новость от должен вывести? Для этого мы воспользуемся передачей параметров в URL метода. Те, кто знаком с веб-разработкой, наверняка вспомнят о передаче параметров в URL после знака "?". Безусловно, можно воспользоваться этим удобным способом передачи параметров. Однако XS2 предлагает и другой, альтернативный, способ. Дело в том, что адрес страницы типа http://example.com/show.php?a=1&b=3&c=4 выглядит не очень привлекательно не только для человека, но и для поисковых систем. В XS2 параметры можно передавать в конце URL, разделяя их точкой; после последнего параметра обязательно ставить ".htm". За счет этого URL выглядит гораздо лучше (http://example.com/news/1.3.4.htm). Параметры, переданные таким образом, доступны в шаблоне метода в переменной $_THE.PARAMS (в PHP это находящийся в глобальной видмости массив $_THE['PARAMS']). Эта переменная является массивом, в котором все переданные параметры нумеруются от 0.
В нашем методе мы предполагаем, что идентификатор узла-новости, который нужно вывести, передается первым параметром в URL: например, http://домен/news/news_post/show/2.htm. Важно понимать, что разработчик сам придумывает, какие параметры передавать и в каком порядке - XS2 лишь предоставляет удобную возможность их передачи непосредственно в URL.
Итак, метод показа новости готов, осталось изменить метод главной страницы так, чтобы заголовки статей стали ссылками на этот метод.
Мы добавили ссылку на метод show, прикрепленный к типу "Новостное сообщение", с передачей идентификатора новости через первый параметр. Теперь можно проверить, как все это работает.