Я хотел бы программно (с помощью php) заполнить существующую форму drupal, чтобы создать тип контента, который включен в дополнительный модуль.
Подробности: это модуль SimpleFeed, а тип контента - Feed. Для этого я хотел бы вызвать функции модуля. Меня интересует метод hook_insert, который, по-видимому, требует vid и nid, а я не уверен, что это такое.
Любая помощь приветствуется.






не могли бы вы предоставить немного больше информации (какие модули?). как правило, я бы, вероятно, предложил вызывать функции модулей для создания типа контента, вместо того, чтобы пытаться передать его через форму программно. Таким образом, вам не нужно беспокоиться о реализации и вы можете быть уверены, что, если модуль работает, он будет работать и для вашего скрипта :)
конечно, это привязывает ваш модуль к их модулю, поэтому любые изменения в их функциях могут повлиять на ваши. (но опять же, вы рискуете, если они тоже обновят структуру своей базы данных)
бывший.
// your file.php
function mymodule_do_stuff() {
cck_create_field('something'); // as an example, i doubt this
// is a real CCK function :)
}
редактировать: vid и nid - это идентификаторы узла, vid - это идентификатор редакции, а nid - это первичный ключ конкретного узла. поскольку это реальный узел, вам, возможно, придется выполнить две операции.
программно создать узел
вам нужно будет ссылаться на базу данных для всех точных полей (таблицы node и node_revisions), но это должно дать вам базовый рабочий узел:
$node = (object) array(
'nid' => '', // empty nid will force a new node to be created
'vid' => '',
'type' => 'simplefeed'. // or whatever this node is actually called
'title' => 'title of node',
'uid' => 1, // your user id
'status' => 1, // make it active
'body' => 'actual content',
'format' => 1,
// these next 3 fields are the simplefeed ones
'url' => 'simplefeed url',
'expires' => 'whatever value',
'refresh' => 'ditto',
);
node_save($node);
теперь я считать он должен автоматически вызывать hook_insert() simplefeed на этом этапе. если нет, то переходите к 2. но я бы проверил, сработало ли это уже.
назовите это сами!
simplefeed_insert($node);
edit2: drupal_execute() тоже неплохая идея, так как вы можете вернуть некоторую валидацию, но таким образом вам не придется иметь дело с API форм, если вам это неудобно. Я почти уверен, что node_save() в любом случае вызывает все хуки, так что вам действительно нужно сделать только шаг 1 в этом методе.
API drupal предоставляет drupal_execute () именно для этого. Я бы посоветовал вам избегать прямого вызова функций для создания узла (если нет причин для производительности). При использовании drupal_execute () будут вызываться все нужные хуки в других модулях, и ваш код, скорее всего, продолжит работать в будущих версиях drupal.
Обратите внимание, что классическая ошибка при использовании этого метода заключается не в первом вызове чего-то вроде
module_load_include('inc', 'node', 'node.pages')
который загрузит код для вашей формы создания узла.
Вызов node_save напрямую обычно считается устаревшим и может привести к поломке кода в будущих версиях drupal.
Хороший пример есть на этот колыбельный пост
Я должен был быть более ясным. Я не слышал, что node_save устарел, но использовать его для решения проблем такого типа - нет. У меня было несколько разговоров о drupal irc, где мне сказали, что node_save был старым способом решения этой проблемы, а drupal_execute - новым способом.
В комментариях на lullabot.com/articles/quick_and_dirty_cck_imports есть хорошее обсуждение того, когда использовать каждый.
у вас есть ссылка на это? node_save - это то, как drupal создает узлы, я не видел никаких признаков того, что они переходят на другую модель.