Drupal пользовательская форма узла

Этот ответ предлагает optparse, который подходит для более старых версий Python. Для Python 2.7 и выше, argparse замены optparse. См. этот ответ для получения дополнительной информации.

, Поскольку другие люди указали, Вы - более обеспеченное движение с optparse по getopt. getopt, в значительной степени непосредственное отображение стандарта getopt (3) библиотечные функции C, и не очень простой в использовании.

optparse, будучи более подробным, намного лучше структурирован и более прост расшириться позже.

Вот типичная строка для добавления опции к синтаксическому анализатору:

parser.add_option('-q', '--query',
            action="store", dest="query",
            help="query string", default="spam")

Это в значительной степени выступает за себя; во время обработки это примет-q или - запрос как опции, сохранит аргумент в атрибуте, названном запросом, и имеет значение по умолчанию, если Вы не определите его. Это также самодокументирует в этом, Вы объявляете аргумент справки (который будет использоваться, когда выполнено с-h/-справка), тут же с опцией.

Обычно Вы анализируете свои споры с:

options, args = parser.parse_args()

Это, по умолчанию, проанализирует стандартные аргументы, переданные сценарию (sys.argv [1:])

options.query будет тогда установлен на значение, которое Вы передали сценарию.

Вы создаете синтаксический анализатор просто путем выполнения

parser = optparse.OptionParser()

, Это все основы, в которых Вы нуждаетесь. Вот полный сценарий Python, который показывает это:

import optparse

parser = optparse.OptionParser()

parser.add_option('-q', '--query',
    action="store", dest="query",
    help="query string", default="spam")

options, args = parser.parse_args()

print 'Query string:', options.query

5 строк Python, которые показывают Вам основы.

Сохраняют его в sample.py и выполняют его однажды с [1 123]

python sample.py

и однажды с [1 124]

python sample.py --query myquery

Кроме того, Вы найдете, что optparse очень легко расширить. В одном из моих проектов я создал класс Команды, который позволяет, Вы к вложенному множеству подуправляете в дереве команды легко. Это использует optparse в большой степени для цепочечных команд вместе. Это не что-то, что я могу легко объяснить в нескольких строках, но не стесняться к [1 110] обзор вокруг в моем репозитории для основного класса, а также класс, который использует его и синтаксический анализатор опции

5
задан googletorp 27 May 2010 в 14:33
поделиться

3 ответа

There are several ways to do this:

  1. Do everything from scratch: This is what theunravelers suggestion (+1) boils down to - build the form yourself, add your own validation and submit handlers and on submit, build two node objects and save them. You'll have full control/flexibility, but it is quite some work and you need to have a good understanding of Drupals inner workings to get it right.

  2. 'Overload' one of your content types with the fields needed by the other and tweak the 'overloaded' content types submit (and partially edit/display) logic to create the other content type from the additional fields, while hiding them on the 'overloaded' one on display and edit. You can find an article describing this approach here. This is a considerably easier approach than #1, but I'd consider it to be a bit 'hackish', because of the content type definition vs. display mismatch.

  3. A less 'hackish' variation of #2 would be to set up your content types normally and just manipulate the edit and submit process via hook_form_alter(). You'd do more or less the same as with approach #2, but instead of 'overloading' one node with the additional fields upfront, you'd just inject them into the edit form directly on hook_form_alter (either from scratch or by loading the edit form of the other node in the background and copying the relevant field definitions from that). On form submission, you remove those additional fields while using them to build your other node. This requires a bit more work and knowledge than #2, but should be a bit more stable and easier to adjust/maintain than that, as you do not have to deal with a content type definition vs. display mismatch.

Also, you did not specify how you want to deal with editing of existing nodes - I'd suggest adding a nodereference to one of the nodes to keep track of their association. That way, you could also add the logic to edit both nodes from one form, as well as synchronized deletion, if desired.

8
ответ дан 18 December 2019 в 13:15
поделиться

Для меня это звучит как специальная работа. Вы можете использовать Form API в своем модуле для создания формы. Посмотрите практически на любой другой модуль, чтобы увидеть примеры того, как работает Form API. Затем вы захотите создать объект $ node из всех значений этих полей и использовать node_submit () и node_save () для фактического создания различных узлов.

] Я бы посоветовал, возможно, взглянуть на модуль Webform для использования Form API и взлома процесса отправки, чтобы он создавал эти два типа узлов.

4
ответ дан 18 December 2019 в 13:15
поделиться

Вариант № 3, использующий одно из самых молодых решений при создании поля CCK nodereference, которое может указывать на несуществующий узел, и создавать его при отправке.

Node Reference Create ] выглядит одним из наиболее стабильных из этих проектов.

Автосоздание ссылки на узел и Поле ссылки на узел , похоже, имеют больше дополнительных преимуществ для определения значений в новом узле.

Это имеет дополнительное преимущество в создании ссылки на узел между модулями, которую вы можете использовать для интеграции узлов при визуализации, создания представлений и т. Д.

2
ответ дан 18 December 2019 в 13:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: