Есть ли готовое решение для загрузки материалов из личного кабинета? [Решено]

Аватар пользователя valera-lvp valera-lvp 3 декабря 2012 в 12:47

Знаю, что все любят посылать в поиск, но уже устал искать иголку в стогу сена.
Стоит задача «Разработка сервиса публикации пользовательских материалов».

Суть задачи:
«Пользователь должен иметь возможность заполнить форму в своём личном кабинете, указав категорию и описание своего материала, прикрепив, если необходимо, изображения или видеоматериалы.
Необходимо разработать инструментарий модератора для просмотра, редактирования и удаления нежелательных пользовательских материалов и сообщений. Информация о новом, отправленном пользователем портала, материале, отзыве, комментарии должна отправляться редактору портала. Публикация данного материала должна быть доступна для чтения пользователям портала только после одобрения редактором портала.»

Сложность для меня в том, что сделать это надо именно в личном кабинете, а не в админке!
Пытался искать что-то готовое – не нашел... потом прочитал кучу статей и книжку почитал, в итоге попытался написать свой модуль.
Но всё равно не хватает еще мозгов своих реализовать это. Модуль получился невнятный, надерганный кусками кода из статей и книжки.
А ведь сроки, как всегда, жмут.
И вот убежден, что изобретаю велосипед, и что существует модуль, позволяющий делать это. Может кто знает его?
Ну или на крайний случай, несколько раз натыкался на информацию, что «во всех книжках описана куча примеров как это сделать» – может ссылку дадите на эти статьи или книжки?

UPD

Решил задачу таким способом:

  1. Поставил и включил модуль Administration menu (http://drupal.org/project/admin_menu);
  2. Отключил тему админки;
  3. Теперь управление содержимым доступно в оформлении основной темы, а следовательно и добавление материала легко реализуется обычной ссылкой из личного кабинета. Никаких модулей, хуков – всё средствами из коробки теперь сделаю.

Всем кто откликнулся – спасибо за помощь!

Комментарии

Аватар пользователя WebRemake WebRemake 4 декабря 2012 в 3:18

А просто ссылка или кнопка на создание материала, расположенная на странице "личный кабинет" и открывающая в оверлее форму добавления материала заказчика не устроит? После создания и сохранения материала пользователь снова окажется на странице своего кабинета. Вроде как не противоречит ТЗ "«Пользователь должен иметь возможность заполнить форму в своём личном кабинете....".

Аватар пользователя valera-lvp valera-lvp 4 декабря 2012 в 11:04

WebRemake wrote:
А просто ссылка или кнопка на создание материала, расположенная на странице "личный кабинет" и открывающая в оверлее форму добавления материала заказчика не устроит? После создания и сохранения материала пользователь снова окажется на странице своего кабинета. Вроде как не противоречит ТЗ "«Пользователь должен иметь возможность заполнить форму в своём личном кабинете....".

Очень хорошая идея. Понять бы еще, как это сделать. Пока что моих навыков не достаточно, чтобы с ходу это сделать.
Если не сложно, подскажите как начать? А пока что снова в гугл полез.

UPD. Как я понял, есть модуль Overlay в ядре 7-ки. У меня Drupal 6. На нём такое возможно?

Аватар пользователя q2_faith q2_faith 4 декабря 2012 в 12:20

"valera-lvp" wrote:
На нём такое возможно?

гуглите на тему вывода модальных окон через колорбокс

Аватар пользователя kyky kyky 4 декабря 2012 в 12:42

В чем сложности?
Пользователь регается, создает ноду, она не публикуется.
Админ просматривает ноды и публикует.
Все довольны, все смеются.

Аватар пользователя valera-lvp valera-lvp 5 декабря 2012 в 12:30

kyky wrote:
В чем сложности?
Пользователь регается, создает ноду, она не публикуется.
Админ просматривает ноды и публикует.
Все довольны, все смеются.

Вы описали понятный мне алгоритм. Именно это я и хочу сделать.
Сложность в реализации. Не щелкнуло еще в мозгу – как это реализовать средствами Друпала.

Возможно ли это сделать средствами Views + CCK? Сделать форму добавления ноды в админке – без проблем, разобрался, а вот в личном кабинете как выводить такую форму – не понимаю (гугл меня ведёт в сторону API форм). Всё таки верной дорогой иду, что пытаюсь это сделать в собственном модуле или таки есть решение средствами Views / CCK?

Топчусь на одном месте, не хватает какого-то «пинка» в понимании кухни Друпала.

Аватар пользователя valera-lvp valera-lvp 5 декабря 2012 в 15:08

Правильно ли я понимаю, что надо из своего модуля создать закладку в личном кабинете, разместить там форму и потом, после валидации использовать hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) или hook_node_type($op, $info)?

Аватар пользователя kyky kyky 5 декабря 2012 в 15:33

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

Аватар пользователя valera-lvp valera-lvp 5 декабря 2012 в 16:06

kyky wrote:
Зачем свой модуль?
Создайте тип материала "публикация" и дайте права на ее создание зарегистрированным пользователям.

Задача, чтобы зарегистрированный пользователь мог создавать публикацию из личного кабинета. Как вывести форму из админки в личный кабинет?

Аватар пользователя valera-lvp valera-lvp 5 декабря 2012 в 17:49

q2_faith wrote:
"valera-lvp" wrote:
Как вывести форму из админки в личный кабинет?

drupal_get_form()

Этой функции возможно передать параметр, идентифицирующий тип ноды?
Допустим в админке у меня есть тип материала Галерея. Значит от этого типа ноды надо взять какой-то идентификатор, передать функции drupal_get_form() и при выводе в личном кабинете получу те же поля, что и в админке при выборе "Создать материал" -> "Галерея"? Правильно понимаю? Или всё таки такое не возможно?

Аватар пользователя kyky kyky 6 декабря 2012 в 2:53

"valera-lvp" wrote:
Как вывести форму из админки в личный кабинет?

Господи, добавьте ссылку на страницу создания ноды: /node/add/type
Вот и будет вам форма.

Аватар пользователя valera-lvp valera-lvp 6 декабря 2012 в 10:08

"q2_faith" wrote:
api не пробовали читать?

Пробовал. И дальше продолжаю знакомиться.

"kyky" wrote:
Господи, добавьте ссылку на страницу создания ноды: /node/add/type
Вот и будет вам форма.

Это уже будет переход на админ-панель. А по ТЗ это категорически запрещено – в этом и весь гемор.
Пользователь должен находиться в своём личном кабинете.

Аватар пользователя valera-lvp valera-lvp 6 декабря 2012 в 11:32

kyky wrote:
Что вы имеете в виду под личным кабинетом?

На портале отделены друг от друга личный кабинет пользователя и админ-панель.
Админ-панель – отдельный вход, своё оформление.
Личный кабинет (my account, расположенный на странице /user) – встроен в оформление сайта, и с админкой никак не перекликается. Т.е. зарегистрированный пользователь никак админку не видит и вход в неё для него не доступен.
Надеюсь доступно передал )

В этом и сложность, что форма создания ноды выносится за пределы админки. Стандартными методами, сделать в админке форму добавления ноды – это делов на 10 минут от силы. А вот вынести форму за пределы – вот тут и затупил я.

Аватар пользователя natbampo natbampo 6 декабря 2012 в 11:50

Добавьте блок, формат ему php, укажите на какой странице и внутрь него следующий код:
<?php
$file = DRUPAL_ROOT . '/' . drupal_get_path('module', 'node') . "/node.pages.inc";
require_once $file;
print render(node_add('article'));
?>

Это для типа ноды article накидал

Аватар пользователя valera-lvp valera-lvp 6 декабря 2012 в 15:55

natbampo wrote:
Добавьте блок, формат ему php, укажите на какой странице и внутрь него следующий код:
<?php
$file = DRUPAL_ROOT . '/' . drupal_get_path('module', 'node') . "/node.pages.inc";
require_once $file;
print render(node_add('article'));
?>

Это для типа ноды article накидал

Спасибо, дельный совет.

Пытаюсь сделать, но как всегда – в самых неожиданных местах начинаются глюки.
Создал регион, прописал его в шаблоне page.tpl. В админке создал блок с форматом php, вставил его в свой регион.
В настройках блока указал права (поставил галочку для авторизованных пользователей), выбрал «Показывать только на перечисленных страницах» и ввёл user.
Пытаюсь для проверки в регион вывести
<?php
print "test-test-test";
?>
Ничего не выводит Sad

А если указывать страницу user/*, то вообще страница личного кабинета не открывается и вываливается ошибка:
Fatal error: Cannot redeclare declofnum() (previously declared in ...\www\sites\all\themes\portal\block-docs.tpl.php:3) in ...\www\sites\all\themes\portal\block-docs.tpl.php on line 6

Не понос, так золотуха. Скоро корвалол начну пить с этим Друпалом...

Аватар пользователя q2_faith q2_faith 6 декабря 2012 в 16:20

"valera-lvp" wrote:
Fatal error: Cannot redeclare declofnum() (previously declared in ...\www\sites\all\themes\portal\block-docs.tpl.php:3) in ...\www\sites\all\themes\portal\block-docs.tpl.php on line 6

а вы зачем функции в шаблонах объявляете? тем более повторно
лучше друпалу накапайте корвалола, он с вами намучается

Аватар пользователя valera-lvp valera-lvp 6 декабря 2012 в 16:40

q2_faith wrote:
а вы зачем функции в шаблонах объявляете? тем более повторно
лучше друпалу накапайте корвалола, он с вами намучается

Не объявлял я там функции...

1. В portal.info добавил регион regions[materials_add] = Регион для блока добавления пользовательских материалов

2. Добавил в шаблоне page.tpl:
<?php
print $materials_add;
?>

3. Включил свой блок в свой регион.

4. В настройках своего блока формат ввода сменил с PHP на Full HTML. Ввёл в окне просто слово TEST. Выбираю показ только на определенных страницах (пока что только user).

Ничего не выводит, в том числе и ошибки нету. Ошибка появляется, если пытаюсь по другому прописать страницу, для вывода блока, например – user/*.
Где в этих пунктах повторное объявление функций? )

Аватар пользователя q2_faith q2_faith 6 декабря 2012 в 17:05

"valera-lvp" wrote:
Где в этих пунктах повторное объявление функций? )

"valera-lvp" wrote:
Fatal error: Cannot redeclare declofnum() (previously declared in ...\www\sites\all\themes\portal\block-docs.tpl.php:3) in ...\www\sites\all\themes\portal\block-docs.tpl.php on line 6

напишите строку 6 из этого шаблона

Аватар пользователя valera-lvp valera-lvp 6 декабря 2012 в 17:11

<?php

function declOfNum($number, $titles) {
$cases = array(2, 0, 1, 1, 1, 2);
return $number . " " . $titles[($number % 100 > 4 && $number % 100 < 20) ? 2 : $cases[min($number % 10, 5)]];
}
?>

Получается, что строчка 6 – это закрывающая фигурная скобка.
Вот только не понимаю, причем тут этот block-docs.tpl.php...

Аватар пользователя q2_faith q2_faith 6 декабря 2012 в 17:26

"valera-lvp" wrote:
Получается, что строчка 6 – это закрывающая фигурная скобка.

получается что вы все таки объявляете функции в шаблонах

Аватар пользователя valera-lvp valera-lvp 6 декабря 2012 в 17:43

q2_faith wrote:
получается что вы все таки объявляете функции в шаблонах

Это наследство от предшественников, видимо. Чужой портал – потёмки.
Странно, но до этого ошибка нигде не выскакивала и никак себя не проявляла...
Интересно, каким образом это связано с созданием моего блока?

Аватар пользователя q2_faith q2_faith 6 декабря 2012 в 18:09

"valera-lvp" wrote:
Интересно, каким образом это связано с созданием моего блока?

это как в анекдоте про наркоманов. у тебя руль - ты и рули)
вот и выясните почему она выскакивает

Аватар пользователя valera-lvp valera-lvp 12 декабря 2012 в 19:01

Закомментировал временно функцию из block-docs.tpl.php

Теперь при заходе в личный кабинет новая ошибка:

Fatal error: Call to undefined function render() in Z:\home\...\www\includes\common.inc(1696) : eval()'d code on line 4
Аватар пользователя valera-lvp valera-lvp 19 декабря 2012 в 10:56

Решил задачу таким способом:
1. Поставил и включил модуль Administration menu (http://drupal.org/project/admin_menu);
2. Отключил тему админки;
3. Теперь управление содержимым доступно в оформлении основной темы, а следовательно и добавление материала легко реализуется обычной ссылкой из личного кабинета. Никаких модулей, хуков – всё средствами из коробки теперь сделаю.

Всем кто откликнулся – спасибо за помощь!

Аватар пользователя valera-lvp valera-lvp 19 декабря 2012 в 15:59

iNFerNo wrote:
связь то какая между меню и то что вы хотели?

Отключив тему админки, у меня пропала навигация.
Модулем я вернул навигацию, к тому же удобным образом расположенную.
В рамках моего проекта – отличное решение.

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

Не самый удачный проект мне достался для «втыкания» в Друпал )