[РЕШЕНО] Внешний add node

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

Аватар пользователя mrdakotas mrdakotas 4 июня 2011 в 17:52

Здравствуйте!
Хочу спросить, есть ли какие нибудь готовые решения удаленного (внешнего) добавления нод в друпал?
Пытаюсь решить такую задачу, на основе внешнего скрипта.
Нужно в него POST методом отправить такие данные:

- имя материала
- тело материала
- тип ноды
- и несколько дополнительных полей

после этого скрипт добавляет в базу эту запись и публикует ее.

Подскажите пожалуйста, может какие хуки или api и хоть примерно как с ними разобраться!
Или может есть другое решение подобной задачи?
Буду очень благодарен!

Комментарии

Аватар пользователя CSoft CSoft 4 июня 2011 в 18:38

"mrdakotas" wrote:
Подскажите пожалуйста, может какие хуки или api и хоть примерно как с ними разобраться!

[ru-api=drupal_execute]drupal_execute[/ru-api]

Второй пример кода на странице.

Аватар пользователя mrdakotas mrdakotas 4 июня 2011 в 18:51

"CSoft" wrote:
drupal_execute
Второй пример кода на странице.

Спасибо Вам огромное!

К стати как раз почти решил эту проблему с помощью node_save($node) с использованием CCK

Вот пример, может и пригодится еще кому то:

<?php
include_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

// Construct the new node object.
$node = new stdClass();

$node->title "Your node title";
$node->body "The body text of your node.";
$node->type 'rpc';
$node->created time();
$node->changed $node->created;
$node->status 1// Published?
$node->promote 0// Display on front page?
$node->sticky 0// Display top of page?
$node->format 1// Filtered HTML?
$node->uid 1// Content owner uid (author)?
$node->language 'ru';

/* **************
CCK date fields
format dates as shown in your content_type's data table
Mine were: 2008-12-25T00:00:00

************** */

$today mktime(0,0,0date("m"),date("d"),date("Y"));
$cck_today date("Ymd") . "T00:00:00";

$node->field_abc_date_joined[0]['value'] = $cck_today;

/* **************
CCK reference fields

$node->['field_name'][0]['uid'] = 3;
$node->['field_name'][0]['nid'] = 125;
************** */

$node->field_abc_user_ref_uid[0]['uid'] = 1;

/* **************
CCK select fields using the options widget
$node['field_name']['key'] = 'your value';
or if it's multiple select: $node['field_name']['keys'] = array('your value').
************** */
$node->field_abc_intern_status['key'] = 'trainee';
$node->field_abc_certified_value['key'] = 'no';

/* **************
CCK regular text fields
$node['field_name'][0]['value'] = 'your value';
************** */
$node->field_abc_member_status[0]['value'] = 'volunteer';

node_submit($node);
node_save($node);?>

Но при использовании этого кода, нода почему то добавлялась дважды! Пока не могу понять почему!

Аватар пользователя mrdakotas mrdakotas 4 июня 2011 в 19:22

"CSoft" wrote:
drupal_execute
Второй пример кода на странице.

Только что пробовал Ваш вариант.
Не понимаю почему, но обратно та же проблема. Публикуется два поста.
Если ставлю в настройках скрипта существующего пользователя, то пдобавляется один пост от неги и один от "Гость".
Если ставлю не существующего, то добавляется один пост но в админке потом ошибка типа "Пользователя такого-то не существует!".

Перед этим кодом ставил:

include_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

Что-то не правильно делаю?
Подскажите пожалуйста!

Аватар пользователя mrdakotas mrdakotas 4 июня 2011 в 19:43

"Dmitriy.ua" wrote:
Оставте что то одно)

Пробовал!
Если убрать node_save($node) - то вообще ничего не сохраняется!
Если убрать node_submit($node) и оставить только node_save($node) то точно такой-же результат (2 добавления)

Мне кажется проблема в

include_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

Я просто толком не знаю что там должно подключатся!

Аватар пользователя CSoft CSoft 4 июня 2011 в 20:21

"Dmitriy.ua" wrote:
Оставте что то одно)

Вы точно знаете, для чего предназначена функция node_submit? Раз даёте такой совет.

mrdakotas, жалко, времени нет посмотреть нормально, странная у Вас проблема. Я помню делал такую задачу и всё было нормально... Что-то делаете не так.

Аватар пользователя Dmitriy.ua Dmitriy.ua 4 июня 2011 в 21:55

CSoft wrote:
"Dmitriy.ua" wrote:
Оставте что то одно)

Вы точно знаете, для чего предназначена функция node_submit? Раз даёте такой совет.

mrdakotas, жалко, времени нет посмотреть нормально, странная у Вас проблема. Я помню делал такую задачу и всё было нормально... Что-то делаете не так.

Незнаю, заглянул в один свой старый скрип тупого парсера в отдельном файле, стоит только node_save(&$node); еще есть

require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

и

require_once './modules/system/system.install';
require_once './includes/file.inc';

зачем

require_once './modules/system/system.install';

непомню и сомневаюсь что оно нужно.

Аватар пользователя mrdakotas mrdakotas 4 июня 2011 в 20:34

"CSoft" wrote:
Что-то делаете не так.

Хочу напомнить что это все делается в внешнем отдельном php скрипте (независимый файлик).
Такое чувство что

include_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

дважды вызывает его!

Но это лисшь догадки(
Я хоть правильный инклуд подключаю?

Возможно нужно

node_submit($node);
node_save($node);

Запихнуть в отдельную какую не будь функцию (чтобы избежать повторной интерации)?

Аватар пользователя CSoft CSoft 4 июня 2011 в 20:37

"mrdakotas" wrote:
Хочу напомнить что это все делается в внешнем отдельном php скрипте (независимый файлик).

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

Хотя, я пока что не совсем понял, как у Вас всё вообще устроено. И что подразумевается под "внешним" файлом? Подробнее, плиз.

Аватар пользователя mrdakotas mrdakotas 4 июня 2011 в 21:25

"CSoft" wrote:
Хотя, я пока что не совсем понял, как у Вас всё вообще устроено. И что подразумевается под "внешним" файлом? Подробнее, плиз.

Будет post.php
Пишу его для того чтобы внешние публикации отсылать в него post запросами.
Поэтому решил что внешним файликом будет удобнее, так как пользователя как такового не будет, а будет указываться только $node->uid = 1; (допустим).
То есть никаких кук не надо, просто отправка пост запроса с конкретной информацией.
Если это можно решить с помощью написания модуля, то еще лучше!
Но скажу сразу, я не слишком силен в написании модулей, буду очень благодарен если хоть покажите где путь праведный!)

Аватар пользователя CSoft CSoft 4 июня 2011 в 21:36

"mrdakotas" wrote:
Если это можно решить с помощью написания модуля, то еще лучше!

Можно.

Теперь ещё раз - словесная постановка задачи. Что вообще конкретно делаете? Я до сих пор не понял Smile То есть, обычным языком напишите, что за задача стоит. Откуда отсылается запрос на добавлении ноды, зачем это делается и так далее.

Я без полного понимания вопроса не знаю, что именно подсказать. У меня складывается такое ощущение, что Вы городите ненужный огород Smile

Аватар пользователя mrdakotas mrdakotas 4 июня 2011 в 21:44

На счет огорода, это 100% с Вами согласен!)))) Некуда деваться просто!)
Сейчас попробую объяснить!)

Есть несколько блогов на WordPress!
Есть один сайт на Drupal.

Задача такая:
Нужно синхронно добавлять материалы публикуемые на блогах WordPress прямо на Drupal!

Сначала хотел все реализовать на XML-RPC. Не осилил! Понял что это слишком уж много заморочек!(
Решил хакнуть ВордПресс, чтоб при публикации отдельно отсылался материал пост запросом на друпаловский скрипт, который будет публиковать его в друпале!

Вот так вот!)
Может есть идеи по лучше?
Или идеи реализации того что я уже начал городить?))

Аватар пользователя ihappy ihappy 4 июня 2011 в 21:48

"CSoft" wrote:
Вы точно знаете, для чего предназначена функция node_submit? Раз даёте такой совет.

node_submit лишний.
"mrdakotas" wrote:
Но при использовании этого кода, нода почему то добавлялась дважды! Пока не могу понять почему!

Убери node_submit. А так все верно.
Но через модуль будет правильней делать.

Аватар пользователя mrdakotas mrdakotas 4 июня 2011 в 21:49

"iHappy" wrote:
Убери node_submit.

"mrdakotas" wrote:
Если убрать node_submit($node) и оставить только node_save($node) то точно такой-же результат (2 добавления)

Аватар пользователя CSoft CSoft 4 июня 2011 в 21:53

"iHappy" wrote:
node_submit лишний.

С чего Вы взяли? Вы, как и предыдущий оратор, думаете, что эта функция сабмитит ноду?

В ситуации ТС эту функцию можно и убрать, да, но это ничего не решит.

Аватар пользователя CSoft CSoft 4 июня 2011 в 21:56

"mrdakotas" wrote:
Сейчас попробую объяснить!)

Ясно. Тогда делать свой модуль. А там уже реализовать любые из приведённых выше решений.

Ссылку на урок тоже дал.

Аватар пользователя CSoft CSoft 4 июня 2011 в 21:58

"Dmitriy.ua" wrote:
Незнаю

[ru-api=node_submit]node_submit[/ru-api]

"Dmitriy.ua" wrote:
еще есть

Это всё не нужно. Пусть ТС создаёт свой модуль, как и положено.

Аватар пользователя ihappy ihappy 4 июня 2011 в 22:01

"CSoft" wrote:
С чего Вы взяли? Вы, как и предыдущий оратор, думаете, что эта функция сабмитит ноду?
В ситуации ТС эту функцию можно и убрать, да, но это ничего не решит.

Эта функция нужна раз в триста лет.И в данном случае свои фукнуции не выполняет.

"mrdakotas" wrote:
Если убрать node_submit($node) и оставить только node_save($node) то точно такой-же результат (2 добавления)

это весь код?

<?phpinclude_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

// Construct the new node object.
$node = new stdClass();

$node->title = "Your node title";
$node->body = "The body text of your node.";
$node->type = 'rpc';
$node->created = time();
$node->changed = $node->created;
$node->status = 1; // Published?
$node->promote = 0; // Display on front page?
$node->sticky = 0; // Display top of page?
$node->format = 1; // Filtered HTML?
$node->uid = 1; // Content owner uid (author)?
$node->language = 'ru';

/* **************
CCK date fields
format dates as shown in your content_type's data table
Mine were: 2008-12-25T00:00:00

************** */
$today = mktime(0,0,0, date("m"),date("d"),date("Y"));
$cck_today = date("Ymd") . "T00:00:00";

$node->field_abc_date_joined[0]['value'] = $cck_today;

/* **************
CCK reference fields

$node->['field_name'][0]['uid'] = 3;
$node->['field_name'][0]['nid'] = 125;
************** */

$node->field_abc_user_ref_uid[0]['uid'] = 1;

/* **************
CCK select fields using the options widget
$node['field_name']['key'] = 'your value';
or if it's multiple select: $node['field_name']['keys'] = array('your value').
************** */
$node->field_abc_intern_status['key'] = 'trainee';
$node->field_abc_certified_value['key'] = 'no';

/* **************
CCK regular text fields
$node['field_name'][0]['value'] = 'your value';
************** */
$node->field_abc_member_status[0]['value'] = 'volunteer';

node_submit($node);
node_save($node);?>

или что то за бортом оставили? А где скрипт отправки пост запроса?

Аватар пользователя mrdakotas mrdakotas 4 июня 2011 в 22:04

Спасибо большое всем за помщь!
Приступил к созданию модуля!

Только не очень понимаю куда мне отправлять пост запрос?
Что примерно должно быть в модуле описывающее адрес интерации нашего скрипта постинга?

Аватар пользователя CSoft CSoft 4 июня 2011 в 22:05

"iHappy" wrote:
Эта функция нужна раз в триста лет.

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

"iHappy" wrote:
И в данном случае свои фукнуции не выполняет.

Просто не нужна. Всё вышеназванное ТС сделал руками.

Аватар пользователя mrdakotas mrdakotas 4 июня 2011 в 22:06

"iHappy" wrote:
это весь код?

Да, это основа!
"iHappy" wrote:
А где скрипт отправки пост запроса?

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

Аватар пользователя mrdakotas mrdakotas 4 июня 2011 в 22:10

"CSoft" wrote:
Возможно, что и важно, раз нода создаётся в количестве двух штук :)

Ну в данном случае я скрипт запускал руками. То есть повторная интерация по какой то другой причине кроме самого трабла в скрипте - исключена!

Аватар пользователя mrdakotas mrdakotas 5 июня 2011 в 0:04

"CSoft" wrote:
Прикрепите-ка его к комментарию, посмотрю.

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

Вышло примерно так:

<?php
function dacopost_help($path, $arg) {
  $output = '';
  switch ($path) {
    case "admin/help#dacopost":
      $output = '<p>'.  t("Displays information about site") .'</p>';
      break;
  }
  return $output;
} // function dacopost_help

function dacopost_perm() {
  return array('access dacopost content', 'access administration pages');
} // function dacopost_perm()

function dacopost_menu() {
  $items = array();

  $items['admin/settings/dacopost'] = array(
    'title' => 'dacopost module settings',  //Заголовок страницы
    'description' => 'Description of your dacopost settings page', //Описание
    'page callback' => 'drupal_get_form', //Функция отображающая страницу, мы создаем
//форму, поэтому используем системную функцию
    'page arguments' => array('dacopost_admin'), //Содержимое формы
    'access arguments' => array('access administration pages'), //Права доступа, если дать
//анонимусам право 'access administration pages', они смогут админить наш модуль.
    'type' => MENU_NORMAL_ITEM, //Нормальный пункт меню
   );
  return $items;
}

function dacopost_admin() {
   // Construct the new node object.
$node = new stdClass();

$node->title = "Modul posts";
$node->body = "Superposts";
$node->type = 'rpc';
$node->created = time();
$node->changed = $node->created;
$node->status = 1; // Published?
$node->promote = 0; // Display on front page?
$node->sticky = 0; // Display top of page?
$node->format = 1; // Filtered HTML?
$node->uid = 1; // Content owner uid (author)?
$node->language = 'ru';

node_submit($node);
node_save($node);

}

Сильно не бейте, я учусь)

----------

Поправил, первый раз не правильный вариант кода вставил!

Аватар пользователя CSoft CSoft 5 июня 2011 в 0:41

Ох и ужас Lol Брр Smile

Делается элементарная проверка такого рода:

<?php

function dacopost_menu() {
  $items['dacopost'] = array (
    'title' => 'dacopost',
    'page callback' => 'dacopost_node_add',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function dacopost_node_add() {
  $node = new stdClass();
         
  $node->title = 'Modul posts';
  $node->body = 'Superposts';
  $node->type = 'page';
  $node->created = time();
  $node->changed = $node->created;
  $node->status = 1; // Published?
  $node->promote = 0; // Display on front page?
  $node->sticky = 0; // Display top of page?
  $node->format = 1; // Filtered HTML?
  $node->uid = 1; // Content owner uid (author)?
  $node->language = 'ru';
       
  node_save($node);
}

Сохраняем код в файл модуля, чистим кэш. Заходим на страницу /dacopost. Страница загружается пустой. Потом идём в /admin/content/node/overview и видим, что добавилась одна нода.

У Вас это так?

Аватар пользователя CSoft CSoft 5 июня 2011 в 1:07

Это что-то из области фантастики уже. У меня одна нода создаётся, как и положено.

Сайт на хостинге? Можно доступ к нему?

Аватар пользователя mrdakotas mrdakotas 5 июня 2011 в 1:42

"CSoft" wrote:

Это что-то из области фантастики уже.

Поставил тот же модуль на новый движок на другом сервере...
Таже хрень...
Уже крыша едет....(((

Аватар пользователя CSoft CSoft 5 июня 2011 в 1:54

Вы меня прям напугали.

Ещё раз. Заходим на страницу /dacopost. Загрузилась страница, то есть нода создалась.

/admin/content/node

проверяем тут - добавилась одна нода. Если у Вас всё равно добавится две, то Вы - волшебник Lol

Удалил все материалы на сайте, убедитесь ещё раз, что всё работает.

Меня интересует другой вопрос - как Вы делаете, что их две создаётся... Как ещё по-другому можно мою инструкцию воспроизвести? Smile

Аватар пользователя mrdakotas mrdakotas 5 июня 2011 в 2:04

"CSoft" wrote:
Если у Вас всё равно добавится две, то Вы - волшебник :)))

Ахахаха)))
Видимо так!))

Ну честное слово, не знаю как так получается....?(
Уже на разных движках и на разных серверах пробовал!(
Неужели это из-за браузера может быть?

Аватар пользователя mrdakotas mrdakotas 5 июня 2011 в 2:20

"CSoft" wrote:
И в результате +2 ноды?

Да! Smile

Я очень извиняюсь, по ходу нашел ошибку...

Дело в браузере!
Работал из FireFox, ошибка повторялась, попробовал через Opera все нормально, добавилась одна!
Я в шоккке....(

Аватар пользователя CSoft CSoft 5 июня 2011 в 2:29

Я оперщик.

Сейчас попробовал с файр фокса - всё нормально тоже.

Но я обратил внимание, что список нод также пуст, каким я его и оставил. Видимо, дальнейшие эксперименты проводились на локалке?

Аватар пользователя mrdakotas mrdakotas 5 июня 2011 в 2:36

"CSoft" wrote:
Видимо, дальнейшие эксперименты проводились на локалке?

Почти!) На другом сервере!
Но на нем такие же траблы были из Фаерфоксом!
Сейчас с Оперой вроде все норм!

Аватар пользователя CSoft CSoft 5 июня 2011 в 12:39

3.6.13 и 4.0.1 - всё отлично.

Короче, такое ощущение, что проблема только у Вас.

Кстати, этот модуль, что я сделал, нельзя использовать по сути. Если кто будет знать его адрес, то сможет плодить ноды как ему вздумается. Нужно как-то продумать с правами на запись. Права, которые непосредственно в модуле описываются, тут ничего не дадут, ибо вызов страницы не пользователем делается, а автоматикой - запросом с другого сайта.

Думаю, можно в POST передавать для проверки какое-нибудь ключевое слово и проверять в модуле, чтобы оно совпадало с заданным.

Аватар пользователя mrdakotas mrdakotas 5 июня 2011 в 13:37

"CSoft" wrote:
Думаю, можно в POST передавать для проверки какое-нибудь ключевое слово

Да-да! Именно так я и задумал.
Но там немного хитрее будет! Что то типа динамического хеша.

"CSoft" wrote:
Короче, такое ощущение, что проблема только у Вас.

Выходит что да!
Возможно это из-за каких то включенных плагинов в FF.
К стати читал на орговском форуме, тоже у некоторых наблюдались такие проблемы, которые в итоге так и не решались!

Если найду 100% аргумент трабла, то обязательно отпишу! И все же думаю собака зарыта где то в FF...(

P.s.: CSoft, Огромное Вам спасибо за помощь и терпеливость! Smile

Аватар пользователя mrdakotas mrdakotas 5 июня 2011 в 14:09

"CSoft" wrote:
приятно делиться опытом

Еще приятнее когда есть такие добрые люди, которые готовы пожертвовать своим временем и знаниями!)