Автоматическое создание материала с таксономией

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

Аватар пользователя slavik.kz slavik.kz 20 марта 2008 в 20:49

Здравствуй, сообщество.
Не хватает чёткого faq по автоматическому созданию материалов (node)

Проблема с этим: создаю автоматом ноду

$node = array('type' => 'news');

$form_values = array(
'title' => $title,
'body' => $body,
'path' => $path, // можно не использовать, автоалиасы сделают своё дело
'format'=> 2,
'field_author' => array(array('value'=>'Иванов Иван')), // cck поле, сохраняется нормально
'name' => $name, // имя автора
'uid'=>1
);
drupal_execute('news_node_form', $form_values, $node);

Проблема, как создать ноду: а) с существующим термином словаря, б) с новым термином словаря.
перепробовал много кодов (массивы taxonomy и так и сяк), то есть хотелось бы увидеть примерчик записи (как пример, словарь "города", термин "москва", куда, как брать nid, vid терминов)

Комментарии

Аватар пользователя neochief neochief 20 марта 2008 в 23:31

во времена шальной молодости я втупую вставлял все в базу прямыми INSERT'ами Smile база там простая, на первых порах разобраться намного проще чем в API. В последствии уже использовал API (но ностальгия осталась)))

Код найден на просторах drupal.org

$edit = new StdClass();

$edit->uid = $doc->uid;
$edit->title = $doc->title;

if ( $doc->month && ! $doc->generated_date ) {
$edit->created = mktime ( 0, 0, 0, $doc->month, $doc->day, $doc->year);
$edit->changed = $edit->created;
}
$edit->status = 1;
$edit->promote = 0;
$edit->sticky = 0;
$edit->path = $doc->path;
$edit->taxonomy = array();
$edit->body = ($doc->have_text ? $doc->text : "");
$edit->type = $doc->type;
$edit->format = 3;
node_save($edit);

А судя по этой функции в дальнейшем вам надо использовать taxonomy_node_save().

Помог чем успел, но должен бежать, удачи и поиск вам в помощь Wink

Аватар пользователя andreypaa andreypaa 21 марта 2008 в 10:00

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

Аватар пользователя slavik.kz slavik.kz 21 марта 2008 в 12:35

Немного упрощу вопрос (отброшу создание новых терминов)

как в это место $edit->taxonomy = array();
вписать то что выдаёт devel для существующих материалов

taxonomy

Array
(
[13] => stdClass Object
(
[tid] => 13
[vid] => 3
[name] => Москва
[description] =>
[weight] => 0
)

[14] => stdClass Object
(
[tid] => 14
[vid] => 3
[name] => Париж
[description] =>
[weight] => 0
)
)

$edit->taxonomy = array('13');
$edit->taxonomy = array('Москва'); - как вписать-то?

для создания новых терминов нужен nid (в taxonomy_node_save), как ловко получить его из только что созданной ноды, при условии, что в этот момент могли создаться ноды другого типа?

p.s. автоматическое создание нод внешним скирптом
p.p.s. нода вставляется - проблема только с терминами таксономии.

Аватар пользователя goodboy goodboy 21 марта 2008 в 13:11

Может, так получится?

<?php
$tdata = new stdClass();
$tdata->tid = 13;
$tdata->vid = 3;
$tdata->name = 'Москва';
$tdata->description = '';
$tdata->weight = 0;

$edit->taxonomy[13] = $tdata;
?>

Аватар пользователя slavik.kz slavik.kz 21 марта 2008 в 15:08

хм, побороть баг не удалось, хотя если не использовать drupal_execute, а воспользоваться node_submit($node); node_save($node);

определил все поля, taxonomy:

$node['taxonomy'] = array($vid=>array($tid)); где $vid - id словаря, $tid - массив id существующих терминов.

Аватар пользователя neochief neochief 21 марта 2008 в 17:06

для создания новых терминов нужен nid (в taxonomy_node_save), как ловко получить его из только что созданной ноды

node_save($node); при сохранении дозаполняет $node, поэтому вы можете брать nid сразу же из $node->nid