Как и обещал, выкладываю парочку своих модулей для Organic Groups. Модули можно назвать альфа-версиями, косяки в основном в строках перевода - я не обёртывал в t(), не до того пока
1. Ограничение числа групп для материала до одной штуки - og_single_group
2. Снятие подтверждений при вступлении в группу (кто это вообще придумал делать?) - og_disable_confirmations. По-моему, не тестировался на премодерационных и закрытых группах. Если у кого есть, где проверить - я буду рад, но работать должно.
Вложение | Размер |
---|---|
og_disable_confirmations.zip | 1.79 КБ |
og_single_group.zip | 1.56 КБ |
Комментарии
Хорошо, а то ограничение в группах через node_limit наверное не дождёмся...
ой, спасибо какое большое!!! ))
Неделькой раньше бы такое, я бы Dan`a не мучил бы в другой ветке
Еще вопрос про разное вкусное.
Нет ли решения для этого? Я криво смог только так.
Ну я пока тоже красиво не оформлял. Это на себя должна темизация брать, по идее. Вот кусок кода из моего helper-модуля, используется на http://rupor.sampo.ru/ :
<?php
/* Provide join link */
function rupor_subscribe_link($gid, $directory, $selective = NULL) {
global $user;
if (og_is_group_member($gid)) {
return l('<img src="' . $base . '/' . $directory . '/images/empty.gif" width="38" height="13" alt="Покинуть группу"/>', 'og/unsubscribe/'. $gid . '/' . $user->uid, array('attributes' => array('title' => 'Покинуть форум', 'class' => 'og-con og-leave', 'rel' => 'nofollow'), 'query' => drupal_get_destination(), 'html' => TRUE));
} else {
if (!isset($selective)) {
$node = node_load($gid);
$selective = $node->og_selective;
}
switch ($selective) {
case OG_MODERATED:
$txt = t('Request membership');
$class = 'og-join-moderated';
break;
case OG_OPEN:
$txt = t('Join');
$class = 'og-join-open';
break;
case OG_INVITE_ONLY:
$txt = t('Invite');
$class = 'og-join-invite';
break;
case OG_CLOSED:
$txt = t('Closed');
$class = 'og-join-closed';
break;
}
if (isset($txt)) {
if ($selective == OG_CLOSED) {
return "<p class=\"og-con og-join-closed\"><img src=\"$base/$directory/images/empty.gif\" width=\"38\" height=\"13\" alt=\"$txt\" title=\"$txt\"/></p>";
} else {
return l('<img src="' . $base . '/' . $directory . '/images/empty.gif" width="38" height="13" alt="' . $txt . '"/>', "og/subscribe/$gid", array('attributes' => array('rel' => 'nofollow', 'class' => ' og-con ' . $class, 'title' => $txt, 'rel' => 'nofollow'), 'query' => drupal_get_destination(), 'html' => TRUE));
}
}
}
}
?>
Модуль создал, а воткнуть на страницу его как не понимаю...
Вызвать там, где надо, эту функцию. Она отдаст код ссылки для присоединения. лучше способа я не придумал.
Например, из template.php и поместить в $vars
Спасибо еще раз
все отлично заработало!
Mr.Alinaki@drupal.org
Спустя праздники еще не смог кое-что. Может подскажешь?
сделал еще пару кнопок в группу для инвайтов и просмотра юзеров, но не могу добиться того, чтобы их мог видеть и использовать только админ группы или создатель
пробую так...
global $user;
if (og_is_group_admin($gid)) {
дальше по аналогии!
и в итоге ни админ ни создатель, никто не видит кнопки...
подскажите, пожалуйста. Может есть другой способ или этот не так реализовываю?!
help!
help2!
По идее всё верно -- http://drupalcontrib.org/api/function/og_is_group_admin/6 должна отдывать true на админа материалов или создателя группы. Поставь вывод в самой этой функции и посмотри где не проходит проверка.
ну вот пример мой
Хочу, чтобы список пользователей группы был доступен только админу группы
Создаю свой модуль
/* Provide group users link */
function group_user_link($gid, $directory, $selective = NULL) {
global $user;
if (og_is_group_admin($gid)) {
return l('юзеры', 'og/users/'. $gid);
} else {
if (!isset($selective)) {
$node = node_load($gid);
$selective = $node->og_selective;
}
switch ($selective) {
case OG_MODERATED:
$txt = t('Request membership');
$class = 'og-join-moderated';
break;
case OG_OPEN:
$txt = t('Join');
$class = 'og-join-open';
break;
case OG_INVITE_ONLY:
$txt = t('Invite');
$class = 'og-join-invite';
break;
case OG_CLOSED:
$txt = t('Closed');
$class = 'og-join-closed';
break;
}
if (isset($txt)) {
if ($selective == OG_CLOSED) {
return "<p class=\"og-con og-join-closed\"></p>";
} else {
return l('','');
}
}
}
}
?>
и вывожу
<?php print group_user_link($node->nid, $directory, $node->selective); ?>
<?php endif; ?>
с og_is_group_member показывает всем
с og_is_group_admin никому не показывает ссылку
Да я понял проблему. Отрассируй ф-цию og_is_group_admin и посмотри где не проходит проверка. Чего гадать-то.
ps: return l('',''); -- это за нахрен? return ''; К делу не относиться, но - кривость.
Dan, я к сожалению не знаю, как отрассировать? Можно мануал или пример этой проверки?
заранее спасибо
В ф-ции og_is_group_admin.
Например так (перед строчкой с return):
<?php
.........
print_r($account);
print_r(og_is_group_type($node->type));
print_r(user_access('administer nodes', $account));
print_r(empty($account->og_groups[$node->nid]['is_admin']));
return og_is_group_type($node->type) && (user_access('administer nodes', $account) || !empty($account->og_groups[$node->nid]['is_admin']));
?>
Наша задача - выяснить почему функция возвращает false вместо true.
в og.module делаю
if (is_null($account)) {
$account = $GLOBALS['user'];
}
print_r($account);
print_r(og_is_group_type($node->type));
print_r(user_access('administer nodes', $account));
print_r(empty($account->og_groups[$node->nid]['is_admin']));
return og_is_group_type($node->type) && (user_access('administer nodes', $account) || !empty($account->og_groups[$node->nid]['is_admin']));return og_is_group_type($node->type) && (user_access('administer nodes', $account) || !empty($account->og_groups[$node->nid]['is_admin']));
}
и на выходе
stdClass Object ( [uid] => 3 [name] => Петр [pass] => b59c67bf196a4758191e42f76670ceba [mail] => petr@example.com [mode] => 0 [sort] => 0 [threshold] => 0 [theme] => [signature] => [created] => 1225884638 [access] => 1263820972 [login] => 1263803950 [status] => 1 [timezone] => 10800 [language] => ru [picture] => sites/default/files/pictures/picture-3.jpg [init] => petr@example.com [data] => a:5:{s:13:"form_build_id";s:37:"form-bb77e30fc60eb0e1c1e48bb9f6ca7e2c";s:14:"picture_delete";s:0:"";s:14:"picture_upload";s:0:"";s:8:"og_email";s:1:"1";s:7:"contact";i:0;} [form_build_id] => form-bb77e30fc60eb0e1c1e48bb9f6ca7e2c [picture_delete] => [picture_upload] => [og_email] => 1 [contact] => 0 [roles] => Array ( [2] => authenticated user [3] => Продвинутые пользователи ) [profile_from] => Выборг пассажирский [profile_interest] => улицы города, география, таблицы Excel, 1/2 пирога [profile_icq] => 236901019 [profile_url] => http://test1.ru [og_groups] => Array ( [9] => Array ( [title] => группа3 [type] => group [status] => 1 [nid] => 9 [og_role] => 0 [is_active] => 1 [is_admin] => 1 [uid] => 3 [mail_type] => [created] => 1263803994 [changed] => 1263803994 ) ) [rank] => 1 [karma] => 0 ) 1stdClass Object ( [uid] => 3 [name] => Петр [pass] => b59c67bf196a4758191e42f76670ceba [mail] => petr@example.com [mode] => 0 [sort] => 0 [threshold] => 0 [theme] => [signature] => [created] => 1225884638 [access] => 1263820972 [login] => 1263803950 [status] => 1 [timezone] => 10800 [language] => ru [picture] => sites/default/files/pictures/picture-3.jpg [init] => petr@example.com [data] => a:5:{s:13:"form_build_id";s:37:"form-bb77e30fc60eb0e1c1e48bb9f6ca7e2c";s:14:"picture_delete";s:0:"";s:14:"picture_upload";s:0:"";s:8:"og_email";s:1:"1";s:7:"contact";i:0;} [form_build_id] => form-bb77e30fc60eb0e1c1e48bb9f6ca7e2c [picture_delete] => [picture_upload] => [og_email] => 1 [contact] => 0 [roles] => Array ( [2] => authenticated user [3] => Продвинутые пользователи ) [profile_from] => Выборг пассажирский [profile_interest] => улицы города, география, таблицы Excel, 1/2 пирога [profile_icq] => 236901019 [profile_url] => http://test1.ru [og_groups] => Array ( [9] => Array ( [title] => группа3 [type] => group [status] => 1 [nid] => 9 [og_role] => 0 [is_active] => 1 [is_admin] => 1 [uid] => 3 [mail_type] => [created] => 1263803994 [changed] => 1263803994 ) ) [rank] => 1 [karma] => 0 ) 1
Замени
print_r($account);
print_r(og_is_group_type($node->type));
print_r(user_access('administer nodes', $account));
print_r(empty($account->og_groups[$node->nid]['is_admin']));
на
var_dump(og_is_group_type($node->type));
var_dump(user_access('administer nodes', $account));
var_dump(empty($account->og_groups[$node->nid]['is_admin']));
что-то там только одна единичка...
получилось как-то так
bool(false) bool(true) bool(true)
Значит og_is_group_type() выдаёт false - это нода - не группа.
странно...
как же не группа?! (
Тип материала группа - Group node
Вывожу
<?php print group_user_link($node->nid, $directory, $node->selective); ?>
<?php endif; ?>
через content templates на странице шаблона node-og-group.tpl.php
где-то ошибаюсь?
А nid какой у этой группы?
не совсем понимаю, что такое nid? может это поможет?
http://test1.ru/node/9 (http://test1.ru/group/gruppa3)
Странно, что-то не сростается ничего. Судя по дампу учётной записи:
[9] => Array (
[is_admin] => 1
Всё должно быть ок. Не знаю что сказать. Доберусь до ОГ, попробую сделать сам. Пока времени нет ставить и возиться.
хорошо, спасибо! Буду ждать помощи/совета...
p.s. может есть другой способ организовать ссылку на пользователей группы для админа?
hey, Dan!
а в модуле
og_single_group
при выборе есть "личный блог" - это что за "группа" ?
Valeratal
это не группа, это просто запись, она в группу не попадает
спасибо
для og_is_group_admin надо передавать объект ноды, а не номер:
function group_user_link($node, $directory) {
global $user;
if (og_is_group_admin($node)) {
return l('юзеры', 'og/users/'. $node->nid);
} else {
$selective = $node->og_selective;
switch ($selective) {
case OG_MODERATED:
$txt = t('Request membership');
$class = 'og-join-moderated';
break;
case OG_OPEN:
$txt = t('Join');
$class = 'og-join-open';
break;
case OG_INVITE_ONLY:
$txt = t('Invite');
$class = 'og-join-invite';
break;
case OG_CLOSED:
$txt = t('Closed');
$class = 'og-join-closed';
break;
}
if (isset($txt)) {
if ($selective == OG_CLOSED) {
return "<p class=\"og-con og-join-closed\"></p>";
} else {
return l('','');
}
}
}
}
// Вызов:
if ($node->type == 'group')
return group_user_link($node, $directory);
проверяю, пробую...
Ура, Dan, спасибо!
Работает
Спасибо огромное за модуль - очень пригодился. Но столкнулся вот с такой особенностью.. Можно это как-то исправить?
Dan
Просьба выручить еще раз.
Пошел дальше и хочу, чтобы пользователь мог видеть строку "покинуть группу", а создатель группы не мог видеть такой строки.
Понимаю, что нужно колдовать с двумя условиями if (og_is_group_admin($node)) и (og_is_group_member($gid))
но как не пробую - не получается!
помогите пожалуйста. Заранее спасибо
if(og_is_group_member($node->nid) && !og_is_group_admin($node))
спасибо, попробую
p.s. попробовал - не работает.
Надпись показывается и тем и другим!
вот код (
/* Provide join link */
function group_subscribe_link($gid, $directory, $selective = NULL) {
global $user;
if(og_is_group_member($node->nid) && !og_is_group_admin($node)) {
return l('покинуть группу', 'og/unsubscribe/'. $gid . '/' . $user->uid, array('attributes' => array('title' => 'покинуть группу', 'class' => 'og-con og-leave', 'rel' => 'nofollow'), 'query' => drupal_get_destination(), 'html' => TRUE));
} else {
if (!isset($selective)) {
$node = node_load($gid);
$selective = $node->og_selective;
}
switch ($selective) {
case OG_MODERATED:
$txt = t('Request membership');
$class = 'og-join-moderated';
break;
case OG_OPEN:
$txt = t('Join');
$class = 'og-join-open';
break;
case OG_INVITE_ONLY:
$txt = t('Invite');
$class = 'og-join-invite';
break;
case OG_CLOSED:
$txt = t('Closed');
$class = 'og-join-closed';
break;
}
if (isset($txt)) {
if ($selective == OG_MODERATED) {
return l('группа по запросу', "og/subscribe/$gid", array('attributes' => array('rel' => 'nofollow', 'class' => ' og-con ' . $class, 'title' => $txt, 'rel' => 'nofollow'), 'query' => drupal_get_destination(), 'html' => TRUE));
} elseif ($selective == OG_INVITE_ONLY) {
return "группа по приглашению";
} elseif ($selective == OG_CLOSED) {
return "закрытая группа";
} else {
return l('вступить в группу', "og/subscribe/$gid", array('attributes' => array('rel' => 'nofollow', 'class' => ' og-con ' . $class, 'title' => $txt, 'rel' => 'nofollow'), 'query' => drupal_get_destination(), 'html' => TRUE));
}
}
}
}
?>
уже каша в голове.
Может все проще?
суть такая, что
если создатель группы - то не выводить ничего
если участник группы, то предложение покинуть
если гость, то зависимо от группы либо вступить, либо подать заявку, либо информация, что группа закрыта...
пока так и не разобрался!! ((
Если пользователь - создатель группы, то он не может ее покинуть!
Если гость - то видит сообщение, вступить в группу или ее статус ("закрытая", "по запросу")
Если участник, то может покинуть ее
вроде сделал так. Но при проьбе выйти из группы - 404 ошибка
/* Provide join link */
function group_subscribe_link($node, $gid, $directory, $selective = NULL) {
global $user;
if(og_is_group_member($node->nid) && !og_is_group_admin($node)) {
return l('покинуть группу', 'og/unsubscribe/'. $gid . '/' . $user->uid, array('attributes' => array('title' => 'покинуть группу', 'class' => 'og-con og-leave', 'rel' => 'nofollow'), 'query' => drupal_get_destination(), 'html' => TRUE));
}
elseif (og_is_group_admin($node)) {
return "";
}
else {
if (!isset($selective)) {
$node = node_load($gid);
$selective = $node->og_selective;
}
switch ($selective) {
case OG_MODERATED:
$txt = t('Request membership');
$class = 'og-join-moderated';
break;
case OG_OPEN:
$txt = t('Join');
$class = 'og-join-open';
break;
case OG_INVITE_ONLY:
$txt = t('Invite');
$class = 'og-join-invite';
break;
case OG_CLOSED:
$txt = t('Closed');
$class = 'og-join-closed';
break;
}
if (isset($txt)) {
if ($selective == OG_MODERATED) {
return l('группа по запросу', "og/subscribe/$gid", array('attributes' => array('rel' => 'nofollow', 'class' => ' og-con ' . $class, 'title' => $txt, 'rel' => 'nofollow'), 'query' => drupal_get_destination(), 'html' => TRUE));
} elseif ($selective == OG_INVITE_ONLY) {
return "группа по приглашению";
} elseif ($selective == OG_CLOSED) {
return "закрытая группа";
} else {
return l('вступить в группу', "og/subscribe/$gid", array('attributes' => array('rel' => 'nofollow', 'class' => ' og-con ' . $class, 'title' => $txt, 'rel' => 'nofollow'), 'query' => drupal_get_destination(), 'html' => TRUE));
}
}
}
}
?>
Проверь путь - он должен быть таким же как и формируемый ОГ.
'rel' => 'nofollow' -- не надо, поисковики эту ссылку не видят
'html' => TRUE -- где здесь HTML код?
ой, нагородил и запутался вовсе. И при всем этом не зная языка...
Я так понял, что влияет не только вышеупомянутый код
Еще при выводе этой строки с шаблоне я пишу
<?php print group_subscribe_link($node, $gid, $directory, $selective = NULL); ?>
может тут что-то неправильно?
путь с таким выводом и вышеупомянутым кодом выглядит так
./og/subscribe?destination=node%2F17
я так понимаю, должен выглядеть
./og/subscribe?destination=node/17
что касается
'rel' => 'nofollow' и 'html' => TRUE
то этих я копировал с самых первых постов изначального кода
Это один и тот же путь. Но это путь подписки, а тебе надо на выход из группы: og/unsubscribe/123/56, он-то появляется?
до изменения кода, когда все работало, но отображалось все админу, как мне не надо, было так
подписка - ./og/subscribe/17?destination=node%2F17
отписка - ./og/unsubscribe/17/6?destination=node%2F17
выводил
<?php print group_subscribe_link($node->nid, $directory, $node->selective); ?>
<?php endif; ?>
с кодом модуля
/* Provide join link */
function group_subscribe_link($gid, $directory, $selective = NULL) {
global $user;
if (og_is_group_member($gid)) {
return l('покинуть группу', 'og/unsubscribe/'. $gid . '/' . $user->uid, array('attributes' => array('title' => 'покинуть группу', 'class' => 'og-con og-leave', 'rel' => 'nofollow'), 'query' => drupal_get_destination(), 'html' => TRUE));
} else {
if (!isset($selective)) {
$node = node_load($gid);
$selective = $node->og_selective;
}
switch ($selective) {
case OG_MODERATED:
$txt = t('Request membership');
$class = 'og-join-moderated';
break;
case OG_OPEN:
$txt = t('Join');
$class = 'og-join-open';
break;
case OG_INVITE_ONLY:
$txt = t('Invite');
$class = 'og-join-invite';
break;
case OG_CLOSED:
$txt = t('Closed');
$class = 'og-join-closed';
break;
}
if (isset($txt)) {
if ($selective == OG_MODERATED) {
return l('группа по запросу', "og/subscribe/$gid", array('attributes' => array('rel' => 'nofollow', 'class' => ' og-con ' . $class, 'title' => $txt, 'rel' => 'nofollow'), 'query' => drupal_get_destination(), 'html' => TRUE));
} elseif ($selective == OG_INVITE_ONLY) {
return "группа по приглашению";
} elseif ($selective == OG_CLOSED) {
return "закрытая группа";
} else {
return l('вступить в группу', "og/subscribe/$gid", array('attributes' => array('rel' => 'nofollow', 'class' => ' og-con ' . $class, 'title' => $txt, 'rel' => 'nofollow'), 'query' => drupal_get_destination(), 'html' => TRUE));
}
}
}
}
?>
после изменения ссылки стали такие:
подписка - ./og/subscribe/?destination=node%2F17
отписка - ./og/unsubscribe/%252F6?destination=node%2F17
выводил
<?php print group_subscribe_link($node, $gid, $directory, $selective = NULL); ?>
<?php endif; ?>
с кодом модуля
/* Provide join link */
function group_subscribe_link($node, $gid, $directory, $selective = NULL) {
global $user;
if(og_is_group_member($node->nid) && !og_is_group_admin($node)) {
return l('покинуть группу', 'og/unsubscribe/'. $gid . '/' . $user->uid, array('attributes' => array('title' => 'покинуть группу', 'class' => 'og-con og-leave', 'rel' => 'nofollow'), 'query' => drupal_get_destination(), 'html' => TRUE));
}
elseif (og_is_group_admin($node)) {
return "";
}
else {
if (!isset($selective)) {
$node = node_load($gid);
$selective = $node->og_selective;
}
switch ($selective) {
case OG_MODERATED:
$txt = t('Request membership');
$class = 'og-join-moderated';
break;
case OG_OPEN:
$txt = t('Join');
$class = 'og-join-open';
break;
case OG_INVITE_ONLY:
$txt = t('Invite');
$class = 'og-join-invite';
break;
case OG_CLOSED:
$txt = t('Closed');
$class = 'og-join-closed';
break;
}
if (isset($txt)) {
if ($selective == OG_MODERATED) {
return l('группа по запросу', "og/subscribe/$gid", array('attributes' => array('rel' => 'nofollow', 'class' => ' og-con ' . $class, 'title' => $txt, 'rel' => 'nofollow'), 'query' => drupal_get_destination(), 'html' => TRUE));
} elseif ($selective == OG_INVITE_ONLY) {
return "группа по приглашению";
} elseif ($selective == OG_CLOSED) {
return "закрытая группа";
} else {
return l('вступить в группу', "og/subscribe/$gid", array('attributes' => array('rel' => 'nofollow', 'class' => ' og-con ' . $class, 'title' => $txt, 'rel' => 'nofollow'), 'query' => drupal_get_destination(), 'html' => TRUE));
}
}
}
}
?>
... ((
И чему у тебя равен $gid? Какой-то странный код. Четыре непонятных параметра передаются в функцию, хотя достаточно одного. Вместо $gid передавай тогда уж $node->gid
так... господа. вот я сунул сюда свои кривые ручки.
А кто вам сказал что тут надо именно на #submit делать?
имхо тут надо через валидацию формы прогнать и ТАМ сделать drupal_map_assoc(). она раньше сабмитов пойдет.
Dan, я знаю, ты в данный момент его мучаешь возможно. замени сабмит валидацией. Warning исчезнуть должен будет
Валидация тоже не прокатит. Там два варнинга, на валидацию и на сабмит
Сделал на #after_build. Прикрепляю файлег.
пля. я не пользовал такой альтер никогда.
ты оказался круче чем я, придется мне тебя убить.Молодцом
ЗЫ. я щитаю это надо на d.org. ну + вариант для 7ки. хотя для 7ки групп не смотрел.
Ого, сколько понаписали. Прошу прощения у всех, кому не ответил в 2010 году - в армии был. А после было не до друпала - идёт много новых проектов. Если у кого есть вопросы по OG и прочему для Drupal 6 - обращайтесь, подскажу.
А понаписали интересно, стоит и самому покурить.
Mr.Alinaki и Den
Респект за og_single_group