Jump to content

древовидные комментарии\сообщения

Featured Replies

Posted
comment_161852

Может у кого есть наработки или кто-то знает как проще организовать древовидные комментарии (при ответе комментарий пользователя выводится под комментарием другого пользователя)

  • Replies 51
  • Просмотров 32,8k
  • Created
  • Последний ответ

Лучшие авторы в теме

Most Popular Posts

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

  • Переписал логику. Теперь скрипт точно выбирает как работать с сообщениями, улучшены алгоритмы: куда вы нажали, есть ли ответы, кто добавляет комментарий (вы или другой пользователь) и т.д. Весь вывод

  • Есть рабочая версия, проверил работу на 2 проектах. Работает с приложениями: cms, downloads, blog, calendar, gallery, videos, videobox Плагин продам за 1.000 РУБ (В ЛС) и так же в случае возникновения

Posted Images

  • Author
comment_161857

у меня есть комменты с $id - ид коммента, $pid - если комментарий - это ответ на родительский комментарий, сюда заносится $id родительского комментария, и $level - 0 если это корневой комментарий или 1 если это дочерний комментарий.

Как теперь мне мне все отсортировать в древовидном порядке средствами ips, чтобы комментарии приняли вид:
1 comment ($id = 1; $pid = 0; $level = 0;)
- 2 comment ($id = 2; $pid = 1; $level = 1;)
- 3 comment ($id = 3; $pid = 1; $level = 1;)
4 comment ($id = 4; $pid = 0; $level = 0;)
- 5 comment ($id = 5; $pid = 4; $level = 1;)
- 6 comment ($id = 6; $pid = 4; $level = 1;)

  • Author
comment_161865

вроде разобрался как вывести деревом.

Как подгружать форму {$record->commentForm()|raw} динамически в нужное мне место? например при нажатии кнопки в определенном месте на странице, вся форма должна подгрузиться именно туда, где была нажата кнопка, и если была нажата кнопка в другом месте на странице, удалить эту форму и подгрузить в новое место?

comment_161866
1 час назад, ZIKURIK сказал:

вроде разобрался как вывести деревом.

Как подгружать форму {$record->commentForm()|raw} динамически в нужное мне место? например при нажатии кнопки в определенном месте на странице, вся форма должна подгрузиться именно туда, где была нажата кнопка, и если была нажата кнопка в другом месте на странице, удалить эту форму и подгрузить в новое место?

она может быть внизу, просто отправка должна осуществляться именно к твоему 1 comment ($id = 1; $pid = 0; $level = 0;)

  • Author
comment_161868
46 минут назад, andros0789 сказал:

она может быть внизу, просто отправка должна осуществляться именно к твоему 1 comment ($id = 1; $pid = 0; $level = 0;)

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

comment_161869
1 час назад, ZIKURIK сказал:

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

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

  • 9 месяцев спустя...
comment_167473
В 29.04.2020 в 23:24, ZIKURIK сказал:

вроде разобрался как вывести деревом.

Как подгружать форму {$record->commentForm()|raw} динамически в нужное мне место? например при нажатии кнопки в определенном месте на странице, вся форма должна подгрузиться именно туда, где была нажата кнопка, и если была нажата кнопка в другом месте на странице, удалить эту форму и подгрузить в новое место?

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

comment_167477
2 часа назад, Estomel сказал:

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

Похоже нет))

  • 2 месяца спустя...
  • Author
comment_168798

Вопрос к кодерам:
какой класс\метод нужно захукать чтобы дополнительно отправить нужные данные например из <input type="hidden" name="idd" value="0"> в бд к добавляемому комменту?
Коммент же method="post" отправляется на сервер, какой метод обрабатывает этот запрос и добавляет коммент в базу данных?

comment_168799

Добавление коммента обрабатывает функция commentForm класса \IPS\Content\Item. В jquery это addToCommentFeed

Судя по всему нужно создавать новый экземпляр редактора по клику на кнопку Ответить.

  • Author
comment_168800
59 минут назад, Respected сказал:

Добавление коммента обрабатывает функция commentForm класса \IPS\Content\Item.

да до меня просто не доходит как это происходит, каким кодом будут забираться данные из поля <input type="hidden" name="idd" value="0">

//<?php

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	exit;
}

abstract class hook33 extends _HOOK_CLASS_
{
	/**
	 * Build comment form
	 *
	 * @param	int|NULL	$lastSeenId		Last ID seen (point to start from for new comment polling)
	 * @return	string
	 */
	public function commentForm( $lastSeenId=NULL )
	{
		return parent::commentForm( $lastSeenId );
		
		if ( $this instanceof \IPS\cms\Records )
		{
			//тут должен быть код который собирает данные и отправляет в бд?
		}
      
	}
}


 

  • Author
comment_168820

Есть какие соображения? Уверен тут есть человеки которые плагины\приложения пишут.

Цитата

Я так понял это _commentForm(), commentForm( $lastSeenId = NULL ), commentFormElements(), processCommentForm( $values ) но не могу понять какой код формирует данные из полей (эдитора и input hidden) и отправляет их в бд

 

comment_168823

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

comment_168860

Скрытые поля можно добавить в методе _commentForm.

/**
 * Return the comment form object
 *
 * @return	\IPS\Helpers\Form
 */
protected function _commentForm()
{
	$form = parent::_commentForm();
	$form->hiddenValues['key'] = 'value';

	return $form;
}

Обрабатывать форму в методе processCommentForm.

/**
 * Process the comment form
 *
 * @param	array	$values		Array of $form values
 * @return  \IPS\Content\Comment
 */
public function processCommentForm( $values )
{
	$comment = parent::processCommentForm( $values );
	$comment->key = $values['key'];
	$comment->save();

	return $comment;
}

 

  • Author
comment_168870
11 часов назад, WaNted сказал:

Скрытые поля можно добавить в методе _commentForm.


/**
 * Return the comment form object
 *
 * @return	\IPS\Helpers\Form
 */
protected function _commentForm()
{
	$form = parent::_commentForm();
	$form->hiddenValues['key'] = 'value';

	return $form;
}

Обрабатывать форму в методе processCommentForm.


/**
 * Process the comment form
 *
 * @param	array	$values		Array of $form values
 * @return  \IPS\Content\Comment
 */
public function processCommentForm( $values )
{
	$comment = parent::processCommentForm( $values );
	$comment->key = $values['key'];
	$comment->save();

	return $comment;
}

 

почему то если присвоить так $form->hiddenValues['key'] = '0'; то при отправки коммента он и считает это значение и запишет 0, хотя я контроллером изменяю input значение value например на 20, все равно отправляет 0

comment_168871

Тогда попробуйте получать значение с помощью \IPS\Request::i()->key. Если тоже вернёт изначально установленное значение, то попробуйте указывать скрытое поле в шаблоне.

  • Author
comment_168872
4 минуты назад, WaNted сказал:

Тогда попробуйте получать значение с помощью \IPS\Request::i()->key. Если тоже вернёт изначально установленное значение, то попробуйте указывать скрытое поле в шаблоне.

\IPS\Request::i()->key да, так принял правильное значение. В чем может быть проблема первого метода?

Edited by ZIKURIK

comment_168873

Нет никакой проблемы, может просто в обработчике формы не предусмотрено изменение скрытых полей на фронте. Сейчас не у компа, можете сами посмотреть это в \IPS\Helpers\Form метод values.

  • Author
comment_168876
24 минуты назад, WaNted сказал:

Нет никакой проблемы, может просто в обработчике формы не предусмотрено изменение скрытых полей на фронте. Сейчас не у компа, можете сами посмотреть это в \IPS\Helpers\Form метод values.

там походу только тоглы передаются togglesOn / togglesOff / toggles

т.е. работает только с формами new \IPS\Helpers\Form... я так понял

  • Author
comment_168877

и безопасно ли так записывать в бд через \IPS\Request::i()->key ? Хотя в любом случае мне придется делать проверку т.к. в бд принимаются только int значения

  • Author
comment_169025

есть такая итерация:

foreach ( $this->comments( NULL, NULL, 'date', 'asc', NULL, NULL, NULL, NULL, FALSE, isset( \IPS\Request::i()->showDeleted ) ) as $LoadComment )

и у меня есть массив с определенными id, нужно во время итерации собирать только те comments id которых нету в моем массиве, как такое организовать ?
Я могу сравнить их после функцией !\in_array(), но мне нужно сделать это внутри $this->comments() чтобы сразу отсечь ненужные comments

Edited by ZIKURIK

comment_169026
$сommentIds = array( 1, 2, 3 );
foreach ( $this->comments( NULL, NULL, 'date', 'asc', NULL, NULL, NULL, array( array( \IPS\Db::i()->in( 'comment_id', $сommentIds, TRUE ) ) ), FALSE, isset( \IPS\Request::i()->showDeleted ) ) as $LoadComment )

 

  • Author
comment_169030
12 часов назад, WaNted сказал:


$сommentIds = array( 1, 2, 3 );
foreach ( $this->comments( NULL, NULL, 'date', 'asc', NULL, NULL, NULL, array( array( \IPS\Db::i()->in( 'comment_id', $сommentIds, TRUE ) ) ), FALSE, isset( \IPS\Request::i()->showDeleted ) ) as $LoadComment )

 

сидел думал чтобы такое вставить в where, видимо проглядел про \IPS\Db::i()->in . Спасибо

Edited by ZIKURIK

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.


Guest
Ответить в этой теме...

Последние посетители 0

  • No registered users viewing this page.