Сменить тип материала у постов одного пользователя

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

Аватар пользователя mary_abc mary_abc 4 июня 2011 в 15:41

Здравствуйте,
проблема вот в чем: регистрация была не закрыта, спам-бот за день наделал 5 тыс. записей в блоге, хотелось бы теперь не просто удалить все эти посты, а сменить тип материала у них и в идеале сделать пустыми (оставив, например, только заголовки), чтобы использовать в дальнейшем, заполняя эти ноды. Возможно ли это как-то осуществить?
Спасибо!

Комментарии

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

Таблица "node" в базе данных. Отфильтровать записи по uid пользователя и поменять тип материала на нужный.

Это минимум. Нужно ешё смотреть на другие установленные модули, например, CCK, ибо может понадобиться делать перенос из таблиц с именами content_type_xxx.

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

смотрим в сторону node_load и в сторону node_save.
Сначала загружаем нужную ноду, потом пересохраняем в нужный тип ноды и все.

Аватар пользователя ihappy ihappy 6 июня 2011 в 10:35

"CSoft" wrote:
Это несомненно проще, чем выполнить один единственный запрос к базе данных.

Это легче, чем
"CSoft" wrote:
Таблица "node" в базе данных. Отфильтровать записи по uid пользователя и поменять тип материала на нужный.
Это минимум. Нужно ешё смотреть на другие установленные модули, например, CCK, ибо может понадобиться делать перенос из таблиц с именами content_type_xxx.

И я не говорю о том, что этот за этот вариант руки рубить надо.

Аватар пользователя CSoft CSoft 6 июня 2011 в 13:01

"iHappy" wrote:
И я не говорю о том, что этот за этот вариант руки рубить надо.

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

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

Ну Вы даёте Smile Не понял только, причём тут drupal-way. Нет, я тоже люблю работать максимально корректно и учитывать идеологию Друпала. Несомненно.

Только в данном случае, чтобы 1(!) раз поменять тип нод, я элементарно зайду в phpmyadmin и выполню один единственный UPDATE-запрос.

Между прочим, я так делал сто раз, и даже своему клиенту модуль написал для этих целей. Когда скачал вышеназванный "node_convert", то совсем не удивился, что их идея и моя - полностью совпадают.

Так что, не знаю, что Вы мне пытаетесь доказать, но веских доводов я пока не увидел. Ещё раз повторю своей ответ по вопросу: друпал тут не нужен, просто выполнить в лучшем случае 1 SQL-запрос (по ситуации).

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

"iHappy" wrote:
один ли раз?

Если судить по словам ТС'а:

"mary_abc" wrote:
регистрация была не закрыта, спам-бот за день наделал 5 тыс. записей в блоге

то один.

Если нет, то всё равно делается модуль с запросом(ами) к базе, а не с функциями node_load и node_save... Хотя, модуль и так уже дали в четвёртом сообщении.

Ну всё, харе тему мусолить Smile

Аватар пользователя ihappy ihappy 9 июня 2011 в 2:19

"CSoft" wrote:
Если нет, то всё равно делается модуль с запросом(ами) к базе, а не с функциями node_load и node_save... Хотя, модуль и так уже дали в четвёртом сообщении.

Нуу посмотрев бегло модуль, там все таки используются node_load и node_save.
Правда и запросы к БД используются. Не сразу ясно что и куда там.Не когда разбираться.

"CSoft" wrote:
Ну всё, харе тему мусолить :)

согласен)

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

"iHappy" wrote:
И я не говорю о том, что этот за этот вариант руки рубить надо.

+1

"CSoft" wrote:
Между прочим, я так делал сто раз, и даже своему клиенту модуль написал для этих целей. Когда скачал вышеназванный "node_convert", то совсем не удивился, что их идея и моя - полностью совпадают.

Оно как раз совпадает с вариантом iHappy:

"iHappy" wrote:
смотрим в сторону node_load и в сторону node_save.
Сначала загружаем нужную ноду, потом пересохраняем в нужный тип ноды и все.

т.к. вызывает на каждую конвертацию node_load, node_save.
А в вашем варианте не будет вызвани ни онид хук, что может порушить архитектуру.

Аватар пользователя CSoft CSoft 9 июня 2011 в 13:19

Повторяю в десятый раз - если сайт простой, то вообще сделать всё через phpmyadmin. Если нет - использовать модуль, указанный выше.

"Dan" wrote:
+1

Друзья, вы читатели или писатели? Не пойму ни фига.

"Dan" wrote:
А в вашем варианте не будет вызвани ни онид хук, что может порушить архитектуру.

Зачем Вы рассказываете мне то, что я прекрасно знаю... Я кажется русским языком написал, что если простая ситуация - нет смысла для неё рисовать мегамодуль, а проще выполнить один SQL-запрос.

Хватит уже тереть элементарные вещи. ТС вообще исчез, а вы тут мне доказываете что-то, не услышав меня в свою очередь.

Аватар пользователя zolexiy@drupal.org zolexiy@drupal.org 9 июня 2011 в 13:37

напрямую лезть и править в пхпадмин не стоит, даже если сайт простой. Думаю что как минимум там есть одно сск-поле, а это уже существенно усложняет ваш вариант.. это делается только node_load - node_save... это и проще и правильней, и от трабл избавит... точка. про какой мегамодуль вы говорите, там пару строчек кода будет...

кстати, сделав ноде_лоад - легко можно сделать и то что топикстартер хочет в идеале Wink ... или вы тоже будете в пхпадмине это делать?

Аватар пользователя zolexiy@drupal.org zolexiy@drupal.org 9 июня 2011 в 13:51

вот - как-то так:

        $query = db_query("SELECT `nid` FROM {node} WHERE `uid` = %d AND `type` = %s", $uid, $type); // $uid - уид этого бота , $type - тип контента
        while ($nid = db_result($query)) {
          $content = node_load($nid);
          $content->uid = 1; //это типа делаем автором админа, а не бота
          $content->body = ''; //чистим тексты
          $content->type = 'new_type';
          node_save($content);
        }
Аватар пользователя Dan Dan 9 июня 2011 в 14:15

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

Если бы обсуждали за кружкой пива, то и вправду, беседа затянулась, но тут форум, на который придёт куча новичков в гугла, которые не смогут отличить простую ситуацию от непростой, залезут в БД, потом будут жаловаться на необъяснимые глюки и им никто не сможет помочь, в том числе вы.

Аватар пользователя zolexiy@drupal.org zolexiy@drupal.org 9 июня 2011 в 14:20

Dan, верно... плюс он сбивает новичка с правильного пути. Если сам делаешь не правильно, то не нужно учить и других делать так. Тут же сообщество и нужно помогать понять друпал, а не костылями все делать, как проще

Аватар пользователя ihappy ihappy 9 июня 2011 в 14:33

"CSoft" wrote:
Я кажется русским языком написал, что если простая ситуация - нет смысла для неё рисовать мегамодуль, а проще выполнить один SQL-запрос.

Модуль на 10 строк кода)
Как и сказали выше,
"Dan" wrote:
А в вашем варианте не будет вызвани ни онид хук, что может порушить архитектуру.

Причем даже если нету ССК поля.
И конечно же это тоже верно
"Dan" wrote:
но тут форум, на который придёт куча новичков в гугла, которые не смогут отличить простую ситуацию от непростой, залезут в БД, потом будут жаловаться на необъяснимые глюки и им никто не сможет помочь, в том числе вы.

Вот это я и имел виду.

Нельзя советовать такие кастомные решения.

Аватар пользователя CSoft CSoft 9 июня 2011 в 16:08

Забавно. Каждый из вас даёт одно и то же решение, но ни один не проверил его на деле. ок, объясняю.

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
напрямую лезть и править в пхпадмин не стоит, даже если сайт простой.

Что вы говорите. Да, нужно для этого сделать модуль! Правильно xD

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
Думаю что как минимум там есть одно сск-поле, а это уже существенно усложняет ваш вариант..

Он его усложняет ровно на то, что я написал ещё в первом своём сообщении:

"CSoft" wrote:
Нужно ешё смотреть на другие установленные модули, например, CCK, ибо может понадобиться делать перенос из таблиц с именами content_type_xxx.

То есть, усложнение на целые полбалла из десяти.

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
это делается только node_load - node_save... это и проще и правильней, и от трабл избавит...

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

Если следовать вашему совету, обратите внимание на то, что в таблице "content_type_старый-тип-данных" нода почему-то осталась прописана! Фантастика, согласитесь? Вы же умные такие и рассказываете, как некорректно я тут советую всем.

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
кстати, сделав ноде_лоад - легко можно сделать и то что топикстартер хочет в идеале Wink ... или вы тоже будете в пхпадмине это делать?

Буду. По вышеназванной причине, которую никто из вас троих не посмотрел.

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
плюс он сбивает новичка с правильного пути

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

Короче говоря, если вы так яро защищаете корректность своего метода, то объясните мне, почему при "смене типа" таким образом старые данные остаются в таблице, когда их там не должно быть. Повторяюсь - если пользователь новичок, нефиг ему лезть в базу. Есть модуль, указанный в начале темы, пользуйтесь им. Кстати, опять же, никто не соизволил посмотреть, что в этом модуле для смены типа ноды сделано всё то, что я написал ещё в первом(!!!) сообщении данной темы.

А ваш node_load, $node->type = 'new_type', node_save всего-навсего в таблице node прописывает новый тип и в таблице content_type_новый-тип прописывает ноду. А этого не достаточно.

P. S. Интересно, вы и дальше будете кричать, что я не прав или нет... Безумно интересно. Хотя... Мне надоело это мусолить.

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

Да, кстати. Я ещё кое-что забыл сказать.

"mary_abc" wrote:
спам-бот за день наделал 5 тыс. записей в блоге, хотелось бы теперь не просто удалить все эти посты, а сменить тип материала у них

Не уверен, что за один проход 5 тысяч раз получится вызвать node_load и node_save без batch-процесса. В любом случае, для смены типа ноды эти функции не предназначены.

10 строк кода, говорите? Да задолбаетесь. Для одноразовой операции я лично полезу в phpmyadmin и точка. А вы что хотите, то и делайте.

Аватар пользователя zolexiy@drupal.org zolexiy@drupal.org 9 июня 2011 в 16:15

"CSoft" wrote:
Не уверен, что за один проход 5 тысяч раз получится вызвать node_load и node_save без batch-процесса. В любом случае, для смены типа ноды эти функции не предназначены.

да открыть два-три раза страницу где этот код будет выполнятся и все, зачем батч.. сколько успеет - столько сделает.. за 2-3раза точно все переколбасит.

Quote:

10 строк кода, говорите? Да задолбаетесь. Для одноразовой операции я лично полезу в phpmyadmin и точка. А вы что хотите, то и делайте.

покажите ваш селект, которым вы 5000 нодам измените тип, при условии что будет одно сск-поле.

Quote:

Если следовать вашему совету, обратите внимание на то, что в таблице "content_type_старый-тип-данных" нода почему-то осталась прописана! Фантастика, согласитесь? Вы же умные такие и рассказываете, как некорректно я тут советую всем.

ну, написал же - "как-то так" .. на коленке за пол минуты нашкрябал. Ну потрачу больше - найду еще какой хук, чтоб и это удалил... в любом случае (пусть и больше времени уйдет на написання сниппета (заметьте - не модуля)) - в результатке будет корректное изменение типа.

Да и сомневаюсь что вы быстрее это сделаете (корректно) в пхпадмине.

Аватар пользователя CSoft CSoft 9 июня 2011 в 16:31

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
да открыть два-три раза страницу где этот код будет выполнятся и все, зачем батч..

Это как? Открыть два-три раза страницу. Не понял.

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
покажите ваш селект, которым вы 5000 нодам измените тип, при условии что будет одно сск-поле.

CCK-поле описывается отдельной таблицей content_field_поле и там никак не завязано с типом ноды.

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
ну, написал же - "как-то так"

Это простая отмазка. Вы втроём мне доказываете именно то, что Вы написали в этом коде, поддерживая при этом друг друга. Только не проверили ничего, чтобы доказывать-то.

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
Ну потрачу больше - найду еще какой хук, чтоб и это удалил...

Повторяю ещё раз, в миллионный раз, откройте код этого модуля:

"Plazik" wrote:
node_convert

И посмотрите, как это делается. Уже всё готово. Независимо от этого модуля я месяц назад сделал более простой своему клиенту, причём дошёл точно до такого же решения, какое там. Какой Вы хук собрались искать, когда там одними запросами к базе всё делается...

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
Да и сомневаюсь что вы быстрее это сделаете (корректно) в пхпадмине.

Я это сделаю тем же самым путём (через запросы к БД), который Вы реализуете в своём сниппете. Потому как другого решения нет.

Аватар пользователя zolexiy@drupal.org zolexiy@drupal.org 9 июня 2011 в 17:23

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

.. Давайте упростим дискуссию и не будем углубляться. Мы по сути спорим какой вариант решения такого извращения как смена типа контента для ноды правильнее это сделает, код или пхпадмин.

Мы про то что это код, вы про прямые (и только) запросы к базе. Вы же не знаете что и как на сайте делают с этими нодами модули и какие они есть... этот модуль - пример того что стараются максимум нюансов охватить.

Топикстартеру он и поможет... или написать сниппет, типа моего, конкретно для своего случая... В любом случае - это извращение, только сниппет решит его более правильно чем вы руками в базе.

Если отвлечься, то я б на месте топикстартера в даном случае вообще бы удалил старые ноди и создал бы новые нужного типа и только с тайтлами. Таким же сниппетом в пару строк. И это 100% решило задачу топика и избавило бы от трабл и не понятных глюков в дальнейишм.

$query = db_query("SELECT `nid`, `title` FROM {node} WHERE `uid` = %d AND `type` = '%s'", $uid, $type); // $uid - уид этого бота , $type - тип контента
        while ($old_node = db_fetch_object($query)) {
          $content = new stdClass;
          $content->uid = 1;
          $content->status = 1;
          $content->type = 'new_type';
          $content->title = $old_node->title;
          node_delete($old_node->nid);
          node_save($content);
        }

а по поводу

Quote:

Это как? Открыть два-три раза страницу. Не понял.

ну вы написали что батч нужно. Вы правы - оперативки не хватит ... но если влом писать батч, то можно просто выполнить этот сниппет два -три раза Wink .. пусть вывалиться в белый экран, но нод так 1500 - 2000 обработает за один раз..

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

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
зачем по вашему сделали этот модуль, если сменить тип ноты можно легко в базе?

Вы и так ответили на этот вопрос:

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
этот модуль - пример того что стараются максимум нюансов охватить.

Они постарались максимально учесть здесь все моменты. Модуль должен быть универсальным. А когда делается что-то для себя, под свою задачу, то мой метод отлично подойдёт. И Ваш, уже последний, а не тот, который до этого освещался тремя людьми.

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
Вы же не знаете что и как на сайте делают с этими нодами модули и какие они есть...

Да. Поэтому я и сказал, что если человек новичок, то мой метод точно вряд ли подойдёт. Есть опасность всё испортить. Но в других случаях, чтобы массово обработать 5 тысяч нод, придётся писать всё равно свой модуль. А вот если сайт простой - не придётся. В базе за минуту всё сделать. Вот и весь смысл моих слов, кратко говоря.

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
только сниппет решит его более правильно чем вы руками в базе.

Не согласен. Здесь, по-хорошему, как в том модуле, нужно решать вопрос ЗАПРОСАМИ К БАЗЕ.

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
пусть вывалиться в белый экран, но нод так 1500 - 2000 обработает ..

Ээ... И потом лезть в базу, смотреть какие он успел обработать, поправить на основе этих данных свой код и открыть страницу ещё раз?

Аватар пользователя zolexiy@drupal.org zolexiy@drupal.org 9 июня 2011 в 17:41

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

я только что тут же нашел два похожих топика, в подтверждения своего подхода, Вы можете найти и показать здесь в подтверждения своего и на том покончим, ок?
Я соглашусь с Вами что реально и в базе все сделать (а почему нет) .. но во первых: это на так просто как вы пишете тут, а во вторых - нужно очень хооршо разбираться в базе и работе друпала, а ТС, вратли в этом так разбирается + нужно хорошо понимать что именно на его сайте творится

http://www.drupal.ru/node/23701
http://www.drupal.ru/node/37078

Quote:
Ээ... И потом лезть в базу, смотреть какие он успел обработать, поправить на основе этих данных свой код и открыть страницу ещё раз?

нет, вы не поняли... второй раз обработаных нод не будет в $query, селект не пройдет. их же не будет уже там.

Все... спс за разговор, было интересно. (без подкола) .. рассмотрели два подхода, вот и все.

Аватар пользователя CSoft CSoft 9 июня 2011 в 17:47

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
Вы можете найти и показать здесь в подтверждения своего и на том покончим, ок?

Этот самый модуль и есть подтверждение моего подхода Smile Мне этого достаточно.

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
второй раз обработаных нод не будет в $query, селект не пройдет. их же не будет уже там.

Да, точно-точно. Понял.

Согласен, на этом дискуссию можно закончить. Мне было неприятно просто, что вы все напали на меня, не разобравшись в вопросе. А наши методы имеют право на жизнь. Так что, тема вполне себя исчерпывает Smile

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
спс за разговор, было интересно. (без подкола)

Взаимно Smile

Аватар пользователя RISK RISK 9 июня 2011 в 19:31

Привет. Я не претендую, но по-моему это самый простой кнопочный вариант: при создании шаблона в Node Convert, отметить поле «Создать действие». Оно станет доступно в Views Bulk Operations.

Аватар пользователя Dan Dan 10 июня 2011 в 0:18

"RISK" wrote:
Привет. Я не претендую, но по-моему это самый простой кнопочный вариант: при создании шаблона в Node Convert, отметить поле «Создать действие». Оно станет доступно в Views Bulk Operations.

И самый правильный из предложенных здесь Wink

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 10 июня 2011 в 0:22

"CSoft" wrote:

CCK-поле описывается отдельной таблицей content_field_поле и там никак не завязано с типом ноды.


Шо ви говорите?
Это для множественных полей, единичные пишутся в отдельную все вместе

Аватар пользователя zolexiy@drupal.org zolexiy@drupal.org 10 июня 2011 в 0:43

"Dan" wrote:
И самый правильный из предложенных здесь ;)

если я правильно понял (я модуль конверт просто ни разу не юзал) то потом нужно будет выбрать 5000нод чекбоксами и нажать - конверт? если да - то нунафиг, проще реально написать своим кодом. Тем более что эту операцию один только раз нужно выполнить,.. я б поленился для такого случая разбираться в новом модуле и в том как создать темплейт .. хз ..

Аватар пользователя Dan Dan 10 июня 2011 в 15:42

"<a href="mailto:zolexiy@drupal.org">zolexiy@drupal.org</a>" wrote:
если я правильно понял (я модуль конверт просто ни разу не юзал) то потом нужно будет выбрать 5000нод чекбоксами и нажать - конверт?

У VBO есть опция типа "Выделить ВАЩЕ всё", которая выделяет всю выборку, а не только ту часть, которая отображается на текущей странице. Так что модуль быстрее Smile

Аватар пользователя zolexiy@drupal.org zolexiy@drupal.org 10 июня 2011 в 15:52

вам я и на слово могу верить, в том что касается друпала ))) .. вот и нашли три подхода к проблеме... . . хотя автору давно пофигу, так понял.. зато мы пообщалисть Lol