TvTable - таблица

Добрый день! Понадобилась мне тут табличка в виде Тв-параметра, в которой можно менять не только кол-во строк, но и столбцов. Поэтому migx не подходит (
В общем, было найдено решение, но как оказалось оно для EVO =(



В итоге взяла его за основу и переписала.
Итак процесс установки:

1) создаем namespace (Пространство имен) table
2) создаем плагин «TvTable» с событиями OnTVInputRenderList, OnTVInputPropertiesList и OnDocFormPrerender
<?php

$corePath = $modx->getOption('table.core_path', null, $modx->getOption('core_path') . 'components/table/');

switch ($modx->event->name) {
	case 'OnTVInputRenderList':
		$modx->event->output($corePath . 'elements/tv/input/');
		break;
	case 'OnTVInputPropertiesList':
		$modx->event->output($corePath . 'elements/tv/inputoptions/');
		break;
	case 'OnDocFormPrerender':
		$modx->regClientStartupScript('http://code.jquery.com/jquery-1.11.2.min.js');
		break;
}
3) распаковываем в core/components архив
4) теперь создаем TV-параметр с типом table и пользуемся)
5) сниппет tvTable для вывода простой таблицы [[!tvTable?&tv=`id TV`&id=`id ресурса`]]
<?php
if (!isset($tv)){
   return;
}

$tv = (int)$tv;
$classname = isset($classname) ? $classname : 'pricelist';
$did =isset($id) ? $id : $modx->resource->id;

if ($tvObject = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tv, 'contentid' => $did ))){
    $tvv = $tvObject->get('value');
}

if (!$tvv || $tvv=='[["",""],["",""]]') return;
$tvtArr=json_decode($tvv);

$output='<table class="'.$classname.'">'."\n";
$output .='<tr>'."\n";
for($i=0; $i<count($tvtArr[0]); $i++) $output .='<th'.($i ? '' : ' class="first"').'>'.$tvtArr[0][$i].'</th>'."\n";
$output.='</tr>'."\n";
for($row=1; $row<count($tvtArr); $row++) {
	$output .='<tr'.(($row%2) ? '' : ' class="altrow"').'>'."\n";
	for($i=0; $i<count($tvtArr[$row]); $i++) $output .='<td'.($i ? '' : ' class="first"').'>'.$tvtArr[$row][$i].'</td>'."\n";
	$output.='</tr>'."\n";
}
$output.='</table>';
return $output;

UPD:
Добавила в плагин инициализацию jQuery
Добавила сниппет

UPD 30.08.2017:
Переписала JS, но т.к. я в нем не совсем спец, то он не красивый.
В общем, те кто хотел 2 и более таблицы — github.com/wax100/TVTable — тестируйте

yani
02 марта 2015, 08:34
35
5 877
+15

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

Роман Танаев
02 марта 2015, 12:00
+1
Отличное решение, мой вам "+". Единственное что нужно добавить это подключение jquery библиотеки т.к у меня консоль заругалась на ее отсутствие и по-этому плагин не сработал.
    yani
    02 марта 2015, 12:06
    0
    Странно, подключение делается так
    case 'OnDocFormPrerender':
    $modx->regClientStartupScript('http://code.jquery.com/jquery-1.11.2.min.js');
    break;
    — а поняла, у меня там ТВ-карта и там подключено
Павел Левин
06 марта 2015, 12:03
1
0
Где можно глянуть пример вывода на сайте? т.е. как его применяют.
    yani
    06 марта 2015, 12:14
    0
    Пока разрабатывала, заказчик переделал дизайн) оказалось ненужно.
    А на сайте будет выводиться обычная таблица
      Павел Левин
      06 марта 2015, 15:23
      0
      а принцип идеи (до редизайна) каков был?
        yani
        06 марта 2015, 15:27
        0
        построение таблицы (не в контентной части) и ее вывод,
        а мне вывод как таковой не нужен был, а нужен был вывод цен в зависимости от размера.
        причем можно было как удалять тип бревна. так и добавить
        Пример таблиц
        PS можно делать и MIGX, но в нем нельзя увеличить кол-во столбцов не залезая в настрйоки
Сергей Скат
09 марта 2015, 13:40
0
блин, вот если бы было можно еще и фильтровать через mFIlter2 по этой теме, вообще было бы здорового
    yani
    09 марта 2015, 19:23
    2
    0
    Что именно фильтровать? тут просто вывод. Для фильтра можно использовать jquery плагины фильтрации таблиц
      Сергей Скат
      09 марта 2015, 22:18
      0
      Смотри, например мы добавили такую таблицу, она кстати очень нужна, но mfilter2 с ней не работает, и с migx тоже, не знаю уже и что делать
Сергей Скат
10 марта 2015, 17:02
0
о, как чудесно, займусь на выходных
    yani
    10 марта 2015, 17:08
    0
    Не забудьте поделиться ;)
Alex Lenk
29 июня 2015, 19:37
0
1) создаем namespace table
Простите, а что означает namespace?
    yani
    29 июня 2015, 19:48
    +1
    Это пространство имён.
    В настройках естьтакой пункт меню.
    ЗЫ с телефона, скрин не сделать
      Alex Lenk
      29 июня 2015, 20:27
      0
      не знаю как назвать это но я нашел, оказывается ПРОСТРАНСТВО ИМЁН не вмещалось в экран ноутбука, потому я не мог найти…
      Нажал клавишу F11 только тогда смог найти…
Alex Lenk
11 августа 2015, 19:18
0
Подскажите пожалуйста, как в сниппете tvTable прописать код для чанка?

[[!tvTable? &tv=`id TV` &id=`id ресурса` &tpl=`myTpl`]]
А уже в самом myTpl можно было бы оформлять таблицу как угодно.
Никита
26 февраля 2016, 16:37
0
добрый день,
А как-то можно сделать так чтоб динамически id ресурса подставлялось.
Или надо каждый раз писать номер id ресурса??
    yani
    26 февраля 2016, 16:41
    0
    Можно, в сниппете указать что если id пустой, то брать $modx->resource->id
      Никита
      26 февраля 2016, 16:44
      0
      Отлично.
      Спасибо большое. Я думал его надо обязательно указывать))) пробовал писать типо [[~[[*id]]]]
      а оказывается все на много проще)))

      Еще раз спасибо большое
Никита
26 февраля 2016, 23:05
0
Появился еще вопрос.
Я создал еще TV с таким же типом table, но получилась какая-то не совместимость.
Я тут задумался, а можно как-то добавить к таблице заголовок к примеру h2 и обернуть это все в блок чтоб его можно было дублировать при нажатии на плюс и так же на минус чтоб можно было убрать.

<div class="example-block">
    <input type="button" value="+">
    <h2>HEADER</h2>
    <table>...</table>
</div>
Спасибо.
    yani
    27 февраля 2016, 22:11
    0
    насколько я помню две ТВ юзать нельзя( надо переделывать, добавить H2 в бекенд? или во фронтенд?
      Никита
      27 февраля 2016, 23:22
      0
      Я так понимаю, что в бэкенде должен быть инпут который будет для заголовка.
      И потом в бекенде сделать добавление нового блока с заголовком и таблицей.
      А вывод на фронтенд — блок в котором заголовок и таблица. А если был добавлен новый блок, то снова блок и в нем заголовок и таблица.
      Как-то так.

      Спасибо
        yani
        28 февраля 2016, 10:28
        0
        Это дописывать. Или в выводе писать что мол [[+idx:is=`1`:then=`....`:else=`....`]]
          Никита
          28 февраля 2016, 11:30
          0
          Думаю, это на Ваше усмотрение )))
Игорь Терентьев
12 августа 2016, 15:54
+1
Загрузил в файлохранилище: table.zip
    Илья Уткин
    17 августа 2016, 14:45
    +1
    Загрузил в ModStore



    =)))
      Василий Столейков
      01 ноября 2016, 11:00
      1
      0
      А как добавить тег thead к таблице? То есть чтобы первая строка была в thead или как-то конкретно указать?

      Просто дизайн свёрстан с учётом thead
        Василий Столейков
        01 ноября 2016, 11:01
        1
        0
        Или хотя-бы предусмотреть возможность выводить только строки…
          yani
          01 ноября 2016, 12:14
          0
          Изменить сниппет или чанк. Доделать короче через idx
Konstantin
17 августа 2016, 20:10
0


захотел сделать две таблицы в одном документе
    yani
    18 августа 2016, 09:28
    0
    Да, нельзя две
    Илья Уткин
    18 августа 2016, 10:43
    0
    Добавил в задачи: github.com/ilyautkin/TVTable/issues/1
      Александр
      30 августа 2017, 11:52
      0
      Илья, скажите пожалуйста, планируете ли реализовать больше одной таблицы в одном документе?
        Илья Уткин
        30 августа 2017, 14:20
        0
        В ближайшее время точно не планирую
        yani
        30 августа 2017, 20:00
        0
        github.com/wax100/TVTable попробуйте
          Александр
          31 августа 2017, 10:45
          0


          Предыдущий пакет полностью удалил. Кэш MODX и браузера чистил. Версия MODX 2.5.5-pl
          Журнал ошибок чист.
            yani
            31 августа 2017, 11:28
            0
            и пакет пересобрали?
            поробуйте вернуть старую версию и вручную изменить файл tv.table.input.tpl и залить файл JS
              Александр
              31 августа 2017, 12:39
              0
              Да, пересобрал.
                yani
                31 августа 2017, 13:02
                0
                проверю, у меня все встало на последнюю версию, сейчас толко JS проверю еще
                prntscr.com/gfbck6
                yani
                31 августа 2017, 13:06
                +2
                Пересоберите, не то скоировала в файл TPL
                  Александр
                  31 августа 2017, 13:56
                  0
                  Yani, спасибо большое! Работает!))
                    yani
                    31 августа 2017, 14:39
                    +1
                    Отлично! Извините за косяк )
                      Александр
                      31 августа 2017, 15:28
                      0
                      Вы доработали бесплатный компонент, так что Вам только спасибо))
                    Илья Уткин
                    31 августа 2017, 14:39
                    +2
                    Круто! )

                    Чуть подправил — перенёс JS-файлы в assets и залил в modstore.pro новую версию. Теперь можно обновиться из репозитория.
                      yani
                      31 августа 2017, 14:54
                      +1
                      спасибо, да JS нужно было в assets, но я че т так упоролась с JS что сил не было
                      Александр
                      31 августа 2017, 15:29
                      0
                      Илья, спасибо!
      Женёк
      07 августа 2017, 18:21
      0
      Тоже понадобилась вторая таблица. А не работает.
      yani
      30 августа 2017, 20:06
      0
      github.com/wax100/TVTable попробуйте
        Владимир Дремучий
        19 февраля 2018, 11:03
        0
        А как можно вывести таблицу через Migx на фронте?
        Сейчас пока просто выводит
        [["",""],["",""]]
          yani
          19 февраля 2018, 11:47
          +1
          Там сниппет идет в комплекте
            А в этом снипете есть возможность задавать полям xtype? Например ввод изображений/список и тд?
              yani
              05 марта 2018, 13:23
              0
              Нет, для этого есть MIGX
                Например в таблице выводить изображение, и добавлять столбцы тут уже migx не подходит
                  yani
                  05 марта 2018, 15:50
                  0
                  только через HTML добавлять src
                    Не могу в чанках воспользоваться fenom, ни в какую не работают плейсхолдеры, может подскажете как воспользоваться?

                    $cells.=$pdoFetch->getChunk($tpl,  array('val' => strval($tvtArr[$row][$i])), $fastMode);
                    так заработало
    Стас
    12 ноября 2017, 18:11
    0
    В админке выводится криво, при этом папка core вынесена за пределы public. Помогите, пожалуйста, разобраться.
      Александр
      12 ноября 2017, 18:21
      0
      Что в консоли браузера?
        Стас
        12 ноября 2017, 18:42
        0
        Failed to load resource: the server responded with a status of 404 (Not Found)

        Первая часть вопроса очевидно решена. Как поступить по-умному?
        (Путь assets, как вы уже поняли, тоже изменён).
        Стас
        12 ноября 2017, 18:57
        0
        Скопировал скрипт в assets, появились поля, но нет кнопок добавления строк
          yani
          14 ноября 2017, 11:53
          0
          могу посомтреть потом, но чуууть позже, разгребусь со срочными своими багами)
            Стас
            14 ноября 2017, 11:56
            0
            Спасибо! Вопрос решился после тотальной отчистки кеша всего, что только можно. Но суть в том, что если папка assets переименована, теряется js.
              yani
              14 ноября 2017, 12:04
              0
              Надо создать issue и я или Илья поправим
    Alex Lenk
    14 февраля 2018, 11:17
    0
    Уважаемый автор, прошу в статье, где вы упоминаете namespace дать для новичков в скобках подсказку, что это «Пространство имен»
      yani
      14 февраля 2018, 11:36
      +2
      Сделано, а вообще есть уже собранный компонент ;)
    Александр
    15 февраля 2018, 20:16
    0
    Возможно ли добавить объединение строк и колонок?
      yani
      15 февраля 2018, 21:49
      +1
      пока нет, я думала об этом. по идее можно в поле указывать какой то признак, а в сниппете уже выводить как надо.
      Но чтобы сделать это через интерфейс — пока нет идей и времени, только мысли =(
        Александр
        15 февраля 2018, 22:26
        0
        Да, об этом варианте тоже подумал. Но если бы у Вас получилось реализовать это без костылей, это было бы здорово))
    Telega
    11 марта 2018, 16:43
    0
    Спасибо за отличный компонент, но мне вот понадобилось брать отдельные данные из ячейки для своих нужд. Так может добавите такую возможность, сделав, например, параметры getX и getY (номер ячейки по горизонтали и вертикали, соответственно) и что-то подобное в сниппете

    if ($getX != '' and $getY != '') {
            $output = $tvtArr[$y][$x];
        } else {
            $output = $pdoFetch->getChunk($wrapperTpl,  array('table' => $rows, 'classname'=>$classname), $fastMode);
        }
    А то для такого дополнения полезная функция, а менять исходники как-то некрасиво. А так еще раз спасибо!)
      yani
      12 марта 2018, 08:46
      0
      В принципе, можно будет добавить)
      yani
      12 марта 2018, 21:25
      0
      Готово, проверяйте!
        Telega
        12 марта 2018, 21:44
        0
        Вот это оперативность!)

        Я, конечно, дурной и сонный уже, но не конца понял смысл от getX и getY, если далее в коде берутся значения x и y
        if ($getX != '' and $getY != '') {
                if(isset($tvtArr[$y][$x])){
                    return $tvtArr[$y][$x];  
                }
                return '';
            }
        Т.е сейчас нужно и то и то указывать… Это я у себя там немного по другому делал, поэтому и вылезли эти x и y, а так лучше же
        if ($getX != '' and $getY != '') {
                if(isset($tvtArr[$getY][$getX])){
                    return $tvtArr[$getY][$getX];  
                }
                return '';
            }
        или вообще упростить до x и y)

    Trinibobs
    23 марта 2018, 16:32
    0
    Подключил поставщика услуг, пробовал загрузить через админку, но пишет «Не удалось загрузить и создать пакет с подписью:tvtable-1.0.8-beta» в чем может быть проблема? (напрямую тоже возникли сложности, а именно после всех подключений, в админке были только 2 кнопки "[>>] и [<<]" но они не работали)
      yani
      23 марта 2018, 16:37
      0
      можно в личку сайт и доступы к нему
        Trinibobs
        23 марта 2018, 16:42
        0
        к сожалению, такой возможности предоставить не могу, т.к. не личный сайт
          yani
          23 марта 2018, 16:49
          0
          тогда увы, гадать не могу =(
    varanika
    27 мая 2018, 11:54
    0
    Все круто, все полезно. Но я так и не обнаружила как порядковый номер получить :)
    Ну например, хочу отловить номер колонки. В thTpl засовываю:
    [[+getX]][[+getY]][[+num]][[+idx]][[+id]][[+row]][[+i]][[+cells]]
    В общем все логичное и не логичное перепробовала, но порядковое исчисление не отловила :) Что же его выведет то? :)

    Прошло 7 минут :)

    Кто хочет отловить нумерацию колонок. В 53 строке дописываем:

    $cells.=$pdoFetch->getChunk($tpl,  array('val' => $tvtArr[$row][$i], 'idx' => $i), $fastMode);
    А в чанке (у меня)
    &thTpl=`@INLINE <th><span>[[+idx]]<input name="programm" type="radio" value="[[+val]]"></span></th>`
    Ура :) Теперь я могу сделать из таблицы input для формы :)
    ctrls
    17 июля 2018, 23:43
    0
    Здравствуйте, установил плагин через инсталлер админки, появился новый тип Tv, все хорошо. Но почему-то сниппет выводит таблицу только если указать getX и getY. Я в php, к сожалению, не силен, но не может ли в коде сниппета быть ошибки?
      ctrls
      17 июля 2018, 23:58
      0
      Похоже, дело в pdoFetch. Правильно ли я понимаю, что это сторонний плагин, который также необходимо установить?