Создайте узел программно с полем местоположения cck

Я пытаюсь программно создать узел пользовательского типа содержимого «местоположение» в Drupal 6 с узлом, содержащим поле местоположения (http://drupal.org/project/location), называемое «местоположение» (да, я знаю, номенклатура может быть лучше, но я просто экспериментирую с этим в данный момент).

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

Я пытаюсь создать узел следующим образом:

        $newNode = (object) NULL;
        $newNode->type = 'location';
        $newNode->title = $locationName;
        $newNode->uid = $userId;
        $newNode->created = strtotime("now");
        $newNode->changed = strtotime("now");
        $newNode->status = 1;
        $newNode->comment = 0;
        $newNode->promote = 0;
        $newNode->moderate = 0;
        $newNode->sticky = 0;

        $newNode->field_location[0]['street'] = 'Teststraße';
        $newNode->field_location[0]['postal_code'] = '12345'; 
        $newNode->field_location[0]['city'] = 'Musterstadt'; 

        node_save($newNode);

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

Как я могу программно установить поля, связанные с местоположением?

Заранее спасибо!


person Grimtron    schedule 15.10.2010    source источник
comment
Остерегайтесь сохранения узлов с данными из модуля местоположения. Разработчики не совсем поняли API узла, и есть некоторое неожиданное поведение. См. здесь: drupal.org/node/843328   -  person Rimian    schedule 16.10.2010


Ответы (4)


Хотел добавить это как комментарий, но похоже, что вставить код в комментарий довольно проблематично. Итак, начнем: я изменил внутренние настройки, чтобы больше не использовать поле cck, а использовать параметр местоположения по умолчанию, как было предложено googletorp.

Фактический код для создания нового местоположения и назначения его новому узлу выглядит следующим образом:

$location['street'] = "myStreet";
$location['postal_code'] = "12345";
...

$newLocationId = location_save($location);

$newNode = ...
$newNode->locations[0]['lid'] = $newLocationId;

node_save($newNode);

Спасибо за руководство :)

person Grimtron    schedule 16.10.2010
comment
для друпал-7 $location = array( 'city' => $city, 'province' => $state, 'postal_code' => $zip, 'country' => 'us', ); $lid = location_save($location); if ($lid){ $node->field_location[LANGUAGE_NONE]['0'] = location_load_location($lid); } - person jibran; 05.07.2012

Вместо node_save многие рекомендуют использовать drupal_execute для программной отправки формы редактирования узла. Это дает вам преимущество проверки формы.

См. http://thedrupalblog.com/programmatically-create-any-node-type-using-drupal-execute — отличный пример использования drupal_execute. Не забудьте посмотреть комментарий http://thedrupalblog.com/programmatically-create-any-node-type-using-drupal-execute#comment-70, чтобы увидеть дополнительную информацию о полях CCK.

Преимущество drupal_execute в том, что вы также получаете проверку формы. Таким образом, после drupal_executestatement вы можете увидеть, были ли какие-либо ошибки, используя form_get_errors ( http://api.drupal.org/api/function/form_get_errors/6). См. фрагмент (вставленный ниже) с http://civicactions.com/blog/cck_import_and_update для примера использования form_get_errors

$node->type = 'yourtype';
$values = array();
$values[...] = ...;
drupal_execute('yourtype_node_form', $values, $node);
$errors = form_get_errors();
if (count($errors)) {
  // do something ...
}

Еще один очень хороший ресурс по программной отправке узлов с использованием drupal_execute можно найти по адресу http://drupal.org/node/293663<. /а>

person Sid Kshatriya    schedule 16.10.2010
comment
Это хороший совет, но я бы предпочел отделить API формы от проверки узла. Вы можете использовать операцию проверки в API узла с тем же эффектом. К сожалению, это не всегда реализовано, поэтому ваш метод, вероятно, лучший. :) - person Rimian; 16.10.2010

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

Что я сделал, чтобы заставить его работать, так это сначала сохранить местоположение (для этого есть функция API), а затем добавить идентификатор местоположения из сохраненного местоположения.

Образец кода:

Обратите внимание, что $center взят из внешнего источника, поэтому он не связан с Drupal. Я знаю, что в моем примере все мои местоположения находятся в Дании, поэтому эта часть просто жестко запрограммирована.

Если вы не используете поле CCK, вам не нужно сохранять данные о местоположении на узле, вместо этого вы можете просто сохранить местоположение и связать его самостоятельно. Это быстрое решение вместо того, чтобы запускать форму узла, как было предложено. Для сложных узлов это может быть лучшим выбором, но когда это просто, это делается быстрее.

// Update the location data.
$location = is_array($node->location) ? $node->location : array();
$location += array(
  'street' => $center->address->address2,
  'city' => $center->address->zipName,
  'postal_code' => $center->address->zip,
  'country' => 'dk',
  'country_name' => 'Denmark',
);
location_save($location);

// Insert location instance, if it's not set yet.
$criteria = array(
  ':nid' => $node->nid,
  ':vid' => $node->vid,
  ':lid' => $location['lid'],
);
if (!db_result(db_query("SELECT COUNT(*) FROM {location_instance} WHERE nid = %d AND vid = %d AND lid = %d;", $criteria))) {
  db_query("INSERT INTO {location_instance} (nid, vid, lid) VALUES (%d, %d, %d)", $criteria);
}
person googletorp    schedule 15.10.2010
comment
Звучит как возможность - я должен выяснить, подходит ли это для сайта, который я создаю. У вас случайно нет примера кода для создания местоположения и добавления идентификатора местоположения? Спасибо! :) - person Grimtron; 16.10.2010
comment
Спасибо за руководство, я сам добавил пример кода... кажется, что использовать комментарии для этого довольно сложно. - person Grimtron; 16.10.2010

Для Drupal 7 сохранение как вкладка местоположения по умолчанию.

$location = array(
  'latitude' => $row->gmapycord,
  'longitude' => $row->gmapxcord,
);
$lid = location_save($location);
if ($lid) {
  $entity->locations['0']['lid'] = $lid;
}

Вдохновлено: здесь

person hugronaphor    schedule 29.03.2013