Pharo Seaside - Как обновить запись в базе данных после редактирования тега в html - PullRequest
1 голос
/ 11 ноября 2019

Я новичок в Seaside.

У меня есть таблица (например, электронная таблица), созданная с использованием HTML в Pharo 4.0 Seaside, которая берет данные из БД PostgreSQL с помощью драйвера Garage для Seaside.

Я помещаю contenteditable=true в tableData, и я могу изменить его, но он не обновляет запись в базе данных.

Я не хочу использовать форму, которая получает данные изатем запускает запрос, как только я нажимаю кнопку отправить, я просто хочу изменить ячейку электронной таблицы (тег html tabledata), а затем, когда я нажимаю клавишу ввода (или я просто убираю мышь из ячейки), я хочу запустить запрос, который обновляет базу данных. .

Я пытался использовать jQuery и Ajax, но не могу заставить его работать. Я не могу получить введенные данные и данные, описывающие ячейку, чтобы я мог выполнить запрос.

html tableData 
attributeAt: 'contenteditable' put: 'true'; 
onClick: (html jQuery this addClass:'clicked'); 
onBlur:(self insertOrUpdateEntryWithCode: ((html jQuery this)html) withName: name forDay: day month:month year:year); 
with: value.

Ответы [ 2 ]

1 голос
/ 12 ноября 2019

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

Несколько вопросов ...

  • Что #insertOrUpdateEntryWithCode:withName:forDay:month:year: делает и возвращает?
  • Как вы получаете доступ к соединению с базой данных? (глобальный пул или сеанс Seaside?)

Кроме того, вы используете старую версию Pharo, возможно, со старой версией Seaside, и если требуется соединение с PostgreSQL, я бы попросил васиспользуйте драйвер P3 .

0 голосов
/ 14 ноября 2019

Затем попробуйте это:

renderContentOn: html
  html
    table: [ 1 to: 10 do: [ :rowIndex | 
       html tableRow: [ 1 to: 5 do:
         [ :colIndex | self renderCellAtRow: rowIndex column: colIndex on: html ] ] ] ]
renderCellAtRow: rowIndex column: colIndex on: html
    ^ html tableData
        attributeAt: 'contenteditable' put: 'true';
        id: (self cellIdRow: rowIndex col: colIndex);
        onBlur:
            (html jQuery ajax
                callback: [ :v | self atRow: rowIndex column: colIndex put: v ]
                    value: html jQuery this html;
                onComplete:
                    ((html jQuery id: (self cellIdRow: rowIndex col: colIndex)) load
                        html: [ :h | h render: (self atRow: rowIndex column: colIndex) ]));
        with: (self atRow: rowIndex column: colIndex)
cellIdRow: rowIndex col: colIndex
    ^ 'r<1p>c<2p>' expandMacrosWith: rowIndex with: colIndex

Вам придется санировать содержимое отправленного html, так как перевод строки будет преобразован в <br>, который, если будет отправленснова преобразуется в &lt;br&gt; и т. д.

atRow:column возвращает значение, а atRow:column:put: устанавливает его. Я использовал массив массивов для хранения результатов.

...