Использование яваскрипт при создании/редактирвоании ноды

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

Аватар пользователя Kottov Kottov 1 июля 2014 в 20:30

Пользователь создает материал Объявление. Выставляет цену, валюту. Как ему рядышком показать переденную сумму в другую валюту.
Курсы других валют лежат в таксономии, в доп.полях.
Нашел такую подсказку http://stackoverflow.com/questions/10856769/execute-javascript-on-node-c...
Но чето громоздко, наверное лишнего куча. Я ведь не создаю ноду программным путем.

Комментарии

Аватар пользователя Kottov Kottov 1 июля 2014 в 21:54

Проверил то что в ссылке на английском - работает но не то что надо - запускает явоскрипт уже по созданю ноды.

Вот hook_node_view_alter()

function hook_node_view_alter(&$build) {
if ($build['#view_mode'] == 'full' && isset($build['an_additional_field'])) {
// Change its weight.
$build['an_additional_field']['#weight'] = -10;
}

// Add a #post_render callback to act on the rendered HTML of the node.
$build['#post_render'][] = 'my_module_node_post_render';
}

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

они будут нужны?

Аватар пользователя Kottov Kottov 1 июля 2014 в 23:06

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

скорее нужен hook_node_prepare
попробую подключить к нему Drupal_add_js

Аватар пользователя Kottov Kottov 2 июля 2014 в 1:58

получилось запустить яваскрипт как здесь https://www.drupal.org/node/1253520#comment-4881588
на семерке тоже пошло

function mymodule_form_alter(&$form, &$form_state, $form_id) {
switch ($form_id) {
case 'my_form':
$form['#after_build'][] = 'mymodule_after_build';
break;
}
}
function mymodule_after_build($form, &$form_state) {
$path = drupal_get_path('module', 'mymodule');
drupal_add_js ("$path/mymodule.js");
return $form;
}

только почему-то на любой странице срабатывает, на любойй форме

подставлял в 'my_form' - 'ads_node_form', 'ads' (ads - тип моего материала)

Аватар пользователя Kottov Kottov 2 июля 2014 в 23:11

пока сделал через hook_form_alter
два раза выдавало событие js потому что брал заготовку модуля с использованием js из http://stackoverflow.com/questions/10856769/execute-javascript-on-node-c...
и там скрип в mymodule.info включили

name = Test Customization Module
description = Customizing stuffs on the site...
core = 7.x
package = My modules

scripts[] = js/testModule.behaviors.js

убрал его все заработало

вот толковый мануал по теме нашел
http://befused.com/drupal/form-alter

найти бы эту книжку http://befused.com/starting-drupal-dev/

Аватар пользователя Kottov Kottov 3 июля 2014 в 4:55

Скрипт работает.
Но как получить Элементы?

вот исходник страницы создания ноды

<div class="form-item form-type-textfield form-item-field-price-und-0-value">

    <label for="edit-field-price-und-0-value"></label>
    <input id="edit-field-price-und-0-value" class="form-text required" type="text" maxlength="12" size="14" value="123.00" name="field_price[und][0][value]"></input>

</div>

пытался получить доступ к полю

добавил в js файл

document.getElementById("edit-field-price-und-0-value").onclick=function(){

alert("test1");

};

выдает:
Uncaught TypeError: Cannot set property 'onclick' of null
(anonymous function)

хотя если в консоль вбиваю - 'onclick' срабатывает

Аватар пользователя Kottov Kottov 3 июля 2014 в 11:20

поставил вес яваскрипта 30
и модуля 3

добавил $ в

document.getElementById("edit-field-price-und-0-value").onclick=function($){

alert("test1");

};

не работает

Аватар пользователя Kottov Kottov 3 июля 2014 в 12:50

через jQuery

$('#edit-title-field-und-0-value').click(function(){
alert("test3");
});

тоже не работает

Uncaught TypeError: undefined is not a function
(anonymous function)

почему-то не видит он элементы через drupal_add_js через('file')
проверил через('inline') - сработало

читал что когда через файл подключается то нужно какой-то особый формат jQuery использовать

Аватар пользователя Kottov Kottov 3 июля 2014 в 14:56

короче, https://www.drupal.org/node/2035395 тут ответ
Получилось и через hook_after_build c drupal_add_js и через #attached - как ниже приведено:

<?php
function Mymodule_form_alter(&$form, &$form_state$form_id) {
// dpm($form_id);

 

switch ($form_id) {

    case 

'ads_node_form':

// dpm($form);

  

$form['#attached']['js'][] = array(
   
'type' => 'file',
   
'data' => drupal_get_path('module','Mymodule') . '/js/myModule.js',
  );

}
}

?>

надо было правильно jQuery записать

(function ($) {
                  {
                       $(document).ready(function() {
                              alert("Hello!");
                              document.getElementById("edit-title-field-und-0-value").onchange=function()
                               {
                              alert("Hello!2");
                                };

                      });
               }
            })(jQuery);

как js использовать в чистом виде так и не понятно