среда, 1 июня 2011 г.

Программное создание комментария к ноде.

Есть задача: при создании ноды автор должен обязательно оставить к ней комментарий, ну типа нафига он её создал.
Если комментария нет, то нода не создается и выводится сообщение, что комментарий обязателен для заполнения.

Решение:
1. Создаем CCK поле, например field_authcomment и делаем его обязательным для заполнения.
2. С помощью модуля Rules в момент сохранения ноды выполняем следующий PHP код.

$form_state['nid'] = $node->nid;
$form_state['comment'] = $node->field_authcomment[0]['view'];;
$values = array();
$values['submitted'] = 1;
$values['values']['nid'] = $node->nid;
$values['values']['pid'] = '0';
$values['values']['uid'] = $node->uid;
$values['values']['name'] = $author->name;
$values['values']['author'] = $author->name;
$values['values']['subject'] = 'Комментарий автора';
$values['values']['comment'] = $node->field_authcomment[0]['value'];
$values['values']['op'] = t('Post comment');
$values['values']['submit'] = 'save';
drupal_execute('comment_form', $values, $form_state);


В результате при создании ноды от имени автора автоматически создается правильный друпаловский комментарий. Ловкость рук и никакого мошенничества.

Кстати, с помощью drupal_execute можно программно заполнить и засабмитить любую форму на сайте. Главное знать её ID и какие элементы её надо передавать.


вторник, 24 мая 2011 г.

Извращенское решение поиска по неиндексирующемуся контенту. Например штрих-кодам.

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

Чтобы делать на сайте красивые картинки штрих-кодов использовал модуль Barcode. Он создает CCK поле, в которое пользователь вводит цифры, а на выходе модуль генерирует соответствующую картинку.
Очевидно, что штрих-код вводится не просто так, а чтобы потом сделать по нему поиск товара. И вот тут нас подстерегает кака - несмотря на то, что это CCK - оно не индексируется. Т.е. поиск по нему не сделать. Epic Fail!

И как я только с ним не трахался!

Решение пришло неожиданно.

Создаем новое CCK поле и делаем его скрытым в форме создания продукта. В это поле будет копироваться значение штрих-кода.

При создании продукта, с помощью модуля Rules назначаем нашему созданному полю значение поля штрих-код. Все.

Обязательно (!) выводить наше созданное поле в ноде, а то искать не будет. Все.

Выглядит это так.

Rules -> Node: Content is going to be saved
Do
Populate saved content's field 'field_barcodetext'

PHP код для вставки:


$a = ($node->field_barcode[0]['barcode']);
return array(
  0 => array('value' =>$a, 'view' => $a),
);

Как вы поняли, field_barcode это поле CCK модуля Barcode. В переменной barcode лежит текстовое значение штрих-кода.

field_barcodetext это созданное нами CCK поле для вывода.

Таким образом можно сделать поиск по любому контенту, который не индексируется стандартным модулем Search.

А теперь как нужно делать!
Модуль Search глючит на больших числах. И даже, если контент индексируется в принципе, если это будет число из 13 и более цифр, то он его не найдет. Как оказалось, Barcode индексируется.
Для того, чтобы все получилось необходимо хакнуть модуль Search.

в файле search.module можно заменить два раза вызов
$num = is_numeric($word);
на
$num = is_int($word);
т.к. далее к коде идет преобразование к int: $word = (int)ltrim($word, '-0'); поэтому все значения больше PHP_INT_MAX преобразовываются в этот самый PHP_INT_MAX.

Вот и все.

вторник, 17 мая 2011 г.

Кнопка войти через Вконтакте

Эту кнопку можно вставить в любое место, добавив следующий код.
<div id="vk_login" class="vk_login" style="margin: 0 auto 20px auto;" onclick="doLogin();">

Естественно должен быть установлен соответствующий модуль vk open api.

Темизация формы входа на сайт

Интересный способ нашел вот здесь:
http://xn--80ah2a0a8b.xn--p1ai/blog/drupal/temizatsiya-formy-vkhoda-v-sistemu


Для этого в папке с темой создаем дополнительный шаблон для блока с именем block-user-0.tpl.php и помещаем в него следующий код:
<div id="login">
 <h2>Вход на сайт</h2>
 <?php  global $user; ?>
 <form action="/user" method="post" id="user-login">
  <table border="0">
   <tr>
    <td><input type="text" name="name" id="edit-name" size="10" tabindex="1" class="form-text required" value="Логин" class="form-text NormalTextBox txtSearch" onfocus="if (this.value == 'Логин') {this.value = '';}" onblur="if (this.value == '') {this.value = 'Логин';}"  /><input type="hidden" name="form_id" id="edit-user-login" value="user_login"  /></td>
    <td><input type="password" name="pass" id="edit-pass"  size="11"  tabindex="2" class="form-text required" value="Пароль" class="form-text NormalTextBox txtSearch" onfocus="if (this.value == 'Пароль') {this.value = '';}" onblur="if (this.value == '') {this.value = 'Пароль';}" /></td>
   </tr>
   <tr>
    <td><a href="/user/register"><b>Регистрация</b></a><br /><a href="/user/password" style="color:#000;">Получить новый пароль</a></td>
    <td align="right">                <input name="op" type="image" class="form-submit" 
      id="edit-submit"  tabindex="3" value="" src="<?php print drupal_get_path('theme','vero')?>/img/log.png" alt="<?php print t('login');?>" title="<?php print t('login');?>" /></td>
   </tr>
  </table>
 </form>
</div>

JqueryMenu развернуть/свернуть

Долго тупил где настраивается развернуть/свернуть для jQueryMenu. Оказалось, в настройках того меню, которое обрабатывается jquery! Гениально!

Fivestar и темизация страницы

После создания страницы node-type.php.tpl для придания выводу материала более-менее приличного вида, каждое поле приходится сувать вручную на нужное место.

Для вывода рейтинга Fivestar необходимо вставить в нужное место такой код:

<?php print $node->content['fivestar_widget']['#value']; ?>

Fivestar и Views

Собственно видеоруководство по выстраиванию материалов по рейтингу.
http://www.lullabot.com/videos/building-views-fivestar-and-votingapi

понедельник, 16 мая 2011 г.

comments.php.tpl

Этот файл формирует только вывод комментариев! Не надо в него засовывать текст Вконтактовского модуля. Он будет отображаться ТОЛЬКО! на странице, где уже есть комментарии Друпал.

Красивое раскрывающееся меню.

Сделать красивое раскрывающееся меню из терминов таксономии как это сделано здесь очень просто.
Для этого нужно установить два модуля: TaxonomyMenu и jquerymenu. Первый делает меню из терминов таксономии, а второй выводит это меню в блок в таком красивом виде. Последний модуль доступен пока только для Drupal 6.

Как перелогиниться под админом в Drupal 6?

Очень частая ситуация. Убрали блок ввода пароля и выхода из учетной записи. Вышли из-под админа и залогинились под пользователем. Как теперь снова залогиниться под админом, ведь непонятно куда вводить пароль?

1. Как правило браузеры запоминают куки (cookies), так что их надо удалить.
2. Перейти по адресу: http://example.com/index.php?q=user (заменить на имя своего сайта)
3. Ввести логин и пароль от админа.

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

Проблема решается переходом по следующему адресу:
http://example.com/index.php?q=logout
Все, на вашем сайте никто не залогинен, блок ввода пароля виден. Вводите логин и пароль и вперед!
Последнее решение нигде не мог найти, допер самостоятельно.