Вносить изменения напрямую в БД

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

Аватар пользователя droopy droopy 19 декабря 2013 в 22:40

Здравствуйте профессионалы друпала!

Научите пожалуйста, как можно записывать значения ноды напрямую в базу данных.
Есть у меня необходимость пересчитывать цены товаров в инетрнет-магазине (ubercart) из евро в рубли.
Все цены на товары мне приходят в евро и уж очень не хочется их вручную на калькуляторе пересчитывать в рубли. Для этого я бы использовала простенький скрипт на PHP исполняемый прямо в ноде товара и результат подсчета хотелось бы сразу заносить в базу данных.

Как это делается? Научите Smile

Комментарии

Аватар пользователя kv4 kv4 19 декабря 2013 в 23:07

Вам не стоит писать ничего напрямую в БД.

Лучше вам создать модуль. Делается это очень просто, в папке sites/all/modules/customs создайте каталог вашего модуля например sites/all/modules/customs/convert_price
В этом каталоге два файла convert_price.info с примерно таким содержимым:

name = Conver price
description = Переводит цены из евро в рубли
package = Anna
version = 7.0.0
core = 7.x

и второй файл convert_price.module, в котором должно быть примерно следующее:

<?php

function convert_price_node_presave($node) {
  if (empty(
$node->nid)) {
    
// Тут цена в евро. Название поля (field_price) конечно же ваше.
    
$eur $node->field_price[LANGUAGE_NONE][0]['value'];
    
    
// Реализуйте метод, который будет конвертировать валюты.
    
$rur convert_eru_to_rub($eur);    

    

// Запишите результат конвертации.
    
$node->field_price[LANGUAGE_NONE][0]['value'] = $rur;
  }
}

?>

Ну и потом включите этот ваш новый модуль.

Аватар пользователя kv4 kv4 20 декабря 2013 в 6:25

Точно, не посмотрел на тэги:)
Но это не сильно меняет сути... чуть позже напишу как на 6 версии сделать.

Аватар пользователя kv4 kv4 20 декабря 2013 в 7:35
<?php

/**
 * Implements hook_form_alter()
 */
function convert_price_form_alter(&$form, &$form_state$form_id){
  if(
$form_id === 'form_id'){  // Вместо 'form_id' нужно подставить id вашей формы. Обычно что-то вроде YOU_CONTENT_TYPE_node_form
    
$form['#submit'][] = 'convert_price_form_submit';  // Это мы говорим друпалу, что при отправке формы нужно выполнить 
                                                       // наш обработчик convert_price_form_submit, который объявлен ниже 
  
}  
}

function 

convert_price_form_submit(&$form, &$form_state) {
  if (empty(
$form['node']->nid)) {  // Тут нужно проверить, что это новый материал создаётся.
    // Тут цена в евро. Название поля (field_price) конечно же ваше.
    
$eur $form_state['values']['field_price'][LANGUAGE_NONE][0]; 
    
    
// Реализуйте метод, который будет конвертировать валюты.
    
$rur convert_eru_to_rub($eur);    

    

// Запишите результат конвертации.
    
$form_state['values']['field_price'][LANGUAGE_NONE][0] = $rur;
  }
}

?>

Подробности вот тут https://api.drupal.org/api/drupal/developer%21hooks%21core.php/function/...