Направьте на путь истинный

На сайте есть список партнеров (название, адрес, телефон, сайт) и акции в которых эти партнеры участвуют. У каждой акции разные партнеры, но все берутся из одного списка (список всех партнеров) и выводятся внутри акции. В дополнительных поляк чекбоксами, галочку поставил – партнер отображается на странице. На странице вывод должен быть отсортирован по menuindex.

Мне пришлось делать на скорую руку, чтобы хоть как то работало:
  • Каждый партнер это отдельный ресурс, все лежит в контейнере (ID8)
  • Создал tv с типом checkbox, в возможных значениях сделал запрос в БД:
    @SELECT pagetitle, id FROM [[+PREFIX]]site_content WHERE parent=8 ORDER BY menuindex ASC
  • На странице вывел этот tv
Но мне кажется что я сделал все не так. Сразу наткнулся на минус моей реализации: если изменить у партнера (ресурса) контент, то внутри акции убирается чекбокс и приходится заходить в акцию и заново его выставлять, чтобы на странице отобразились измененные данные.

Как это все грамотно и правильно реализовать?
igos
30 марта 2017, 21:48
modx.pro
776
0

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

Максим Кузнецов
31 марта 2017, 07:15
+1
Мм… а почему у вас при изменении контента убирается чекбокс?

Вообще, через чекбоксы такие списки лучше не выводить (партнеров ведь может быть много), поэтому уместнее было бы реализовать список партнеров в виде тв-типа «список ресурсов» или «список (множественный выбор)».

Во втором случае в возможных значениях необходимо указать:
@EVAL return $modx->runSnippet('snippet_name');

И создать новый сниппет, который будет возвращать результаты:
<?php
	$output = '';

	$q = $modx->newQuery('modResource');
	$q->where(array(
		"parent"    => "8"
	));
	$q->sortby('menuindex','ASC');

	$q->select(array(
		"modResource.id",
		"modResource.pagetitle",
	));

	$s = $q->prepare();
	$s->execute();

	while($row = $s->fetch(PDO::FETCH_ASSOC)){
		$data[] = "{$row['pagetitle']}=={$row['pagetitle']}";
	}

	$output = implode("||", $data);
	return $output;

В таком случае «привязка» партнеров будет происходить по их id, что позволит свободно изменять их остальные данные без опасения потерять выбранных парнетров.
    Максим Кузнецов
    31 марта 2017, 08:44
    +2
    UPD:
    $data[] = "{$row['pagetitle']}=={$row['id']}";
      igos
      31 марта 2017, 13:30
      0
      Вот и для меня это загадка почему слетал чекбокс и данные на странице не обновлялись, пока заново не выставишь.
      Испробовал Ваш вариант, всё окей, спасибо!
      Чекбоксами тоже удобно, показывает всех партнеров в таком виде: prnt.sc/eqp0qg — галку поставил и вывело.

      Вот сегодня назрел другой вопрос, допустим у двух акций выводится один и тот же партнер «Магазин 1» и у него есть ссылка на сайт shop.com, но в одной акции требуется выставить ссылку shop.com/akciya1, а во второй shop.com/akciya2, как мне в таком случае лучше поступить? Ссылка для партнера забивается внутри ресурса и всё. Что то у меня пока пусто в голове на этот счет, не могу придумать.
        Максим Кузнецов
        31 марта 2017, 13:32
        +1
        MIGX

        В первой колонке выбираете партнера (из того же тв-поля), во второй прописываете ссылку до их посадочной страницы.
          igos
          31 марта 2017, 13:38
          +1
          Я всё правильно понял?
          Для страницы акции я делаю migx tv у которого 2 столбца:
          1) выбор партнера сниппетом (уже одиночный выбор получается)
          2) поле с ссылкой (если не заполнено — выводим стандартный url из ресурса)
          Ну и каждый партнер добавляется через кнопку новой строкой?
            Максим Кузнецов
            31 марта 2017, 13:42
            +1
            Именно..)
            Если вам не нужно будет фильтровать акции по партнерам — для вас это оптимальный и наиболее удобный вариант.
              igos
              31 марта 2017, 13:43
              +1
              Спасибо Максим, буду пробовать :)
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    7