[rdy] Как удалить атрибут у товара?

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

Аватар пользователя Cozmi Cozmi 2 августа 2011 в 17:41

в идеале хочется удалить все атрибуты у товара c nid. или атрибут aid у товара c nid.
Знает кто-нибудь как?

Комментарии

Аватар пользователя Cozmi Cozmi 2 августа 2011 в 17:59

cпс. но на чистом VBO вроде нету такой возможности. из полезного там только: публиковать -не публиковать и удаление

Аватар пользователя Cozmi Cozmi 2 августа 2011 в 18:55

я понимаю это. если бы была сама ф-я, которая удаляла бы атрибут например uc_delete_attribute($aid, $nid); то остальное не проблема

Аватар пользователя CSoft CSoft 2 августа 2011 в 22:06

Прям такой готовой функции нет, но я думаю, что на основе функции uc_attribute_delete_confirm_submit смастерить свою для данной цели не будет сложно.

Простые запросы к базе, это можно сделать и вообще самому:

db_query("DELETE FROM {uc_product_attributes} WHERE aid = %d AND nid = %d", $aid, $nid);

И не забыть опции ухватить за собой, второй запрос написать.

Аватар пользователя Xermit Xermit 2 августа 2011 в 23:31

Думаю смотреть надо функцию uc_attribute_delete_confirm_submit
да и дергать лучше ее же, передав нужные аргументы.

function uc_attribute_delete_confirm_submit($form, &$form_state) {
  if ($form_state['values']['confirm']) {
    db_query("DELETE FROM {uc_class_attribute_options} WHERE EXISTS (SELECT * FROM {uc_attribute_options} AS ao WHERE {uc_class_attribute_options}.oid = ao.oid AND ao.aid = %d)", $form_state['values']['aid']);
    db_query("DELETE FROM {uc_class_attributes} WHERE aid = %d", $form_state['values']['aid']);
    db_query("DELETE FROM {uc_product_options} WHERE EXISTS (SELECT * FROM {uc_attribute_options} AS ao WHERE {uc_product_options}.oid = ao.oid AND ao.aid = %d)", $form_state['values']['aid']);
    db_query("DELETE FROM {uc_product_adjustments} WHERE EXISTS (SELECT * FROM {uc_product_attributes} AS pa WHERE {uc_product_adjustments}.nid = pa.nid AND pa.aid = %d)", $form_state['values']['aid']);
    db_query("DELETE FROM {uc_product_attributes} WHERE aid = %d", $form_state['values']['aid']);
    db_query("DELETE FROM {uc_attribute_options} WHERE aid = %d", $form_state['values']['aid']);
    db_query("DELETE FROM {uc_attributes} WHERE aid = %d", $form_state['values']['aid']);
    drupal_set_message(t('Product attribute deleted.'));
  }
}
Аватар пользователя Cozmi Cozmi 3 августа 2011 в 17:33

CSoft -- там не одна таблица в том то и дело.
Xermit я тоже находил эту ф-ю, однако в ней нет упоминания о ноде. придется просматривать все эти таблицы и искать там nid.

Аватар пользователя CSoft CSoft 3 августа 2011 в 17:51

"Cozmi" wrote:
CSoft -- там не одна таблица в том то и дело.

Посмотрел Ваш профиль - столько времени на сайте, разве не можете несколько простых запросов к базе оформить?

Таблицы, которые Вам нужны:

uc_product_adjustments
uc_product_attributes
uc_product_options

Удалите оттуда все строки, что связаны с Вашей нодой и нужным атрибутом. По готовым функциям из самого модуля uc_attribute подсмотрите запросы, добавьте в них условие отбора по nid.

Аватар пользователя Xermit Xermit 3 августа 2011 в 21:26

Правильнее все таки найти код который это итак делает и вызвать его по возможности.
Не там копали как я думаю, глянул еще раз, шел уже от подсистемы построения меню к форме которую кто то же должен был сделать.
Нашел:
Есть функция uc_object_attributes_form_submit которая отвечает за обработку вот этой формы
http://imm.io/7QYA

в ней есть код

/**
 * see uc_object_attributes_form()
 */

function uc_object_attributes_form_submit($form, &$form_state) {
if ($form_state['values']['type'] == 'product') {
    $attr_table = '{uc_product_attributes}';
    $opt_table = '{uc_product_options}';
    $id = 'nid';
    $sql_type = '%d';
  }
  elseif ($form_state['values']['type'] == 'class') {
    $attr_table = '{uc_class_attributes}';
    $opt_table = '{uc_class_attribute_options}';
    $id = 'pcid';
    $sql_type = "'%s'";
  }

  if ($form_state['values']['view'] == 'overview' && is_array($form_state['values']['attributes'])) {
    foreach ($form_state['values']['attributes'] as $aid => $attribute) {
      if ($attribute['remove']) {
        $remove_aids[] = $aid;
      }
      else {
        db_query("UPDATE $attr_table SET label = '%s', ordering = %d, required = %d, display = %d WHERE aid = %d AND $id = $sql_type", $attribute['label'], $attribute['ordering'], $attribute['required'], $attribute['display'], $aid, $form_state['values']['id']);
        $changed = TRUE;
      }
    }

if (count($remove_aids) > 0) {
      $id_value = $form_state['values']['id'];
      $remove_aids_value = implode(', ', $remove_aids);

      db_query("DELETE FROM $opt_table WHERE EXISTS (SELECT * FROM {uc_attribute_options} AS ao WHERE $opt_table.oid = ao.oid AND ao.aid IN (%s)) AND $opt_table.$id = $sql_type", $remove_aids_value, $id_value);
      db_query("DELETE FROM $attr_table WHERE $id = $sql_type AND aid IN (%s)", $id_value, $remove_aids_value);
      if ($form_state['values']['type'] == 'product') {
        db_query("DELETE FROM {uc_product_adjustments} WHERE nid = %d", $id_value);
      }

      drupal_set_message(format_plural(count($remove_aids), 'count attribute has been removed.', 'count attributes have been removed.'));
    }

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