К содержанию

Как удалить запятую после последнего элемента в foreach?

Есть такой код:
{foreach $_modx->resource.TvTags | fromJSON | split as $tag}
<a href="{25|url:['scheme'=>'full']}{$tag}/">{$tag}</a>,
{/foreach}

Выводит:
<a href="url-страницы/">Какой-то текст1</a>, <a href="url-страницы/">Какой-то текст2</a>, <a href="url-страницы/">Какой-то текст3</a>, <a href="url-страницы/">Какой-то текст4</a>, <a href="url-страницы/">Какой-то текст5</a>,

Подскажите, как удалить (разделитель) запятую у последнего элемента БЕЗ использования css?
Дмитрий
Дмитрий
25 января 2019, 22:19
modx.pro
2 360
Реклама

Комментарии: 13

Андрей
Андрей Старожил
25 января 2019, 23:14
Должно так работать:
{foreach $_modx->resource.TvTags | fromJSON | split as $tag last=$last}
        {if $last}
                <a href="{25|url:['scheme'=>'full']}{$tag}/">{$tag}</a>
            {else}
                <a href="{25|url:['scheme'=>'full']}{$tag}/">{$tag}</a>,
        {/if}
{/foreach}
    Дмитрий
    Дмитрий Старожил
    25 января 2019, 23:37
    Спасибо, добрый человек, то что нужно!
      Дмитрий
      Дмитрий Старожил
      25 января 2019, 23:49
      Андрей, может это глупый вопрос, но откуда получаются значения last=$last? Не пойму, но работает. Или это типа модификатора?
        Андрей
        Андрей Старожил
        26 января 2019, 00:20
        Немного подробней про first и last можно почитать тут — https://github.com/fenom-template/fenom/blob/master/docs/ru/tags/foreach.md
          Дмитрий
          Дмитрий Старожил
          26 января 2019, 00:40
          Благодарю.
          Теперь понятно, если first или last имеет значение TRUE, то это первая и последняя итерация соответственно.
        Баха Волков
        Баха Волков Администратор
        26 января 2019, 09:47
        Можно и покороче:

        {foreach $_modx->resource.TvTags | fromJSON | split as $tag}
              <a href="{25|url:['scheme'=>'full']}{$tag}/">{$tag}</a>{!$tag@last ? ',' : ''}
        {/foreach}
          Дмитрий
          Дмитрий Старожил
          27 января 2019, 02:27
          Благодарю. На этом варианте остановлюсь.

          Еще такой вопрос.

          Вышеуказанные решения — это вывод в ресурсе принадлежащих ему(ресурсу) тегов.

          А в самом облаке облаке тегов все теги сайта вывожу так:
          {$_modx->runSnippet('@FILE snippets/TagsList.php', [
          	'tv_id' => 8,
          	'tpl' => '@FILE chunks/tags/tags_list_item.tpl',
          	'tags_page' => 25
          ])}

          В chunks/tags/tags_list_item.tpl следующий код:
          <a href="{$tags_page}{$tag}/">{$tag}</a>,
          Выводятся так:
          <a href="url-страницы-тега/">Какой-то текст1</a>, <a href="url-страницы-тега/">Какой-то текст2</a>, <a href="url-страницы-тега/">Какой-то текст3</a>, <a href="url-страницы-тега/">Какой-то текст4</a>, <a href="url-страницы-тега/">Какой-то текст5</a>,
          Как в этом случае удалить запятую у последнего тега, если это не массив, а много строк?
          То есть:
          string string string string string string string string string string string ....
            Баха Волков
            Баха Волков Администратор
            27 января 2019, 10:49
            Логику перенесите в код сниппета
              Дмитрий
              Дмитрий Старожил
              27 января 2019, 11:44
              Код сниппета TagsList.php такой:
              <?php
              	$pdoTools = $modx->getService('pdoTools');
              	$TvSuperSelect = $modx->getService('tvsuperselect', 'tvsuperselect', MODX_CORE_PATH . 'components/tvsuperselect/model/tvsuperselect/');
              	if (!$TvSuperSelect) {
              		$modx->log(xPDO::LOG_LEVEL_ERROR, 'Не удалось загрузить TvSuperSelect');
              		return;
              	}
              
              	$q = $modx->newQuery('tvssOption');
              	$q->groupby('value');
              	$q->select('value, tv_id');
              	$q->where(array(
              		'tv_id' => $tv_id
              	));
              	
              	if ($q->prepare() && $q->stmt->execute()) {
              		$tags = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
              	}
              	
              	$tags_page = $modx->makeUrl($tags_page, '', '', 'full');
              	
              	foreach($tags as $tag) {
              		$result  .= $pdoTools->getChunk($tpl, array(
              			'tag' => $tag['value'], 
              			'tags_page' => $tags_page
              		));
              	}
              	
              	return $result;
              Что тут нужно изменить/добавить?
                Дмитрий
                Дмитрий Старожил
                27 января 2019, 13:05
                Не знаю на сколько это правильно, но сделал так и все работает.

                <?php
                //..........
                foreach($tags as $tag) {
                		array(			
                			'tags_link' => $tagLink[] = '<a href="' . $tags_page . $tag['value'] . '/">' . $tag['value'] . '</a>'
                		);
                	}
                	
                return implode(', ', $tagLink);

                и удалил в выводе сниппета
                'tpl' => '@FILE chunks/tags/tags_list_item.tpl',


                Правильно я сделал, или есть более оптимальный вариант?
                  Дмитрий
                  Дмитрий Старожил
                  27 января 2019, 23:12
                  Или так:
                  <?php
                  //..........
                  foreach($tags as $tag) {
                  		array(			
                  		    $tagLink[] = '<a href="' . $tags_page . $tag['value'] . '/">' . $tag['value'] . '</a>'
                  		);
                  	}
                  	
                  return implode(', ', $tagLink);
                    Баха Волков
                    Баха Волков Администратор
                    29 января 2019, 12:02
                    Для гибкости и универсальности можно было бы оставить свойство tpl и добавить еще и свойство outputSeparator, а в сниппете использовать его
                      Дмитрий
                      Дмитрий Старожил
                      29 января 2019, 22:44
                      На счет свойства outputSeparator — согласен — для гибкости, в вызове сниппета можно менять разделитель.

                      Сделал так:
                      <?php
                      //..........
                      foreach($tags as $tag) {				
                      	$tagLink[] = '<a href="' . $tags_page . $tag['value'] . '/">' . $tag['value'] . '</a>';
                      	}
                      
                      $outputSeparator = (isset($outputSeparator)) ? $outputSeparator : '';
                      	
                          return implode($outputSeparator, $tagLink);

                      А свойство tpl — для чего, не пойму?
                      Объясни, пожалуйста на примере (как бы сам сделал), так как не особо силен в php, тем более в MODX варианте. Но хочу разобраться как в MODX все это работает.

                      Заранее, благодарю.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          13