Мой первый в жизни модуль для Друпал.

Главные вкладки

Аватар пользователя Alex_R Alex_R 28 мая 2010 в 18:59

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

Этот модуль позволяет создавать связи между документами по взаимному согласию авторов документов и эти связи видны всем пользователям сайта.
В настройках модуля нужно указать для каких типов материалов возможно установить связь, а так же можно изменить заголовок раздела ссылок.
После настроек модуля зарегистрированные пользователи в чужих документах после контента видят "номер для связи с данным документом", а в своих документах помимо этого окно ввода такого номера для установления связи.
После этого автор документа с которым осуществлена попытка наладить связь в своем документе видит запрос на установление связи и имеет выбор "разрешить" или "запретить". Так же есть возможность запретить уже установленную связь (любой из сторон), а так же разрешить запрещенную Вами ранее связь. Повторные запросы на установление связей запрещены.
При входе пользователя на сайт, если у него есть ссылки ожидающие его подтверждение, ему показывается сообщение об этом, с предложением перейти на страницу со списком таких документов. Решение о установлении связей может принимать не только автор, а любой человек имеющий право редактировать данный документ, но уведомления при входе на сайт получает только автор.

Поскольку для меня это не только первый опыт написания модуля для Друпал, но и практически первый опыт использования таких инструментов как PHP и SQL, то буду очень благодарен за конструктивную критику кода.
Из "неправильностей", которые знаю сам - это практически не использую функцию Т(), но мой английский не позволяет делать это на лету, и мне проще будет потом, когда я посчитаю, что модуль скорее всего больше не будет изменяться, разом сеть со словарем и перевести все строки.

На всякий случай расскажу структуру используемой таблицы. NID1 - номер документа предлагающий связь, NID2 - номер документа, с которым пытаются установить связь, status - состояние связи (0 - ожидается, 1 - разрешена, 2 - запрещена), Uid2 - пользователь документа от которого ожидается решение (актуально только при status==0 , в остальных случаях заполняется uid пользователя внесшего последнее изменение в запись.), Created - (не правильно назвал) время, но не создания, а последней модификации записи - пока не используется.

Вообщем, очень надеюсь что кто нибудь выскажет критические замечания по коду. Заранее Спасибо!

Актуальная ссылка для скачивания в последнем моем ответе в этой теме.

Комментарии

Аватар пользователя graker graker 28 мая 2010 в 22:45

А можно привести пример, зачем это нужно? Интересуюсь из любопытства, без попытки подколоть или что-то такое.

Аватар пользователя Alex_R Alex_R 28 мая 2010 в 23:47

graker wrote:
А можно привести пример, зачем это нужно? Интересуюсь из любопытства, без попытки подколоть или что-то такое.

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

Аватар пользователя lugann lugann 29 мая 2010 в 0:40

Интересный модуль. Мне допустим такое понадобится для сайта по музыке (на очень взыскательного любителя). Разные пользователи будут ссылаться на размещенные клипы . Грубо - плеер, а под ним дополнительные ссылки. Все это можно конечно сделать через поля но кто это будет каждый раз лезть редактировать.
Еще полезно то, что допустим - есть пользовательская группа и записи в группе, много записей (через тоже самописный модуль partners) и в основной группе можно разместить ссылки на некоторые (допустим лучшие) записи в самой группе.

По модулю - все же постоянно выдает ошибки какой-то конфликт с меню, ваш ulink view ведет на белую страницу.
Дополнительно - надобность информации о владельце материала после ссылки - не совсем очевидна,
кнопка "запретить" как-то усташающе выглядит, лучше бы встроить в ту же строчку, просто ссылкой.

Но модуль полезный, сделайте обязательно.

смотрел на локалхосте под 6.16

Аватар пользователя Alex_R Alex_R 10 ноября 2015 в 11:46

lugann wrote:
По модулю - все же постоянно выдает ошибки какой-то конфликт с меню ,

Если можно подробнее, у меня на двух тестовых сайтах (один голая установка, другой с кучей других модулей) никаких ошибок не выдает.

lugann wrote:
ваш ulink view ведет на белую страницу.

Досадная опечатка в названии функции - исправил. Может и верхняя проблема исчезнет, странно, что у меня ошибок не выдавало. Кстати, думаю вообще этот пункт из меню убрать, а вот напоминание выдавать не только при входе на сайт, а на каждой странице.

lugann wrote:

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

Да, уже подумываю серьезно увеличить настройки модуля и сделать все это настраиваемым, так как кому то нужна только ссылка, а кому то полный информация с тизером. Мне, например, указание автора обязательно, так как вероятность того, что два фотографа посетив одно мероприятие одинаково назовут свои отчеты названием этого мероприятия весьма велика. По поводу сделать вместо кнопки ссылку - не совсем пока понимаю как, скорее всего в итоговой версии будут маленькие аккуратные imagebutton в строчку после ссылки.

lugann wrote:

Но модуль полезный, сделайте обязательно.

Ну раз начал, то доведу до ума. Спасибо!

Аватар пользователя lugann lugann 29 мая 2010 в 1:33

да, еще по ролям - было бы интересно проставлять ссылки/связи автоматом (без согласия) для определенных ролей

Аватар пользователя Alex_R Alex_R 29 мая 2010 в 21:22

lugann wrote:
да, еще по ролям - было бы интересно проставлять ссылки/связи автоматом (без согласия) для определенных ролей

Над этим подумаю, хотя в моем варианте это не требуется. ИМХО Хозяин Барин.

Аватар пользователя lugann lugann 30 мая 2010 в 10:44

Alex_R wrote:

Над этим подумаю, хотя в моем варианте это не требуется. ИМХО Хозяин Барин.

Вот из этой темы http://www.drupal.ru/node/45252 я понял так, что (в вашем варианте) автор общего отчета в большинстве случаев
может быть инициатором установления связей между документами. Разграничить "организаторов" (условно) и "конкурсантов" по ролям - это логично.
В иных случаях это могут быть "преподаватели" и "студенты", "администраторы" и "публикаторы", т.е. модули под Drupal прекрасны в своей гибкости настройки под разные задачи.

Аватар пользователя Dan Dan 29 мая 2010 в 11:20

"lugann" wrote:
Мне допустим такое понадобится для сайта по музыке

Присмотритесь к модулю Flag - возможно он пригодиться.

Alex_R, а не перекликается ли функционал твоего модуля с ОГ? Прочитав http://www.drupal.ru/node/45252, мне показалось, что ОГ - самое верное решение. Мероприятие - группа, отчёты - материалы в ней. "Хозяин" группы может помещать отчёты сразу, а остальные - делать заявки. Как думаешь? (хотя модуль обработки заявки надо писать по-любому)

Вообще подобный модуль нужен. User Relationships - отличный, но ограничен пользователями. Я был бы рад, если кто-нить взялся за подобный модуль для нод.
На данный мемент на д.орг такой подбор модулей для node2node связей:
http://drupal.org/project/node2node -- различные виды связей. Депубликован из-за проблем с безопасностью
http://drupal.org/project/drupal_universal_relation_api - мёртвый, удалён с орг, т.к. не написано ни одной строчки кода для него Smile
http://drupal.org/project/noderelationships -- работает на уровне типов материалов
http://drupal.org/project/collection -- коллекции нод
http://drupal.org/project/relativity -- устаревший, node_reference круче
http://drupal.org/project/multilink -- связи на основе языка (для перевода)
http://drupal.org/project/relations -- на базе RDF
и другие (надоело писать): Node relevance, Create related content, Node Relativity Access Control.

Аватар пользователя Alex_R Alex_R 29 мая 2010 в 21:08

Dan wrote:

На данный мемент на д.орг такой подбор модулей для node2node связей:
http://drupal.org/project/node2node -- различные виды связей. Депубликован из-за проблем с безопасностью
http://drupal.org/project/drupal_universal_relation_api - мёртвый, удалён с орг, т.к. не написано ни одной строчки кода для него Smile
http://drupal.org/project/noderelationships -- работает на уровне типов материалов
http://drupal.org/project/collection -- коллекции нод
http://drupal.org/project/relativity -- устаревший, node_reference круче
http://drupal.org/project/multilink -- связи на основе языка (для перевода)
http://drupal.org/project/relations -- на базе RDF
и другие (надоело писать): Node relevance, Create related content, Node Relativity Access Control.

Если бы я увидел этот пост в то время когда открывал ту тему, где спрашивал вопроса как это сделать, то возможно до сих пор бы изучал возможности данных модулей и пытался бы их настроить, возможно безуспешно. В настоящее время я спрашиваю какие в моем коде есть ошибки, не в плане логики (если модуль работает, то их нет) а в плане того, что то и то можно сделать проще, а вот тут дыра в безопасности. Честно, я php вижу практически в первый раз в жизни, и уверен, что мой код абсолютно несовершенен (и хотел бы именно на эту тему увидеть коммены в этой теме), однако при этом я вижу, что сделать модуль нужного мне функционала мне намного легче, чем собрать этот функционал из модулей, которые представлены на drupal.org, поскольку мой английский не позволяет мне это сделать.
p.s убедительно прошу не разводить тут полемики, что английский является языком IT так же как Латынь является языком врачей. Латынь мертвый язык и этим все сказано.

Аватар пользователя Shift-Web Shift-Web 29 мая 2010 в 17:34

"Dan" wrote:
Присмотритесь к модулю  Flag - возможно он пригодиться.
Alex_R, а не перекликается ли функционал твоего модуля с ОГ? Прочитав http://www.drupal.ru/node/45252, мне показалось, что ОГ - самое верное решение. Мероприятие - группа, отчёты - материалы в ней. "Хозяин" группы может помещать отчёты сразу, а остальные - делать заявки. Как думаешь? (хотя модуль обработки заявки надо писать по-любому)
Вообще подобный модуль нужен. User Relationships - отличный, но ограничен пользователями. Я был бы рад, если кто-нить взялся за подобный модуль для нод.
На данный мемент на д.орг такой подбор модулей для node2node связей:
http://drupal.org/project/node2node -- различные виды связей. Депубликован из-за проблем с безопасностью
http://drupal.org/project/drupal_universal_relation_api - мёртвый, удалён с орг, т.к. не написано ни одной строчки кода для него Smile
http://drupal.org/project/noderelationships -- работает на уровне типов материалов
http://drupal.org/project/collection -- коллекции нод
http://drupal.org/project/relativity -- устаревший, node_reference круче
http://drupal.org/project/multilink -- связи на основе языка (для перевода)
http://drupal.org/project/relations -- на базе RDF
и другие (надоело писать):  Node relevance,  Create related content,  Node Relativity Access Control.

Оооо .. Ништяк.

Alex_R, круто Smile Полезная штука

Аватар пользователя lugann lugann 29 мая 2010 в 17:59

кстати, на drupal.ru как-то слабо отслеживаются/фиксируются оригинальные разработки . точнее - вообще никак .
интересно - каким бы был drupal.org при таком подходе (риторич.

Аватар пользователя Alex_R Alex_R 29 мая 2010 в 20:43

lugann wrote:
кстати, на drupal.ru как-то слабо отслеживаются/фиксируются оригинальные разработки . точнее - вообще никак .
интересно - каким бы был drupal.org при таком подходе (риторич.

Да мне вообще подход русскоязычных специалистов по IT весьма интересен и непонятен.
Я в некотором объеме знаю и франзцузский и итальянский и заметил такую закономерность, что если человек там задает любой вопрос на интересующую его тему, то если ответ лежит в англоязычной части инета, то публикующий ответ несколько раз извинится, что у него нет времени перевести данный ответ прежде чем дать ссылку (и иногда это заканчивается тем, что модератор сайта удаляет(или оставляет) ссылку и выкладывает перевод), у нас же drupal.org это все... :(.

Аватар пользователя graker graker 29 мая 2010 в 23:34

Посмотрел немного код, но в глубины не вникал.

На мой взгляд, без t(), с конструкциями типа 'access callback' => TRUE, и последующей проверкой на не-анонимов уже внутри коллбэков меню (вместо нормальных, drupal-way, разрешений в hook_perm()), с голыми выводами вместо темизаций, модуль не особенно ре-юзабельный.

А вообще, если хотите, чтобы люди всерьез смотрели код, большая просьба: отформатируйте его нормально хотя бы в смысле отступов. В коде функции не должно быть ничего (даже комментариев), начинающегося с таким же отступом, как объявляющая эту функцию строчка "function ...". Иначе невозможно понять, где что начинается, где заканчивается и т.д. Особенно касается функций длиной в несколько "страниц" (ulink_entry_form). А еще в написании кода, оформленного по соглашениям drupal, поможет модуль Coder.

Насчет форм, небольшой совет: если используете fieldset-ы, старайтесь явно указывать свойство #tree. Желательно всегда делать его = TRUE, если нет веских причин делать иначе. Так вы всегда будете уверены, что содержимое филдсетов сохранит иерархию в $form_state['values'] древовидным. Это не правило, просто по личному опыту.

Еще вам в этой теме посоветовали, если $node уже загружен, не использовать user_load($node->uid) в theme_username, а делать сразу так:
theme('username', $node);

Ну и три фразы по мелочи:
Нет документов ожидающих подтверждения! - после "документов" - запятая.
Документы ожидающие подтверждения - аналогично.
В Ваших документах есть ссылки ожидающие Вашего подтверждения. "Ваших" один раз (первый) достаточно (и можно с маленькой). Ну и запятая тоже.
Оно, конечно в переводе, а не в коде должно быть, но все же, на всякий случай, сообщаю.

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

P.S. Вообще, лучший способ пропустить модуль для Drupal через критиков - запостить его в очередь запросов на доступ к CVS с последующим выкладыванием на D.org. Эту очередь просматривают люди, которые, как говорится, по долгу службы укажут на ошибки и посоветуют более удачные решения. Правда, в данном случае, насколько я понимаю, автора не сильно интересует выкладывание модуля.

Аватар пользователя Alex_R Alex_R 30 мая 2010 в 0:05

graker wrote:
Посмотрел немного код, но в глубины не вникал.

На мой взгляд, без t(), с конструкциями типа 'access callback' => TRUE, и последующей проверкой на не-анонимов уже внутри коллбэков меню (вместо нормальных, drupal-way, разрешений в hook_perm()), с голыми выводами вместо темизаций, модуль не особенно ре-юзабельный.


Согласен, это черновик, постараюсь его довести до правил.
graker wrote:

А вообще, если хотите, чтобы люди всерьез смотрели код, большая просьба: отформатируйте его нормально хотя бы в смысле отступов. В коде функции не должно быть ничего (даже комментариев), начинающегося с таким же отступом, как объявляющая эту функцию строчка "function ...". Иначе невозможно понять, где что начинается, где заканчивается и т.д. Особенно касается функций длиной в несколько "страниц" (ulink_entry_form). А еще в написании кода, оформленного по соглашениям drupal, поможет модуль Coder.

принял к сведению, исправлюсь. см. выше.
graker wrote:

Насчет форм, небольшой совет: если используете fieldset-ы, старайтесь явно указывать свойство #tree. Желательно всегда делать его = TRUE, если нет веских причин делать иначе. Так вы всегда будете уверены, что содержимое филдсетов сохранит иерархию в $form_state['values'] древовидным. Это не правило, просто по личному опыту.

Принял к сведению. Спасибо!

graker wrote:

Еще вам в этой теме посоветовали, если $node уже загружен, не использовать user_load($node->uid) в theme_username, а делать сразу так:
theme('username', $node);

Спасибо! исправлю. в той теме это не очень явно звучало и меня самого очень удивило.

graker wrote:

Ну и три фразы по мелочи:
Нет документов ожидающих подтверждения! - после "документов" - запятая.
Документы ожидающие подтверждения - аналогично.
В Ваших документах есть ссылки ожидающие Вашего подтверждения. "Ваших" один раз (первый) достаточно (и можно с маленькой). Ну и запятая тоже.
Оно, конечно в переводе, а не в коде должно быть, но все же, на всякий случай, сообщаю.

учту. спасибо!

graker wrote:

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

Несогласен, во многих странах программисты и причем не самые плохие не знают данного языка и он им не нужен. Вот когда английский станет как Латынь мертвым языком (во что я не верю) и его официально признают языком общения программистов, тогда буду его изучать.
graker wrote:
Правда, в данном случае, насколько я понимаю, автора не сильно интересует выкладывание модуля.

Да, выкладывание модуля на англоязычном ресурсе мне не то, чтобы не интересно, оно для меня бесполезно, поскольку тратить очень много времени на перевод комментов... не вижу смысла. Но русскоязычного аналога как я понимаю не предвидится, поэтому в этом направлении тоже буду думать.

Аватар пользователя graker graker 30 мая 2010 в 0:27

Alex_R wrote:
Несогласен, во многих странах программисты и причем не самые плохие не знают данного языка и он им не нужен. Вот когда английский станет как Латынь мертвым языком (во что я не верю) и его официально признают языком общения программистов, тогда буду его изучать.

Дело хозяйское, никто насильно не заставляет. Речь всего лишь о том, что от знания языка (хотя бы на уровне чтения технических текстов) польза огромна и очевидна, а от незнания языка пользы - ноль целых, хер десятых.

Quote:
Да, выкладывание модуля на англоязычном ресурсе мне не то, чтобы не интересно, оно для меня бесполезно, поскольку тратить очень много времени на перевод комментов... не вижу смысла.

Польза та, что я сказал - простой способ получить фидбэк по коду и логике модуля. Но это только если у вас возникнет желание работать drupal-way.

Аватар пользователя Alex_R Alex_R 30 мая 2010 в 1:05

graker wrote:
Дело хозяйское, никто насильно не заставляет. Речь всего лишь о том, что от знания языка (хотя бы на уровне чтения технических текстов) польза огромна и очевидна, а от незнания языка пользы - ноль целых, хер десятых.

С этим никто не спорит, но сажать "девочку", чтобы переводила на данный момент не имею возможностей, а самому изучать английский, когда для основной работы нужно изучать немецкий (что я тоже не хочу).... вообщем, я ситуацию понял и она меня не порадовала...

Аватар пользователя lugann lugann 30 мая 2010 в 12:41

В тему drupal.org, drupal.ru, модулей и прочего -

никто не спорит что drupal.org - корневой, нужно соответствовать стандартам, знание английского необходимо и т.д.
Но дело не в этом. На сайте drupal.ru просто не замечает оригинальных разработок, все растворяется в общем потоке
решений тех. вопросов. Нет отдельного раздела для таковых. Кроме того - мне встречаются на сайтах (отдельных) интересные
самописные модули, но здесь это никому не интересно, и информации нет. И все это взаимосвязано - нет интереса - нет подачи.
С другой стороны - программист/разработчик в первую очередь конечно же решает свою конкретную задачу, завтра ему понадобится
что-то изменить в своем же модуле - и это тоже останется никому неизвестным, и нет места (здесь) чтобы вместе над этим поработать/посмотреть, что-то подправить/изменить, посоветовать.
Как-то это все неправильно.

Аватар пользователя graker graker 30 мая 2010 в 13:56

lugann wrote:
На сайте drupal.ru просто не замечает оригинальных разработок, все растворяется в общем потоке решений тех. вопросов. Нет отдельного раздела для таковых. Кроме того - мне встречаются на сайтах (отдельных) интересные самописные модули, но здесь это никому не интересно, и информации нет.
...
Как-то это все неправильно.

На мой взгляд наоборот, это естественный порядок вещей. Если авторы закачивают модули на org, зачем плодить сущности, делать одну работу дважды и отслеживать проблемы еще и здесь?

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

Полезно продвигать разработки в RU-сообществе разве что когда автор не желает продвигать их в мейнстриме. Скажем, если модуль направлен сугубо на Рунет. Хотя Romka, например, свою авторизацию Вконтакте залил на D.org и все хорошо. Да и большинство оригинальных модулей, ссылки на которые авторы тут публиковали в последнее время, все равно появлялись на org.

А вообще по-моему у русскоязычного Друпала есть более насущные проблемы (e.g. в разы меньше документации, чем в англоязычной среде). Так что необходимость в инфраструктуре для продвижения оригинальных разработок вряд ли велика.

Аватар пользователя Dan Dan 30 мая 2010 в 12:59

"lugann" wrote:
но здесь это никому не интересно, и информации нет.

Потому и нет, что не интересно. Сам подумай, кому должно быть интересно? Авторам? У них хороший фидбэк на орг, пользователям? От них скорее будет больше головной боли чем пользы.
Уже делали багтрекер на этом сайте - никто его особо не юзал.

Аватар пользователя lugann lugann 30 мая 2010 в 13:59

Dan wrote:

Потому и нет, что не интересно. Сам подумай, кому должно быть интересно? Авторам? У них хороший фидбэк на орг, пользователям? От них скорее будет больше головной боли чем пользы.
Уже делали багтрекер на этом сайте - никто его особо не юзал.

Все гораздо проще на самом деле. Кто-то - автор, допустим - пришел сюда, в это сообщество .
Не на drupal.org (по разным причинам, не суть).
И так как здесь нет возможности продолжать работу над оригинальными проектами -
он будет продолжать это где угодно, но не здесь.
Это - в плюс сообществу? Думаю что - в минус.

Далее - если бы таковые разработки были бы на сайте отдельной строкой
в каком-нибудь специальном разделе - и помогали бы больше (первоначально, здесь,
при публикации первого варианта), и имели бы большую возможность помочь потом (в спец. разделе),
при этом получая доступ к последним версиям.
Понятно что даже по времени это будет в разы эффективнее.

Кроме того (еще раз) - в рунете встречаются оч. интересные разработки, но здесь это
тоже почему-то никому не интересно.
Вот допустим http://www.drupalka.ru/node/89
а теперь забейте в поиск nodebasket на drupal.ru или .org
Можно было бы здесь просто дать информацию о модуле, вне зависимости от того -
будет здесь автор работать над ним или нет . Но все взаимосвязано, повторюсь.
Нет интереса - нет подачи.

......

В общем - будет жаль если и этот модуль (Alex_R) уйдет в никуда, не получит поддержки,
не останется здесь как еще один положительный факт, результат нормальной естественной работы сообщества.