Drupal 6: Получение пользовательских полей в базе данных - PullRequest
0 голосов
/ 16 декабря 2009

Мне нужно было настраиваемое поле, которое не могло быть предоставлено модулем основного профиля (список выбора, заполненный запросом SQL). Я смог успешно добавить поле с правильными параметрами; однако я не уверен, как обработать это новое поле после отправки.

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

На данный момент передается только имя поля, а не значение. И имя поля сериализуется и сохраняется в поле «данные» пользовательской таблицы. Я пытаюсь передать его в собственную колонку.

Вот мой код ...

//takes value and inserts it to account field   
 function accountselect_submitaccount() {
        db_query( "INSERT INTO {user} (account)
                  VALUES {account_name}" );
      }

Тогда ...

//call the above function using custom submit (I suspect this is the troubled area)
  function accountselect_form_alter(&$form, $form_state, $form_id) {
    if($form_id == 'user-register')
    $form['#submit'][] = 'accountselect_submitaccount';
  }

Ответы [ 2 ]

2 голосов
/ 16 декабря 2009

Если я вас правильно понял, вы пытаетесь изменить форму регистрации пользователя, чтобы, кроме вставки «обычных» полей (имя пользователя, пароль и т. Д.), Пользователю было предложено заполнить дополнительные поля. , Если я правильно понял, я бы поступил именно так (как вы сказали, вы новичок в Drupal, я старался быть настолько конкретным, насколько мог).

Предварительные заметки

  1. Я бы не стал изменять пользователей таблицы . Один из ключевых принципов в Drupal заключается в том, что вы никогда не должны изменять чужой код: вы должны достичь того, чего хотите, подключив свой собственный к общей системе обратных вызовов и перехватчиков (см. Также примечание ниже). В тех редких случаях, когда это технически невозможно (а характер вашей модификации повысит удобство использования / функциональность для широкой публики), вы должны предоставить патч для внимания сопровождающих кода.
  2. Флажки всегда возвращают индекс своего массива, а не значение их массива. Это так по ряду веских причин. Один для всех: значением массива, скорее всего, будет некоторый текст, который отличается в каждом языке, поэтому формы обычно определяются чем-то вроде [bread] => t('bread'), так что при использовании формы в других языках выбор будет отображать «боль» "или" bröd "или" панель ", но возвращаемое значение (и, возможно, сохраненное в БД всегда будет" хлебом ".

Дизайн

  1. Создайте свой собственный модуль и сделайте так, чтобы он взаимодействовал через один с основными пользователями.
  2. Создайте свою собственную таблицу : первичным ключом будет пользовательский UID (UID) из таблицы users. Вы можете иметь столько полей в таблице, сколько вам нужно. В вашем конкретном случае, если вы используете MySQL, вы можете оценить, хотите ли вы использовать тип enum или просто записать значения, передаваемые кодом PHP (лично я стремлюсь ограничить количество ограничений в БД и управлять проверкой данных в код, так что я бы пошел на второй вариант ... но это действительно вопрос стиля).
  3. Реализация hook_form_FORM_ID_alter(), где FORM_ID будет идентификатором формы, которую пользователь собирается использовать для регистрации. Если для регистрации можно использовать более одной формы, внедрите вместо нее hook_form_alter() и создайте в ней структуру switch / case.
  4. Используйте FAPI (API формы) для определения функций проверки и обратного вызова . Вы можете увидеть, какие поля поддерживаются в поле выбора здесь . Вы можете определить поле #element_validate для назначения обратного вызова проверки, если вам нужно. Вам нужно будет добавить (в отличие от назначить ) имя функции обратного вызова для отправки в поле #submit кнопки, которую вы используете для отправки всей формы.
  5. Реализация ваших обратных вызовов . Обратные вызовы, которые имеют дело с формами, обычно получают два аргумента, обычно называемые $form и $form_state. Последний содержит значения формы, выбранные пользователем. Ваш ответный вызов будет тем, который содержит инструкцию drupal_write_record(), чтобы сохранить соответствующие данные в вашей пользовательской таблице.

Заключительные замечания

  1. К сожалению, хотя CCK сделал это в ядре, возможности создавать профили пользователей как пользовательский контент не было, так что вы действительно хотите красиво кодировать свой модуль, так как это будет то, что вы будете использовать, скорее всего, до Drupal 8.
  2. Я обнаружил (благодаря другому ответчику на тот же вопрос), что Drupal действительно предоставляет механизм для изменения таблицы пользователя , действительно. Мне все еще не нравится принцип дизайна, стоящий за этим, хотя:

    • потому что он запутывает вещи, которые должны логически храниться отдельно (основные и пользовательские модули / модули и данные)
    • , поскольку он не обеспечивает защиту пространства имен (скажем, вы добавили настраиваемое поле с именем «часовой пояс», а спустя несколько месяцев вы хотите установить API даты (который также попытается создать поле с именем «часовой пояс» ...)
    • , поскольку это делает код менее читаемым и более сложным в обслуживании

    Тем не менее, здесь . Наконец, стоит упомянуть, что механизм, лежащий в основе этой функции, меняется с D6 на D7.

НТН!

0 голосов
/ 16 декабря 2009

Насколько мне известно, новые поля добавляются в столбец data, только если столбец не соответствует имени поля.Вы должны иметь возможность просто создать столбец account в пользовательской таблице, и он будет заполнен этими данными.

Что касается размещенного вами кода, у вашей функции отправки есть ряд проблем.:

  • Функции отправки принимают функции, которые включают в себя отправленные значения.submit_function($form, &$form_state) дает вам доступ к массиву $form_state['values'].
  • INSERT никогда не будет работать.Вам нужен запрос UPDATE.
  • Вы не можете сделать {account_name} в запросе.Вам нужно использовать значение из $form_state['values'].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...