Перейти к содержанию

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


Рекомендуемые сообщения

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

Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 51
  • Создана
  • Последний ответ

Топ авторов темы

у меня есть комменты с $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;)

Ссылка на комментарий
Поделиться на другие сайты

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

Похоже нет))

Ссылка на комментарий
Поделиться на другие сайты

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

Ссылка на комментарий
Поделиться на другие сайты

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 )
		{
			//тут должен быть код который собирает данные и отправляет в бд?
		}
      
	}
}


 

Ссылка на комментарий
Поделиться на другие сайты

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

Цитата

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

 

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

Скрытые поля можно добавить в методе _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;
}

 

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Изменено пользователем ZIKURIK
Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

WaNted спасибо за помощь, буду пилить дальше. Вот что пока что вышло:

Спойлер

123.thumb.png.44ae02ae715b5047ad3867f946101d95.png

 

Ссылка на комментарий
Поделиться на другие сайты

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

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

Изменено пользователем ZIKURIK
Ссылка на комментарий
Поделиться на другие сайты

$с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 )

 

Ссылка на комментарий
Поделиться на другие сайты

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 . Спасибо

Изменено пользователем ZIKURIK
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...