2016-05-06 2 views
0

У меня есть сайт Drupal 7, на котором установлена ​​настраиваемая тема, и мы также добавили некоторые новые таблицы и расширили некоторые другие. Прямо сейчас я создал Ubercart для продажи наших продуктов на основе таксономии. Когда покупка завершена, мне нужно обновить пользовательскую таблицу в MySQL, поэтому я сделал proc для этого.Как обновить базу данных после транзакции?

В MySQL создан proc, который будет выполнять обновление необходимых мне таблиц, все, что мне нужно передать в proc, это uid (то же, что и в таблице пользователей), и идентификатор выбранной таксономии во время покупки.

Я создал следующий код, чтобы позвонить, но я не уверен, что лучший способ передать в uid и tid для proc? Должен ли я использовать правила в Drupal?

<?php 
$mysqli = new mysqli("mysite.com", "user", "password", "db1"); 
if ($mysqli->connect_errno) { 
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
} 

if (!$mysqli->query("CALL UpdateUserDestList(uID, tID")) { 
    echo "CALL failed: (" . $mysqli->errno . ") " . $mysqli->error; 
} 
?> 

ответ

0

Вы можете запустить свой код после покупки с помощью Ubercart-х hook_uc_checkout_complete(). Вы хотите определить, что в пользовательском модуле, а не внутри темы, поскольку это бизнес-логика, не отображающая информацию. Внутри крючка у вас будет доступ как к заказу, так и к учетной записи пользователя, разместившей заказ.

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

// Get the Drupal database connection and change the statement class to PDOStatement. 
// Save the current class for cleanup later. 
$conn = Database::getConnection(); 
$saved_class = $conn->getAttribute(PDO::ATTR_STATEMENT_CLASS); 
$conn->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('PDOStatement')); 

// Prepare the statement and bind params 
$statement = $conn->prepare("Call GetNodeList(?,?)"); 

$op_status = $statement->bindParam(1, $node_type, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 25); 
$op_status = $statement->bindParam(2, $publish_state, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT); 

// Execute the statement and reset the connection's statement class to the original. 
$exec_result = $statement->execute(); 
$conn->setAttribute(PDO::ATTR_STATEMENT_CLASS, $saved_class); 

// Get your data 
while ($row = $statement->fetchColumn(0)) { 
    // ... 
} 

Код взят из: https://drupal.stackexchange.com/questions/32708/how-to-execute-stored-procedures-in-drupal, который в свою очередь приводит: http://public-action.org/content/stored-procedures-and-drupal-7

+0

Я проверяю в этом крючке, и я не думаю, что это на самом деле вызывается, хотя документация говорит, что это делает. Даже если я помещаю там плохой код и прохожу процесс проверки, я не получаю никаких ошибок. – Baub

+0

. Несколько вещей, которые стоит попробовать: 1) загрузить страницу модуля, чтобы убедиться, что drupal заметил новый крючок. 2) дважды проверьте правильность написания имени крюка: [имя_компьютера] _uc_checkout_complete(). – acrosman

Смежные вопросы