Здравствуйте,
проблема вот в чем: регистрация была не закрыта, спам-бот за день наделал 5 тыс. записей в блоге, хотелось бы теперь не просто удалить все эти посты, а сменить тип материала у них и в идеале сделать пустыми (оставив, например, только заголовки), чтобы использовать в дальнейшем, заполняя эти ноды. Возможно ли это как-то осуществить?
Спасибо!
Комментарии
Таблица "node" в базе данных. Отфильтровать записи по uid пользователя и поменять тип материала на нужный.
Это минимум. Нужно ешё смотреть на другие установленные модули, например, CCK, ибо может понадобиться делать перенос из таблиц с именами content_type_xxx.
смотрим в сторону node_load и в сторону node_save.
Сначала загружаем нужную ноду, потом пересохраняем в нужный тип ноды и все.
Это несомненно проще, чем выполнить один единственный запрос к базе данных.
[module=node_convert]
Это легче, чем
И я не говорю о том, что этот за этот вариант руки рубить надо.
Поясните, пожалуйста, чем мой вариант плох, что за него руки рубить надо. Очень интересно.
не drupal-way и потом при ошибке будут траблы.
Ну Вы даёте Не понял только, причём тут drupal-way. Нет, я тоже люблю работать максимально корректно и учитывать идеологию Друпала. Несомненно.
Только в данном случае, чтобы 1(!) раз поменять тип нод, я элементарно зайду в phpmyadmin и выполню один единственный UPDATE-запрос.
Между прочим, я так делал сто раз, и даже своему клиенту модуль написал для этих целей. Когда скачал вышеназванный "node_convert", то совсем не удивился, что их идея и моя - полностью совпадают.
Так что, не знаю, что Вы мне пытаетесь доказать, но веских доводов я пока не увидел. Ещё раз повторю своей ответ по вопросу: друпал тут не нужен, просто выполнить в лучшем случае 1 SQL-запрос (по ситуации).
один ли раз?
Если судить по словам ТС'а:
то один.
Если нет, то всё равно делается модуль с запросом(ами) к базе, а не с функциями node_load и node_save... Хотя, модуль и так уже дали в четвёртом сообщении.
Ну всё, харе тему мусолить
Нуу посмотрев бегло модуль, там все таки используются node_load и node_save.
Правда и запросы к БД используются. Не сразу ясно что и куда там.Не когда разбираться.
согласен)
+1
Оно как раз совпадает с вариантом iHappy:
т.к. вызывает на каждую конвертацию node_load, node_save.
А в вашем варианте не будет вызвани ни онид хук, что может порушить архитектуру.
Повторяю в десятый раз - если сайт простой, то вообще сделать всё через phpmyadmin. Если нет - использовать модуль, указанный выше.
Друзья, вы читатели или писатели? Не пойму ни фига.
Зачем Вы рассказываете мне то, что я прекрасно знаю... Я кажется русским языком написал, что если простая ситуация - нет смысла для неё рисовать мегамодуль, а проще выполнить один SQL-запрос.
Хватит уже тереть элементарные вещи. ТС вообще исчез, а вы тут мне доказываете что-то, не услышав меня в свою очередь.
напрямую лезть и править в пхпадмин не стоит, даже если сайт простой. Думаю что как минимум там есть одно сск-поле, а это уже существенно усложняет ваш вариант.. это делается только node_load - node_save... это и проще и правильней, и от трабл избавит... точка. про какой мегамодуль вы говорите, там пару строчек кода будет...
кстати, сделав ноде_лоад - легко можно сделать и то что топикстартер хочет в идеале ... или вы тоже будете в пхпадмине это делать?
вот - как-то так:
while ($nid = db_result($query)) {
$content = node_load($nid);
$content->uid = 1; //это типа делаем автором админа, а не бота
$content->body = ''; //чистим тексты
$content->type = 'new_type';
node_save($content);
}
Если бы обсуждали за кружкой пива, то и вправду, беседа затянулась, но тут форум, на который придёт куча новичков в гугла, которые не смогут отличить простую ситуацию от непростой, залезут в БД, потом будут жаловаться на необъяснимые глюки и им никто не сможет помочь, в том числе вы.
Dan, верно... плюс он сбивает новичка с правильного пути. Если сам делаешь не правильно, то не нужно учить и других делать так. Тут же сообщество и нужно помогать понять друпал, а не костылями все делать, как проще
Модуль на 10 строк кода)
Как и сказали выше,
Причем даже если нету ССК поля.
И конечно же это тоже верно
Вот это я и имел виду.
Нельзя советовать такие кастомные решения.
Забавно. Каждый из вас даёт одно и то же решение, но ни один не проверил его на деле. ок, объясняю.
Что вы говорите. Да, нужно для этого сделать модуль! Правильно xD
Он его усложняет ровно на то, что я написал ещё в первом своём сообщении:
То есть, усложнение на целые полбалла из десяти.
А вот теперь самое интересно! С чего вы все вообще взяли, что эта связка функций корректно меняет тип ноды??? Почему никто из вас не обратил внимание на мои слова, что я имел опыт в данном вопросе? И главное - почему вы сами не проверили то, что советуете?
Если следовать вашему совету, обратите внимание на то, что в таблице "content_type_старый-тип-данных" нода почему-то осталась прописана! Фантастика, согласитесь? Вы же умные такие и рассказываете, как некорректно я тут советую всем.
Буду. По вышеназванной причине, которую никто из вас троих не посмотрел.
Я думаю, новичков с пути больше Вы сбиваете, когда в запросе-примере, который советуете, строку не обрамляете кавычками.
Короче говоря, если вы так яро защищаете корректность своего метода, то объясните мне, почему при "смене типа" таким образом старые данные остаются в таблице, когда их там не должно быть. Повторяюсь - если пользователь новичок, нефиг ему лезть в базу. Есть модуль, указанный в начале темы, пользуйтесь им. Кстати, опять же, никто не соизволил посмотреть, что в этом модуле для смены типа ноды сделано всё то, что я написал ещё в первом(!!!) сообщении данной темы.
А ваш node_load, $node->type = 'new_type', node_save всего-навсего в таблице node прописывает новый тип и в таблице content_type_новый-тип прописывает ноду. А этого не достаточно.
P. S. Интересно, вы и дальше будете кричать, что я не прав или нет... Безумно интересно. Хотя... Мне надоело это мусолить.
Да, кстати. Я ещё кое-что забыл сказать.
Не уверен, что за один проход 5 тысяч раз получится вызвать node_load и node_save без batch-процесса. В любом случае, для смены типа ноды эти функции не предназначены.
10 строк кода, говорите? Да задолбаетесь. Для одноразовой операции я лично полезу в phpmyadmin и точка. А вы что хотите, то и делайте.
да открыть два-три раза страницу где этот код будет выполнятся и все, зачем батч.. сколько успеет - столько сделает.. за 2-3раза точно все переколбасит.
покажите ваш селект, которым вы 5000 нодам измените тип, при условии что будет одно сск-поле.
ну, написал же - "как-то так" .. на коленке за пол минуты нашкрябал. Ну потрачу больше - найду еще какой хук, чтоб и это удалил... в любом случае (пусть и больше времени уйдет на написання сниппета (заметьте - не модуля)) - в результатке будет корректное изменение типа.
Да и сомневаюсь что вы быстрее это сделаете (корректно) в пхпадмине.
Это как? Открыть два-три раза страницу. Не понял.
CCK-поле описывается отдельной таблицей content_field_поле и там никак не завязано с типом ноды.
Это простая отмазка. Вы втроём мне доказываете именно то, что Вы написали в этом коде, поддерживая при этом друг друга. Только не проверили ничего, чтобы доказывать-то.
Повторяю ещё раз, в миллионный раз, откройте код этого модуля:
И посмотрите, как это делается. Уже всё готово. Независимо от этого модуля я месяц назад сделал более простой своему клиенту, причём дошёл точно до такого же решения, какое там. Какой Вы хук собрались искать, когда там одними запросами к базе всё делается...
Я это сделаю тем же самым путём (через запросы к БД), который Вы реализуете в своём сниппете. Потому как другого решения нет.
Вы упрощаете, на самом деле в этом модуле кроме запросов к базе есть module_invoke... токены и тд .. зачем по вашему сделали этот модуль, если сменить тип ноды можно легко в базе?
.. Давайте упростим дискуссию и не будем углубляться. Мы по сути спорим какой вариант решения такого извращения как смена типа контента для ноды правильнее это сделает, код или пхпадмин.
Мы про то что это код, вы про прямые (и только) запросы к базе. Вы же не знаете что и как на сайте делают с этими нодами модули и какие они есть... этот модуль - пример того что стараются максимум нюансов охватить.
Топикстартеру он и поможет... или написать сниппет, типа моего, конкретно для своего случая... В любом случае - это извращение, только сниппет решит его более правильно чем вы руками в базе.
Если отвлечься, то я б на месте топикстартера в даном случае вообще бы удалил старые ноди и создал бы новые нужного типа и только с тайтлами. Таким же сниппетом в пару строк. И это 100% решило задачу топика и избавило бы от трабл и не понятных глюков в дальнейишм.
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);
}
а по поводу
ну вы написали что батч нужно. Вы правы - оперативки не хватит ... но если влом писать батч, то можно просто выполнить этот сниппет два -три раза .. пусть вывалиться в белый экран, но нод так 1500 - 2000 обработает за один раз..
Вы и так ответили на этот вопрос:
Они постарались максимально учесть здесь все моменты. Модуль должен быть универсальным. А когда делается что-то для себя, под свою задачу, то мой метод отлично подойдёт. И Ваш, уже последний, а не тот, который до этого освещался тремя людьми.
Да. Поэтому я и сказал, что если человек новичок, то мой метод точно вряд ли подойдёт. Есть опасность всё испортить. Но в других случаях, чтобы массово обработать 5 тысяч нод, придётся писать всё равно свой модуль. А вот если сайт простой - не придётся. В базе за минуту всё сделать. Вот и весь смысл моих слов, кратко говоря.
Не согласен. Здесь, по-хорошему, как в том модуле, нужно решать вопрос ЗАПРОСАМИ К БАЗЕ.
Ээ... И потом лезть в базу, смотреть какие он успел обработать, поправить на основе этих данных свой код и открыть страницу ещё раз?
Все.. я ухожу в офф... я что думал по этому поводу написал.. спорить бесполезно, всеравно каждый останеться при своем мнении.. пусть топикстартер себе решает сам как правильно..
я только что тут же нашел два похожих топика, в подтверждения своего подхода, Вы можете найти и показать здесь в подтверждения своего и на том покончим, ок?
Я соглашусь с Вами что реально и в базе все сделать (а почему нет) .. но во первых: это на так просто как вы пишете тут, а во вторых - нужно очень хооршо разбираться в базе и работе друпала, а ТС, вратли в этом так разбирается + нужно хорошо понимать что именно на его сайте творится
http://www.drupal.ru/node/23701
http://www.drupal.ru/node/37078
нет, вы не поняли... второй раз обработаных нод не будет в $query, селект не пройдет. их же не будет уже там.
Все... спс за разговор, было интересно. (без подкола) .. рассмотрели два подхода, вот и все.
Этот самый модуль и есть подтверждение моего подхода Мне этого достаточно.
Да, точно-точно. Понял.
Согласен, на этом дискуссию можно закончить. Мне было неприятно просто, что вы все напали на меня, не разобравшись в вопросе. А наши методы имеют право на жизнь. Так что, тема вполне себя исчерпывает
Взаимно
Привет. Я не претендую, но по-моему это самый простой кнопочный вариант: при создании шаблона в Node Convert, отметить поле «Создать действие». Оно станет доступно в Views Bulk Operations.
И самый правильный из предложенных здесь
Шо ви говорите?
Это для множественных полей, единичные пишутся в отдельную все вместе
Ок. Но от этого сильных усложнений не предвидится.
если я правильно понял (я модуль конверт просто ни разу не юзал) то потом нужно будет выбрать 5000нод чекбоксами и нажать - конверт? если да - то нунафиг, проще реально написать своим кодом. Тем более что эту операцию один только раз нужно выполнить,.. я б поленился для такого случая разбираться в новом модуле и в том как создать темплейт .. хз ..
У VBO есть опция типа "Выделить ВАЩЕ всё", которая выделяет всю выборку, а не только ту часть, которая отображается на текущей странице. Так что модуль быстрее
вам я и на слово могу верить, в том что касается друпала ))) .. вот и нашли три подхода к проблеме... . . хотя автору давно пофигу, так понял.. зато мы пообщалисть