Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
NovoselovDRUPAL_FINAL_DRAFT.docx
Скачиваний:
8
Добавлен:
01.04.2015
Размер:
396.56 Кб
Скачать

Глава 3. Модули расширения дляCmsDrupal Задачи

Целью изучение принципа расширения системы и решение актуальных проблем Drupal. Было выделено 2 основных проблемы. Первая проблема это невозможность массовой загрузки данных, а именно невозможность массового добавления для модуля цитат. Второй проблем было невозможность удобной работы с изображениями вDrupal. Эта проблема не только не решается стандартными модулями, но и не имеет решения дополнительными пакетами взаимосвязанных модулей.

Модуль цитат

Цитаты актуальны для практически любого сайта, в частности динамического. Он придает красоту и, зачастую, завлекает пользователей, заставляя их задуматься. А непосредственно модуль создает универсальность вывода цитат для любого сайта. Не потребуется модифицировать код работающего сайта, достаточно лишь добавить поставить модуль и выбрать место на сайте, где будет выводиться цитата.

Все что требуется от модуля это:

Добавление, изменение и удаление цитат

Просмотр всех цитат

Выводить случайную цитату из списка в нужной части сайта

Естественно этот простой, но в то же время удобный и полезный модуль уже был разработан задолго до того, как я начал изучать drupal. Это модульQuotesи с тех самых пор практически не менялся, лишь мигрировал в более новые версии. И хоть он и соответствует всем требованиям, но автор этого модуля не позаботился об удобстве администрирования.С точки зрения пользователей все исправно и удобно. При каждом обновлении страницы появляется новая цитата. И разнообразие зависит лишь от их количества. Но если рассмотрим со стороны администратора. Создается новый тип материала “цитата”. И для добавления каждой цитаты приходиться каждый раз создавать новый экземпляр “цитат”. Это вполне удобно, если требуется добавить несколько цитат. А если требуется добавить 100, 1000 или 10000 цитат? С точки зрения крупного сайта и списка цитат это не очень большие числа, но для их добавления придется тысячи раз создавать новую цитату, каждый раз по одной. Это становится непосильным рутинным трудом, и затрачивает огромного количества времени и сил со стороны администратора.

Создавая модуль цитат, было стремление, не потеряв того функционала который требуется, добавить массовое добавление цитат, то есть считывания цитат с файла и запись в базу данных, облегчая работу администратора.

Рассмотрим поэтапно создание модулей на Drupalе и именно моего модуля.

Любой модуль Drupal помещается внутри сайта в каталоге modules(илиsites/all/modules) и имеет как минимум два файла.

Один из них файлс названием модуля и расширением .info, в моем модуле это файл с именемquote.info, который является информационным файлом. Он содержит информацию о названии модуля, описание, версию, для которой был разработан, и другую необязательную информацию, например, цифровую подпись от разработчика. В своем модуле я ограничился обязательным минимумом.

Второй обязательный файл с названием модуля и расширением .module, то естьquote.module. Файл, в котором лежит основной программный код модуля. Также необязательный, но довольный часто используемый файлcрасширением .install. Это файл, содержащий набор функций, срабатывающих при первой установке или удалении модуля. В моем модуле возникла такая необходимость для создания таблицы для цитат. Я программно создаю таблицу “quotes” с тремя полями: номером, текстом и автором цитаты. Также для удобства администратора я заполняю таблицу данными несколькими записями цитат. Также при включении модуля Drupal самостоятельно добавляет записи в базу данных о включении модуля. Это позволяетDrupalорганизовать работу модулей, он просматривает в таблице все модули, проверяет включенные и обрабатывает функции необходимых модулей. Более подробно рассмотрим файлquote.module. ВDrupalлюбой файл .moduleначинается с открывающегосяphp-тэга “<?php” и, важно отметить, не имеет закрывающегося тэга “?>” в отличии от обычного пхп-кода, он сам по окончанию вызова функций модуля закрывает этот тэг.

Одной из первых проблем стало добавление его страниц в пункты меню, то есть создать урл-ссылки. В связи с тем, что мой модуль это не набор функций, которые могут вызывать другие работающие модули. Он должен настраивать, отображать список цитат и иметь возможность администрирования(добавление, удаление/редактирование цитат). Для этого используя стандартный хук Drupalа “quote_menu” были добавлены соответствующие страницы с переотправлением на будущие формы и функции обработки команд. В Drupal имеется 3 стандартных вида ссылок, дополнительные ссылки пользователь может создавать вручную или используя готовые модули. Это навигация, главные и второстепенные ссылки, которые в зависимости от разных тем оформления выглядят по-разному и располагаются в разных областях страницы сайта. Как правило, используется навигация и я выбрал именно её и при создании своих урл указывал в хукеmenuу элементов типmenu_normal_item, этот тип ставится по умолчанию, если нечего не указано.

Далее модуль должен отображаться в определенной области страницы сайта. Для этого я использовал стандартный хук “quote_block”, который добавляет блок на страницу блоков. Где администратор, наделенный определенными правами, может настраивать блоки: месторасположение в любой доступной темой оформления области сайта, задавать имя блока и определять специфические настройки, например, видимость блока определенным группам пользователей или на определенных страницах сайта. Создавая свой блокquoteя передавал только его название для события “list”,то есть отображения на страницах настроек. Для события “view” -отображения своего нового блока в выбранной части сайта я написал несколько функций для отображения случайной цитаты. Для этого, во-первых требовалось количество цитат в базе данных из таблицы “quotes”, созданной при первом включении моего модуля хукомinstall, который располагается в файлеquote_install. Далее для удобства поиска случайного числа я организовал структуры своей таблицы такие образом, что количество записей в таблице соответствует максимальному номеру элементов поляid. В связи с тем, что в Drupal при создании в таблицах стоит автоинкримент, то есть при создании новой записи её номер присваивается автоматически. Это крайне неудобно. Во-первых это не позволяет при создании своего модуля контролировать номер новой созданной записи, во-вторых при частом добавлении и удалении записей быстро может произойти переполнение и на месте удаленных записей создается большое количество свободного, незанятого места. В модуле это вызывает трудности в связи с тем, что разница максимального элемента и количества приводит к тому, что требуется искать не случайное число, а производить равномерное измерение случайных величин для каждой из цитат, либо пронумеровать цитаты и поставить случайное число “новому” номеру цитаты. Для решения этой проблемы был отключен автоинкримент и контролировал все добавления и удаления цитат. Я организовал такую систему, при добавлении новой цитаты, находим количество записей в таблице, то есть, находим максимум, и номеру новой цитаты присваиваем число на единицу большее. Это позволяет избежать пустых неиспользуемых номеров и соответствует схеме “максимум = количество”. А при удалении цитаты фактически не удаляется текущая запись, а заменяется последней и удаляется последняя. Для этого находим номер максимальной записи и производим следующие действия: с помощьюsql– запросаupdate, заменяем данные автора и текста цитаты текущей записи последней иsql– запросомdeleteудаляем последнюю строку. Тем самым я оставляю схему без изменений. Именно этот способ, не нарушает схемы за наименьшей количество действий, можно было использовать сдвиг цитат, но при количестве цитат тысячи и десятки тысяч это выходит накладно по времени, да и для данной таблице расположение цитат не имеют никакой важной роли, ведь они остаются равновероятностными при выборе случайного числа. Также, следует отметить, отображается цитата в нужной части сайта и выводится в соответствии со стилямиccs, то есть при отображении цитаты я подключаю свою таблицу стилейcss, лежащую в каталоге модуля. Это во первых позволяет отображать цитату необычным текстов, также для универсальности отображения. При желании администратор сайта, имеет возможность изменить стиль отображения цитаты не модифицируя строки кода самого модуля, ему достаточно внести изменения в файлеcss. Добавив к функциям добавления и удаления средствами Drupal форм, была решена следующая проблема модуля – работа с данными. Drupal, являющийся полноправнымCMF, позволяет без больших усилий создавать и настраивать формы и её элементы. Также добавлены функции редактирования выбранной цитаты, используя ту же форму, что и при добавлении. Чтобы отличить формы посылаются данные при редактировании. То есть Drupal при создании формы проверяет, пришли ли необходимые данные. Если нечего не пришло, то Drupal создает форму добавления цитаты. Если входными данными пришла цитата он заполняет поле, которое отображается, но пользователь не в праве его менять. Тем самым выбранная цитата при редактировании никак не влияет на другие, даже при попытках пользователя ввести неправильные данные. Также не маловажно, что при отправлении данных на форму, отправляется не только номер цитаты, а, использовав хукload, посылается, набор данных в форму, то есть номер, текст цитаты и имя автора.

Проблемой также стало отображение данных, то есть отображение списка всех цитат. Проблемой большей частью в выборе подходящего решения, в Drupal любая задача решается более чем двумя способами. Для отображение всех данных с помощью sqlполучаем список всех цитат и для отображения вместо стандартного склеивания или конкатенации строк данных выбраны функции темизации, а именноtableиpager. В функцию таблицы(table) посылаемheader, шапку таблицы, с наименование полей моей таблицы, то есть массив данных array('Текст', 'Автор', 'Действия'). Важно отметить, что не отображается номер цитаты, в связи с тем, что номер не несет никакой полезной информации при просмотре цитат. Также в таблице должны отображаться не только данные о цитате, но и возможность мгновенного изменения или удаления увиденной цитаты, то есть отображаю ссылки на удаление и изменения цитаты, где входными данными будет номер цитаты. Поскольку цитат может быть большое количество, более тысячи, в связи с этим создаем таблицу лишь на ограниченный промежуток значений, то есть отображается лишь 5 рядом стоящих цитат. Это позволяет, заведомо не зная размеров таблицы, отображать все возможные данные. Для этогоDrupalпри вызовеsqlзапроса указываем количество записей на вызов, аналогlimit. А далее сам Drupal средствами выбранной темы отображает данные и страницы для перехода между цитатами.

Также, следуя правилами Drupal, с помощью хукаhelpсоздаем страницу с помощью по модулю. Модуль сделан исключительно для удобства и как можно понятнее и проще для использования со стороны администрации сайта.

Следующей немаловажной проблемой стало ограничение доступа к уже готовому работающему модулю. Во-первых, это позволит администрацией сайта назначить выбранным группам пользователей права для управления цитатами, тем самым дать им возможность добавление и изменения. А с другой стороны защитить модуль от попыток несанкционированного доступа к цитатам. Для этого с помощью стандартного хука perm, от английского словаpermission, то есть доступ, создается новый тип прав для данного сайта с названиемquoteaccessи для созданных урл-ссылок для работы с цитатами указываем это право как обязательное при вызове функций. Далее администрация сама средствамиDrupalназначает группы пользователей кому она разрешает на использование этого модуля. То есть мало того, у пользователей не имеющих на это право не отображается в пункте меню урл-ссылка, но и помимо этого при попытках, заведомо зная урл-ссылку, пользователи увидят надпись, что у них не достаточно разрешений на просмотр этой страницы. Такая политика прав доступа позволяет сайтам на Drupal иметь разнообразную структуры групп пользователей, то есть в отличии от многих другихCMS, где уклон делается на группы пользователи, администраторы и, например, модераторы – промежуточная группа прав, в Drupal позволяет создавать перекрестные права доступа к тем или иным частям сайта. И это только стандартные средствами без дополнительных модулей, а с дополнительным расширением, например, разграничить права по ролям, то есть группам пользователей, или даже каждому пользователю назначать уникальный набор прав. Использовав стандартный метод прав, и при каждом вызове функций модуля, Drupal проверяет наличие прав на определенную страницу. Реши этим проблемы, я лишь достиг того функционала, который уже имеется в модулеquotes. Но задача состояла в расширении и появилась новая проблема эта массовая записьданных в таблицу. Для этого перебираем все возможные варианты расширений текстовых файлов. И остановаемся наcsvфайлах. В первую очередь это текстовые файлы и для того, чтобы администратор смог без дополнительных специальных программ открыть и посмотреть список цитат и авторов к ним. С другой стороны использование обычного текстового файла затрудняет считывание строк файла. То есть при считывании преимуществоcsvфайлов в отделении записей в каждой строке определенным специальным символом. В роли этого символа использовуем ‘;’ именно этот знак в цитатах практически не встречается. И знание определенного знака дает преимущество при прочтении этого файла, как программно, так зрительно. Также следует отметить, что вDrupal, развитойCMF, имеются специальные функции для работы именно сcsvфайлами.

Организовываем считывание и запись в несколько разделенных этапов и для начала создал средствами хук menu, такой пункт как “Добавление из файла”. Для этого пункта вызывается собственная форма Drupal с возможностью выбора файла с дискового пространства пользователя, средствами диалогого окна. Также форма содержит такой элемент, какsubmit, то есть обработчик. Этот обработчик необходим, для работы с выбранным файлом. Далее создаем для формы средствами хуковform_validateили проверка формы (валидация). В этом хуке проверяем файла, то есть его расширение на соответствие сcsv, и временно загружаем этот файл в папку на сервер Drupal. Если никаких проблем не возникло, тоvalidateпередает вобработчик выбранный файл. Обработчикform_submitпринимает состояние формы, то есть необходимое имя файла и успешность проверка валидации. Если валидация успешно завершена обработчик принимается за работу с файлом. Для начала, следуя схеме таблицы “количество = максимум”,sql– запросами получаем максимум записей. Также создаем переменную с количеством прочитанных строк. Пока нечего не считывали, следовательно, приравниваем её к нулю. Далее открываем исходный файл для чтения, средствами Drupal. Далее считываем построчно файл, разбивая его на части, разделенными специальными символом, в нашем случае этот символ ‘;’ и увеличиваем на единицу число прочитанных строк. Тем самым отделяется текст цитаты от имена автора, и запоминаем число считанных строк. Каждую считанную строку сразу записываем в таблицу. Номером записи будет являться число равно сумме максимума строк в таблице до записи и числу прочитанных строк. Также, следует отметить, наличие в цитате автора необязательно, то есть при чтении файла, проверяем каждый раз в строке имеется ли автор, если отсутствует то имя автора по умолчанию меняем на “неизвестный”. Считав и записав все строки в таблицу выводим пользователю информацию о количестве записанных строк с помощью стандартной функцииdrupal_set_message, которая отображает только в момент, определенного события, то есть при обновлении страницы, сообщение уже не будет отображаться. Далее очищаем память, то есть закрываем файл, удаляем информацию о файле с формы и удаляем файл с сервера.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]