Drupal-6: Почему этот узел не сохраняет? - PullRequest
2 голосов
/ 06 января 2010

Я построил набор узлов.После запуска их через node_save() я получаю nid и могу перейти на страницу для этого узла, но они пусты.(Никакие данные не отображаются ни для одного из полей.)

Когда я перехожу к URL редактирования для этого узла, я получаю это сообщение об ошибке:

предупреждение: call_user_func_array () [function.call-user-func-array]: Ожидается, что первый аргумент будет действительным обратным вызовом, в строке /home/odp/public_html/includes/form.inc в строке 367. задано «Bout_node_form».

Вот print_r() одного узла, который я пытаюсь сохранить:

stdClass Object
(
    [type] => Bout
    [name] => Gary Oak
    [title] => Bout - 0
    [promote] => 1
    [comment] => 2
    [revision] => 
    [format] => 0
    [status] => 0
    [field_weapon] => Array
        (
            [0] => Array
                (
                    [value] => foil
                )

        )

    [field_fencer] => Array
        (
            [0] => Array
                (
                    [uid] => 3
                )

        )

    [field_touches_scored] => Array
        (
            [0] => Array
                (
                    [value] => 4
                )

        )

    [field_meet] => Array
        (
            [0] => Array
                (
                    [nid] => Drew
                )

        )

    [field_round] => Array
        (
            [0] => Array
                (
                    [value] => 1
                )

        )

    [field_legacy_bout] => Array
        (
            [0] => Array
                (
                    [value] => no
                )

        )

    [teaser] => 
    [uid] => 1
    [created] => 1262732370
    [validated] => 1
)

Все эти узлы были запущены, хотя node_validate(), и, вероятно, это вызвало бы некоторые ошибки.Кроме того, в этом узле отсутствует необходимая таксономия, но это также не вызывает никаких сообщений об ошибках.

Вот как node_validate() был вызван:

function preview_validate($form, &$form_state) {
    $nodes_to_save = construct_nodes();

    foreach ($nodes_to_save as $node) {
        node_validate($node, $form);
        if ($errors = form_get_errors()) {
            form_set_error('', t('Validation error. No nodes saved.'));
        }
    }

    $_SESSION[CONSTRUCTED_KEY] = $nodes_to_save;
}

Вот где ошибкаиз основного файла includes/form.inc:

  // If $callback was returned by a hook_forms() implementation, call it.
  // Otherwise, call the function named after the form id.
  $form = call_user_func_array(isset($callback) ? $callback : $form_id, $args);

Узел отображается в таблице node, но не в таблице content_type_bout.

Это construct_nodes() функция:

function construct_nodes() {
    global $user;
    $file = unserialize($_SESSION[FILE_KEY]);

    $count = 0;         // how many nodes have been created?
    $success = TRUE;    // have all the nodes thus far validated?
    foreach ($file->parsed as $node) {
        $odp = new StdClass();
        $odp->type = $_SESSION[NODE_TYPE_KEY];

        if (! in_array('name', $file->matched_keys)) {
            $odp->name = $user->name;
        }

        if (! in_array('title', $file->matched_keys)) {
            $odp->title = sprintf("%s - %s", $_SESSION[NODE_TYPE_KEY], $count);
        }

        $node_type_default = variable_get('node_options_'. $_SESSION[NODE_TYPE_KEY], array('status', 'promote')); //copied from blogapi module

        $odp->promote = in_array('promote', $node_type_default);
        $odp->comment = variable_get('comment_'. $_SESSION[NODE_TYPE_KEY], 2);
        $odp->revision = in_array('revision', $node_type_default);
        $odp->format = FILTER_FORMAT_DEFAULT;
        $odp->status = CTN_DEFAULT_PUBLISHED;

        // this makes the assumption that the field arrays will always have only one item
        // doesn't handle taxonomy
        foreach ($node as $field => $value) { // $field => value:                           [Touches scored] => 5
            $node_key = $file->matched_keys[$field]; // $node_key will be something like:   "field_meet" or "vid:4"
            $vid = vidOfTaxKey($node_key);
            if ($vid == NULL) {
                $valTypes = $_SESSION[SAMPLE_NODE_KEY]->$node_key; // like:     [0] => Array ( [uid] => 3 )
                $valType = array_keys($valTypes[0]);
                $odp->$node_key = array(array($valType[0] => $value));
            }
        }

        $to_save[] = $odp;
        $count++;
        unset($submitted_odp);
    }
    return $to_save;
}

bout - это тип содержимого, определенный CCK.Я считаю, что использование человеческого типа «Bout» вместо внутреннего кодового имени bout явилось источником ошибки.

Ответы [ 3 ]

4 голосов
/ 26 января 2010
  1. где определен этот пользовательский тип контента? в пользовательском модуле или через Администрирование> Содержимое> Типы содержимого> Добавить тип содержимого ? это вообще определено? если нет, то неудивительно, что вы получаете эту ошибку: как Drupal должен знать, из чего состоит этот тип контента и как визуализировать его вид и редактировать формы? попробуйте определить его в любом случае.

  2. имена пользовательских типов контента (узла) ([type] => Bout) должны содержать только строчные буквы, цифры и подчеркивания . попробуйте изменить Bout на bout.

см. Также Как создать узел из задания cron в drupal? и http://drupal.org/node/178506#comment-895418 (весь поток).

0 голосов
/ 06 февраля 2010

$ узел [ 'типа'] = 'бой'; НЕ $ node ['type'] = 'Bout';

Подтвердите, что у вас нет проблем с простыми заглавными буквами.

0 голосов
/ 06 января 2010

попробуйте

<?php
$new_blognode = new stdClass();
$new_blognode->type = 'blog';
module_load_include('inc', 'node', 'node.pages');
$output .= drupal_get_form('blog_node_form', $new_blognode);
?>

обратите внимание, что вы должны изменить это в соответствии с вашими потребностями

...