Вывод только комментариев ИС в шаблоне

#
Re: Вывод только комментариев ИС в шаблоне
HostCMS,
подскажете как получить «Заголовок Инф. Элемента» к которому этот комментарий относиться в этом шаблоне?
Держи крепко, отпускай легко :P
#
Re: Вывод только комментариев ИС в шаблоне
С Рождеством!

До сих пор не додумался как получить заголовок-ссылку элемента к которому оставлен комментарий. Поможете?
Держи крепко, отпускай легко :P
#
Re: Вывод только комментариев ИС в шаблоне
Помогите с кодом. Как переделать чтобы вывести ссылку на инф элемент, к которому оставлен комментарий.
Держи крепко, отпускай легко :P
Модератор
#
Re: Вывод только комментариев ИС в шаблоне
Для того, чтобы решить Вашу задачу, необходимо заменить код динамич. страницы на следующий:

<?php
// Число отображаемых комментариев
$count_coments = 1;

//Здесь поставьте код информационной системы, комментарии к элементам которой отображаете
$information_system_id = 1;// Идентификатор информационной системы


$DataBase = & singleton('DataBase');
$information_system = & singleton('InformationSystem');


$xmlData = '<?xml version="1.0" encoding="windows-1251"?>' . "\n";
$xmlData .='<document>' . "\n";


$query = "SELECT SQL_CALC_FOUND_ROWS comment_table.* FROM comment_table LEFT JOIN `information_items_table` ON comment_table.information_items_id = information_items_table.information_items_id WHERE 1 AND comment_status = '1' AND information_items_table.information_systems_id = '$information_system_id' ORDER BY comment_date DESC LIMIT 0, $count_coments";

$result = $DataBase->select($query);

// Определим количество элементов
$result_select_count_comments = $DataBase->select("SELECT FOUND_ROWS() as count");

if ($information_system->cm === false)
{
   $information_system->cm = array();
}

// Определим количество элементов
$result_select_count_comments = $DataBase->select("SELECT FOUND_ROWS() as count");

$count_array = mysql_fetch_assoc($result_select_count_comments);

if ($count_array)
{
   $information_system->count_comments = $count_array['count'];
}
else
{
   $information_system->count_comments = 0;
}

while ($row = mysql_fetch_assoc($result))
{
   $information_system->cm[$row['comment_id']] = $row;   
}

$xmlData .= '<item_comments>'."\n";

/* Суммарная оценка*/
$grade_sum = 0;

/* Число оценок*/
$grade_count = 0;

$information_system->grade_sum = 0;
$information_system->grade_count = 0;

$count_comment_item = count($information_system->cm);

reset($information_system->cm);


// Массив идентификаторов элементов, для которых заданы комментарии
$mas_items = array();

// Вызываем для 0-го уровня (далее идет рекурсивно внутри GetXmlForOneComment)
if (count($count_comment_item) > 0)
{   
   foreach ($information_system->cm as $comment_id => $cm_row)
   {         
      $xmlData .= '<item_comment>' . "\n";      
      $xmlData .= $information_system->GetXmlForOneComment($comment_id);
      $xmlData .= '</item_comment>' . "\n";

      // В массиве информационных элементов нет идентификатора элемента, к которому принадлежит текущий комментарий
      if (!in_array($cm_row['information_items_id'], $mas_items))
      {
         // Добавляем информционный элемент в массив
         $mas_items[] = $cm_row['information_items_id'];
      }
   }
}

// Средняя оценка
if ($information_system->grade_count > 0)
{
   $average_grade = $information_system->grade_sum / $information_system->grade_count;
}
else
{
   $average_grade = 0;
}

$mod = $average_grade - intval($average_grade);
$average_grade = intval($average_grade);

if ($mod >= 0.25 && $mod < 0.75)
{
   $average_grade += 0.5;
}
elseif ($mod >= 0.75)
{
   $average_grade += 1;
}

// Общее количество комментариев
$xmlData .= '<count_comments>'.intval($information_system->count_comments).'</count_comments>'."\n";

// Суммарная оценка
$xmlData .= '<grade_sum>'.$information_system->grade_sum.'</grade_sum>'."\n";

// Общее число оценок
$xmlData .= '<grade_count>'.$information_system->grade_count.'</grade_count>'."\n";

$xmlData .= '<average_grade>'.$average_grade.'</average_grade>'."\n";

$xmlData .= '</item_comments>'."\n";

// Получаем информацию об информационной системе
$xmlData .= '<information_system>' . "\n";
$xmlData .= $information_system->GenXml4InformationSystem($information_system_id);
$xmlData .= '</information_system>' . "\n";

$xmlData .= '<items>' . "\n";
// В цикле получаем информацию о информационных элементах
foreach ($mas_items as $key => $value)
{   
   $information_item_row = $information_system->GetInformationSystemItems($value);

   $path_item = $information_system->GetPathItem($value, '');
   
   $xmlData .= '<item id="' . $value . '">' . "\n";
   // Название информационного элемента
   $xmlData .= '<item_name>' . $information_item_row['information_items_name'] . '</item_name>' . "\n";
   
   // Путь к информационному элементу
   $xmlData .= '<item_path>' . $path_item . '</item_path>' . "\n";
   $xmlData .= '</item>' . "\n";
}
$xmlData .= '</items>' . "\n";

$xmlData .='</document>' . "\n";

// Распечатаем результат
// echo nl2br(htmlspecialchars($xmlData));

$xsl_name = 'ВыводКомментриев';

$xsl = new xsl();
echo $xsl->build($xmlData, $xsl_name);
?>


А также поменять XSL для отображения комментариев на приведенный ниже

<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>

   <xsl:template match="/">
      <xsl:apply-templates select="/document"/>
   </xsl:template>

   <xsl:template match="/document">
      <!-- Отображаем комментарии -->
      <xsl:apply-templates select="item_comments/comment"/>
   </xsl:template>

   <!-- Вывод строки со значением свойства -->
   <xsl:template match="item_comments/comment">
   <xsl:variable name="information_item_id" select="@information_item_id" />
      <p>
         <!-- Ссылка на информационный элемент -->
         <a href="{/document/information_system/url}{/document/items/item[@id = $information_item_id]/item_path}"><xsl:value-of disable-output-escaping="yes" select="/document/items/item[@id = $information_item_id]/item_name" /></a>
         <br />

         <!-- Дата/время добавления комментария -->
         <xsl:value-of select="comment_datetime"/>
         <!-- Ссылка на e-mail автора комментария -->
         <a href="mailto:{comment_email}">
            <xsl:value-of select="comment_fio"/>
         </a>
         <br/>
         <!-- Текст комментария -->
         <xsl:value-of select="comment_text" disable-output-escaping="yes"/>
      </p>
   </xsl:template>
</xsl:stylesheet>
#
Re: Вывод только комментариев ИС в шаблоне
Ivanov,
создал дин. стр. с таким содержанием. — пустая страница. Вывод не осуществляется.
Держи крепко, отпускай легко :P
Модератор
#
Re: Вывод только комментариев ИС в шаблоне
Я немного изменил код динамической страницы:

<?php
// Число отображаемых комментариев
$count_coments = 1;

//Здесь поставьте код информационной системы, комментарии к элементам которой отображаете
$information_system_id = 1;// Идентификатор информационной системы


$DataBase = & singleton('DataBase');
$information_system = & singleton('InformationSystem');


$xmlData = '<?xml version="1.0" encoding="windows-1251"?>' . "\n";
$xmlData .='<document>' . "\n";


$query = "SELECT SQL_CALC_FOUND_ROWS comment_table.* FROM comment_table LEFT JOIN `information_items_table` ON comment_table.information_items_id = information_items_table.information_items_id WHERE 1 AND comment_status = '1' AND information_items_table.information_systems_id = '$information_system_id' ORDER BY comment_date DESC LIMIT 0, $count_coments";

$result = $DataBase->select($query);

// Определим количество элементов
$result_select_count_comments = $DataBase->select("SELECT FOUND_ROWS() as count");

if ($information_system->cm === false)
{
   $information_system->cm = array();
}

// Определим количество элементов
$result_select_count_comments = $DataBase->select("SELECT FOUND_ROWS() as count");

$count_array = mysql_fetch_assoc($result_select_count_comments);

if ($count_array)
{
   $information_system->count_comments = $count_array['count'];
}
else
{
   $information_system->count_comments = 0;
}

while ($row = mysql_fetch_assoc($result))
{
   $information_system->cm[$row['comment_id']] = $row;  
}

$xmlData .= '<item_comments>'."\n";

/* Суммарная оценка*/
$grade_sum = 0;

/* Число оценок*/
$grade_count = 0;

$information_system->grade_sum = 0;
$information_system->grade_count = 0;

$count_comment_item = count($information_system->cm);

reset($information_system->cm);


// Массив идентификаторов элементов, для которых заданы комментарии
$mas_items = array();

// Вызываем для 0-го уровня (далее идет рекурсивно внутри GetXmlForOneComment)
if (count($count_comment_item) > 0)
{  
   foreach ($information_system->cm as $comment_id => $cm_row)
   {        
      // $xmlData .= '<item_comment>' . "\n";      
      $xmlData .= $information_system->GetXmlForOneComment($comment_id);
      //$xmlData .= '</item_comment>' . "\n";

      // В массиве информационных элементов нет идентификатора элемента, к которому принадлежит текущий комментарий
      if (!in_array($cm_row['information_items_id'], $mas_items))
      {
         // Добавляем информционный элемент в массив
         $mas_items[] = $cm_row['information_items_id'];
      }
   }
}

// Средняя оценка
if ($information_system->grade_count > 0)
{
   $average_grade = $information_system->grade_sum / $information_system->grade_count;
}
else
{
   $average_grade = 0;
}

$mod = $average_grade - intval($average_grade);
$average_grade = intval($average_grade);

if ($mod >= 0.25 && $mod < 0.75)
{
   $average_grade += 0.5;
}
elseif ($mod >= 0.75)
{
   $average_grade += 1;
}

// Общее количество комментариев
$xmlData .= '<count_comments>'.intval($information_system->count_comments).'</count_comments>'."\n";

// Суммарная оценка
$xmlData .= '<grade_sum>'.$information_system->grade_sum.'</grade_sum>'."\n";

// Общее число оценок
$xmlData .= '<grade_count>'.$information_system->grade_count.'</grade_count>'."\n";

$xmlData .= '<average_grade>'.$average_grade.'</average_grade>'."\n";

$xmlData .= '</item_comments>'."\n";

// Получаем информацию об информационной системе
$xmlData .= '<information_system>' . "\n";
$xmlData .= $information_system->GenXml4InformationSystem($information_system_id);
$xmlData .= '</information_system>' . "\n";

$xmlData .= '<items>' . "\n";
// В цикле получаем информацию о информационных элементах
foreach ($mas_items as $key => $value)
{  
   $information_item_row = $information_system->GetInformationSystemItems($value);

   $path_item = $information_system->GetPathItem($value, '');
  
   $xmlData .= '<item id="' . $value . '">' . "\n";
   // Название информационного элемента
   $xmlData .= '<item_name>' . $information_item_row['information_items_name'] . '</item_name>' . "\n";
  
   // Путь к информационному элементу
   $xmlData .= '<item_path>' . $path_item . '</item_path>' . "\n";
   $xmlData .= '</item>' . "\n";
}
$xmlData .= '</items>' . "\n";

$xmlData .='</document>' . "\n";

// Распечатаем результат
// echo nl2br(htmlspecialchars($xmlData));

$xsl_name = 'ВыводКомментриев';

$xsl = new xsl();
echo $xsl->build($xmlData, $xsl_name);
?>


Также изменен XSL-шаблон:

<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>

   <xsl:template match="/">
      <xsl:apply-templates select="/document"/>
   </xsl:template>

   <xsl:template match="/document">
      <!-- Отображаем комментарии -->
      <xsl:apply-templates select="item_comments/comment"/>
   </xsl:template>

   <!-- Вывод строки со значением свойства -->
   <xsl:template match="item_comments/comment">
   <xsl:variable name="information_item_id" select="@information_item_id" />
      <p>
         <!-- Ссылка на информационный элемент -->
         <a href="{/document/information_system/url}{/document/items/item[@id = $information_item_id]/item_path}"><xsl:value-of disable-output-escaping="yes" select="/document/items/item[@id = $information_item_id]/item_name" /></a>
         <br />

         <!-- Дата/время добавления комментария -->
         <xsl:value-of select="comment_datetime"/>
         <!-- Ссылка на e-mail автора комментария -->
         <a href="mailto:{comment_email}">
            <xsl:value-of select="comment_fio"/>
         </a>
         <br/>
         <!-- Текст комментария -->
         <xsl:value-of select="comment_text" disable-output-escaping="yes"/>
      </p>
   </xsl:template>
</xsl:stylesheet>
#
Re: Вывод только комментариев ИС в шаблоне
Ivanov,
сейчас заработало. Спасибо
Держи крепко, отпускай легко :P
#
Re: Вывод только комментариев ИС в шаблоне
Ещё один вопрос по теме.

Как сделать что бы была возможность разбивать все комментарии на страницы. Сделать из комментариев — подобие ИС.

Допустим на странице 10 комментов. Если их больше — выводятся ссылки на след. страницы.
Держи крепко, отпускай легко :P
#
Re: Вывод только комментариев ИС в шаблоне
#
Re: Вывод только комментариев ИС в шаблоне
Сделал для всех комментариев со всех информационных систем:
<?php
$DataBase = & singleton('DataBase');
$information_system = & singleton('InformationSystem');
$information_system_id = false;

$xmlData = '<?xml version="1.0" encoding="windows-1251"?>' . "\n";
$xmlData .='<document>' . "\n";

// Получаем список всех номеров информационных системы
$query_is  = "select  information_systems_id from information_items_table";
$InformationSystemIdArray = $DataBase->select($query_is);

$query = "SELECT SQL_CALC_FOUND_ROWS comment_table.* FROM comment_table LEFT JOIN `information_items_table` ON comment_table.information_items_id = information_items_table.information_items_id WHERE 1 AND comment_status = '1' ORDER BY comment_date DESC";

$result = $DataBase->select($query);

// Кол-во комментариев
$count_c = $DataBase->get_count_row($result);
// Выводим на экран количество комментариев
// echo $count_c.'<br/>';

// Определим количество элементов
$result_select_count_comments = $DataBase->select("SELECT FOUND_ROWS() as count");

if ($information_system->cm === false) {
   $information_system->cm = array();
}

// Определим количество элементов
$result_select_count_comments = $DataBase->select("SELECT FOUND_ROWS() as count");
$count_array = mysql_fetch_assoc($result_select_count_comments);

if ($count_array) {
   $information_system->count_comments = $count_array['count'];
} else {
   $information_system->count_comments = 0;
}

while ($row = mysql_fetch_assoc($result)) {
   $information_system->cm[$row['comment_id']] = $row;  
}

$xmlData .= '<item_comments>'."\n";

/* Суммарная оценка*/
$grade_sum = 0;

/* Число оценок*/
$grade_count = 0;

$information_system->grade_sum = 0;
$information_system->grade_count = 0;

$count_comment_item = count($information_system->cm);

reset($information_system->cm);


// Массив идентификаторов элементов, для которых заданы комментарии
$mas_items = array();

// Вызываем для 0-го уровня (далее идет рекурсивно внутри GetXmlForOneComment)
if (count($count_comment_item) > 0) {  
   foreach ($information_system->cm as $comment_id => $cm_row) {
      // $xmlData .= '<item_comment>' . "\n";      
      $xmlData .= $information_system->GetXmlForOneComment($comment_id);
      //$xmlData .= '</item_comment>' . "\n";

      // В массиве информационных элементов нет идентификатора элемента, к которому принадлежит текущий комментарий
      if (!in_array($cm_row['information_items_id'], $mas_items)) {
         // Добавляем информционный элемент в массив
         $mas_items[] = $cm_row['information_items_id'];
      }
   }
}

// Средняя оценка
if ($information_system->grade_count > 0) {
   $average_grade = $information_system->grade_sum / $information_system->grade_count;
} else {
   $average_grade = 0;
}

$mod = $average_grade - intval($average_grade);
$average_grade = intval($average_grade);

if ($mod >= 0.25 && $mod < 0.75) {
   $average_grade += 0.5;
} elseif ($mod >= 0.75) {
   $average_grade += 1;
}

// Общее количество комментариев
$xmlData .= '<count_comments>'.intval($information_system->count_comments).'</count_comments>'."\n";
// Суммарная оценка
$xmlData .= '<grade_sum>'.$information_system->grade_sum.'</grade_sum>'."\n";
// Общее число оценок
$xmlData .= '<grade_count>'.$information_system->grade_count.'</grade_count>'."\n";
$xmlData .= '<average_grade>'.$average_grade.'</average_grade>'."\n";
$xmlData .= '</item_comments>'."\n";
// Получаем информацию об информационной системе
$xmlData .= '<information_system>' . "\n";

$xmlData .= $information_system->GenXml4InformationSystem($information_system_id);
// for ($i = 0; $i < sizeof($InformationSystemIdArray); $i++) {
//    $xmlData .= $information_system->GenXml4InformationSystem($InformationSystemIdArray[$i]);
// }
// $xmlData .= $information_system->GenXml4InformationSystem($InformationSystemIdArray);

$xmlData .= '</information_system>' . "\n";
$xmlData .= '<items>' . "\n";

// В цикле получаем информацию о информационных элементах
foreach ($mas_items as $key => $value) {  
   $information_item_row = $information_system->GetInformationSystemItems($value);
   $path_item = $information_system->GetPathItem($value, '');
   $xmlData .= '<item id="' . $value . '">' . "\n";
   // Название информационного элемента
   $xmlData .= '<item_name>' . $information_item_row['information_items_name'] . '</item_name>' . "\n";
   // Путь к информационному элементу
   $xmlData .= '<item_path>' . $path_item . '</item_path>' . "\n";
   $xmlData .= '</item>' . "\n";
}
$xmlData .= '</items>' . "\n";
$xmlData .='</document>' . "\n";

// Распечатаем результат
// echo nl2br(htmlspecialchars($xmlData));

$xsl_name = 'ПоследниеКомментарии';
$xsl = new xsl();
echo $xsl->build($xmlData, $xsl_name);
?>
Все работает, единственный косяк, пути к комментируемому элементу передаются не до конца, т.е. отсутствует информационная группа.
Авторизация