Рассмотрим несколько кейсов по работе с модулем Flag.
Как вывести флаг в произвольном месте шаблона
Рассмотрим как вывести ссылку флага в определённом месте собственного шаблона материала. Пусть это будет материал типа Article. Создаем в папке темы файл node--article.tpl.php . Содержимое файла такое-же, как и node.tpl.php (стандартный шаблон ноды).
Допустим, я хочу выводить флаг под заголовком. Добавляю заглушку в код шаблона:
Если ваш шаблон подтянулся, вы сразу увидите её в браузере. Если нет — очистите кэш Друпала по адресу admin/config/development/performance.
Для вывода ссылок флага можно воспользоваться следующим кодом:
$flag = render($content['links']['flag']);
print $flag;
Однако, может быть проблема, если к материалу прикреплено несколько флагов, вы увидите их все, а не тот, что вам нужен. Пока давайте проверим вывод всех флагов.
У меня вывелось два разных флага: для добавления в закладки и один тестовый флаг.
Разберём как вывести только один флаг. Для этого выведем значение переменной $content['links']['flag'] на экран. Если у вас стоит модуль Devel, то вывод будет следующим:
dpm($content['links']['flag']);
Этот код можно вставить в начало файла node--article.tpl.php, и вы увидите на экране следующую отладочную информацию:
В элементе массива с ключём #links будут все флаги, которые прикреплены к этому типу материала. Давайте удалим все ненужные флаги:
$my_flag = 'add_to_bookmarks'; // Our flag
$all_flags = $content['links']['flag'];
foreach($all_flags['#links'] as $flag_name => $flag_value) {
if ($flag_name != 'flag-' . $my_flag) {
// Remove other flags
unset($all_flags['#links'][$flag_name]);
}
}
// Output our flag
$one_flag = render($all_flags);
print $one_flag;
Размещайте этот код там, где вы хотите вывести флаг.
Если вы всё сделали верно, то увидите на странице материала только нужный вам флаг.
Как программно отметить материал (поставить флаг)
Для выполнения такой операции нужен свой модуль. Создадим модуль с одной единственной функцией, которую будем вызывать через Devel.
Создадим azimut7.info:
name = Azimut7
description = Helper module.
core = 7.x
version = "7.x-1.0"
core = "7.x"
project = "azimut7"
datestamp = "1398963366"
И файл модуля azimut7.module. Файл будет содержать всего одну функцию, которая будет проставлять флаг для конкретного материала.
function azimut7_flag_prog($flag_name, $nid) {
}
После создания файлов, вы должны увидеть его на странице со списком модулей. Включайте модуль. После этого функция azimut7_flag_prog станет доступна для вызова.
Теперь чтобы проверить работоспособность функции, перейдите по адресу devel/php и в поле ввода напишите:
azimut7_flag_prog(1,2);
Для теста я передал в функцию единицу и двойку. Если ошибок нет, значит модуль корректно включился и работает.
Теперь разместим в функции azimut7_flag_prog следующий код:
// Current user
global $user;
// Load the necessary flag
$flag = flag_get_flag($flag_name);
// Flag the necessary material on behalf of the current user
$flag->flag('flag', $nid, user_load($user->uid));
Теперь попробуйте запустить эту функцию в модуле Devel.
На devel/php пишем:
// 1 - this is node ID you need
azimut7_flag_prog('add_to_bookmarks',1);
После этого можно проверить материал, флаг будет стоять. Если вам нужно снять флаг, тогда следует в метод flag первым аргументом передать строку unflag.
Давайте сразу вынесем это в аргументы нашей функции, чтобы было понятнее.
function azimut7_flag_prog($flag_name, $nid, $action = 'flag') {
global $user;
$flag = flag_get_flag($flag_name);
$flag->flag($action, $nid, user_load($user->uid));
}
Программно поставить флаг:
azimut7_flag_prog('add_to_bookmarks', 1,'flag');
// or
azimut7_flag_prog('add_to_bookmarks', 1);
Программно снять флаг:
azimut7_flag_prog('add_to_bookmarks', 1,'unflag');
В первом случае третий аргумент можно опустить, так как при объявлении функции azimut7_flag_prog задано его значение по-умолчанию.