A

Andrew Lutz

0
Репутация
1
Рейтинг
#1 Как из любого ЭКШЕНА получить данные в любой ШАБЛОН? 10 декабря 2024 в 17:48

 Andrew Lutz, так экшн, по факту, такой же метод контроллер. Вам необязательно его выносить в отдельный файл, можно прямо внутри контроллера писать его как 

  1. public function actionSubcatsView(){
  2. dump('Список категорий');
  3. }

Вот про это в документации docs.instantcms.ru/dev/controllers/actions

Просто вы же в виджете хотите потом эту json строку разбирать, подготавливать и отправлять в шаблон виджета.

Вынесите подготовку чистых данных в сам контроллер. В виджет отдавайте чистые данные, а экшном — в формате json… Кода в сравнении с вашим вариантом почти не добавится, зато поддерживать такой вариант в дальнейшем будет сильно проще.

Но я не настаиваю. Просто делюсь мнением.

Zau4man

Хм… а ведь да, точно )
Благодарю за мудрый совет )
Мне еще многому тут учиться.

#2 Как из любого ЭКШЕНА получить данные в любой ШАБЛОН? 10 декабря 2024 в 17:20

Если я правильно понял, то вроде вот:

  1. return $this->cms_template->render('шаблон_из_папки_тэмплэйт', [
  2. 'test' => 'Ok Ok Ok'
  3. ]);

и в шаблоне будет доступно $test

maxxux

Да, если создать в папке шаблона файл например /content/get_action.tpl.php то можно вывести в нем  $test.
Но как это сделать в шаблоне виджета? или это надо как-то сделать потом уже?
Я смотрел на примере стандартного файла category_view.tpl.php в папке контроллера content. В него тоже данные попадают из одноименного экшена.
Вот только как они потом передаются в общий виджет /content/widget/template.tpl.php — для меня загадка.

Добавлено спустя 8 минут
  1. $controller = cmsCore::getController('content');
  2. dump($controller->runAction('subcats_view'));

Действительно работает! это даже радует )
Только теперь не понятны предостережения — «имхо так делать не стоит. Сделайте отдельный компонент, в нем нужный метод для отдачи данных массива ». Это действительно важно?
А то в будущем фантазирую движок превратить в подобие SPA. Для этого думаю всю логику можно переваривать в экшенах, отдавая чистый JSON либо внутрь, либо аяксу. В зависимости кому нужно отдать страницу — пользователю или поисковику.

Zau4man
#1 Как из любого ЭКШЕНА получить данные в любой ШАБЛОН? 10 декабря 2024 в 15:16

Не могу никак разобраться... 
Сделал тестовый экшен
content/actions/subcats_view.php

  1. <?php
  2. class actionContentSubcatsView extends cmsAction {
  3.  
  4. public function run() {
  5.  
  6. return $this->cms_template->renderJSON([
  7.  
  8. 'test' => 'Ok Ok Ok'
  9.  
  10. ]);
  11. }
  12. }

Далее написал пустой тестовый виджет, в шаблоне которого

  1. <script>
  2. ;(async function(){
  3. let resp = await fetch('/content/subcats_view');
  4. let json = await resp.json();
  5. console.log(json.test);
  6. }());
  7. </script>

В консоли как и полагается выводится 'Ok Ok Ok'. Работает.
Данные можно отрендерить JS-ом и вывести где-то на странице.

Теперь вопрос.

Как мне запросить и получить данные того же экшена, но без JS?
То есть может есть метод, который сможет вернуть данные экшена прямо в шаблон (например в шаблон любого виджета), чтобы отрендерить с помощью php?

Очень буду признателен за совет.

#4 [ЕСТЬ РЕШЕНИЕ] "Редактировать категорию" - дополнительное поле. 30 ноября 2024 в 11:14

Теперь общий принцип понятен )

#5 [ЕСТЬ РЕШЕНИЕ] "Редактировать категорию" - дополнительное поле. 29 ноября 2024 в 11:37

 Andrew Lutz, делал компонент для вывода второго описания в категории. Поправьте компонент под себя instantcms.ru/forum/razdelit-opisanie-kategorii-na-verhnyuyu-i-nizhnyuyu-chasti.html#post-360858

Zau4man

Да, почти то, что надо! Спасибо, очень помогло!
А то хотелось понять как вообще в принципе добавлять свои поля в настройки категории.
И выводить затем: в карточку категории в списке категорий и в страницу самой категории.
В дефолтном варианте очень скудный набор — заголовок, описание, обложка и все.
Добавил еще одно поле для вывода иконки категории.
Вроде все работает.
Но спрошу на всякий случай — все ли правильно или есть более изящные решения, если нужно будет по-больше полей?
content_cat_form.php

  1. if (!$model->db->isFieldExists($table_name, 'description_extended')) {
  2. $model->db->query("ALTER TABLE `cms_$table_name` ADD `description_extended` TEXT NULL DEFAULT NULL AFTER `description`;");
  3. }
  4. if (!$model->db->isFieldExists($table_name, 'icon_title')) {
  5. $model->db->query("ALTER TABLE `cms_$table_name` ADD `icon_title` TEXT NULL DEFAULT NULL AFTER `title`;");
  6. }
  7.  
  8. $fieldset_ids = array_keys($form->getStructure());
  9.  
  10. $form->addField($fieldset_ids[0],
  11. new fieldHtml('description_extended', [
  12. 'title' => 'Расширенное описание категории',
  13. 'can_multilanguage' => true,
  14. 'multilanguage_params' => [
  15. 'is_table_field' => true,
  16. 'table' => $table_name
  17. ]
  18. ]));
  19. $form->addField($fieldset_ids[0],
  20. new fieldString('icon_title', [
  21. 'title' => 'Название иконки категории'
  22. ]
  23. )
  24. );
  25.  
#1 [ЕСТЬ РЕШЕНИЕ] "Редактировать категорию" - дополнительное поле. 28 ноября 2024 в 18:40

Как добавить свое дополнительное поле на страницу «Редактировать категорию» и вывести его потом в шаблоне страницы категории?
Нашел нужный файл /system/content/forms/form_category.php, добавил поле

  1. new fieldCheckbox('test', [
  2. 'title' => 'test'
  3. ]),

Поле выводится на странице настройки категории, но введенные значения не сохраняется.
Буду благодарен, если кто подскажет что-куда прописать, чтобы:
1 Значения сохранялись.
2 Значения можно было вывести в шаблоне категорий (/templates/{templateName}/controllers/content/category_view.tpl.php).
В виджетах как-то автоматом все получается. А тут я че-то не понимать ))

#1 Автосохранение текстовых форм 21 июня 2024 в 15:39

Подскажите, как реализовать сохранение контента в поле-редакторе текста, например:
— после случайного закрытия вкладки браузера, ее перезагрузки
— после неудачного сохранения (допустим с интернетом что-то)
Еще неплохо бы сделать отдельную кнопку для сохранения без перезагрузки страницы и без удаления данных текстовой формы.
Есть идеи у кого?

#8 Как вывести отфильтрованный список контента? 3 апреля 2021 в 23:11

Всунете виджет в контроллер content, тогда заработает.

Loadырь
Я попробовал это сделать с \system\controllers\content\widgets\list\widget.php
Никаких изменений его поведения не обнаружил.

Посмотрел видео и думаю вы хотите сделать что-то такое prefitchi.ru/hotels ?

Loadырь
Скорее как здесь — move.ru, ну или как на Авито, в Циане и т.д. Доска объяв недвижимости специфична, в отличие от простых объяв. Нужно активно работать с адресами и картой. Пока в инстанте никто еще не реализовал этот функционал, а зря. Приходится самому делать, хоть я и не прогер )

Затем вы столкнетесь с ограничениями Яндекса на карте (25000 запросов в сутки и эта цифра не такая и большая как многим кажется). И это тоже вам надо будет как-то обходить.

Loadырь
Уже обошел ) Ключ у меня используется только единожды при добавлении объявления. Там идет проверка введенного адреса и если он есть, то вычисляются координаты. Которые потом, при просмотре списка и записи контента выводятся в отдельном шаблоне уже без ключа — он им не нужен.
Так что в день можно загружать минимум 5-10 тыс объяв. Сам просмотр их на сайте — "бесплатный" ))

Из-за этих ограничений потом вам надо будет решить задачу "Как вывести на карте только те записи, которые входят в область карты при ее прокрутке?".

Loadырь
Да, по идее надо, но думаю пока обойдусь. Так как не планирую размещать тысячи объяв. А для ускорения, можно выводить только минимальную информацию — заголовок, цена и координаты. Остальное можно подгружать (фото и прочее) аяксом при клике пользователем по метке на карте. (Уже работает).

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

Loadырь
Да, все верно.

В типе контента список формируется тут github.com/instantsoft/icms2/blob/master/system/controllers/content/frontend.php#L217. Там можете увидеть и как фильтрация сделана из фильтра.

Loadырь
Сегодня именно этот файл исследовал. Чувствую, что в нем разгадка. Но не могу понять (нет знаний) как это все втыкнуть в виджет? )
#9 Как вывести отфильтрованный список контента? 3 апреля 2021 в 18:08


Можно написать всё что угодно. Но много зависит, где вы делаете свой виджет. В content, в каком-то другом контроллере или вообще без контроллера.
Тут github.com/instantsoft/icms2/blob/master/system/controllers/content/widgets/list/widget.php есть пример того, что можно написать в файле widget.php. В вашем случае надо будет определить текущую категорию через

  1. getCategoryBySLUG($ctype_name, $slug)
и задать ее вместо этого блока github.com/instantsoft/icms2/blob/master/system/controllers/content/widgets/list/widget.php#L54

Loadырь
Спасибо за помощь! Но что-то не получается.
Виджет пока без контроллера. Но потом, может, запихну в контроллер контента, или создам отдельный.
По сути, мне надо получить то же, что и выводится в стандартном списке контента, только без пагинации.

Записал на видео, может понятней будет вопрос? )
youtu.be/MHvygibNamQ
#10 Как вывести отфильтрованный список контента? 2 апреля 2021 в 10:44


Делаю виджет.
Виджет показывается на страницах списка контента.
В нем нужно вывести список значений полей записей контента, допустим, — заголовки (title).
Например, мы находимся на странице списка объявлений в категории — Недвижимость -> Квартиры, отфильтрованного по цене.
В виджете нужно вывести весь отфильтрованный список заголовков из текущей категории.
Что можно написать в файле widget.php, чтобы записать этот список в переменную для передачи в шаблон?

Андрей В
Люди, помогите? )
#1 Как вывести отфильтрованный список контента? 1 апреля 2021 в 12:54
Делаю виджет.
Виджет показывается на страницах списка контента.
В нем нужно вывести список значений полей записей контента, допустим, — заголовки (title).
Например, мы находимся на странице списка объявлений в категории — Недвижимость -> Квартиры, отфильтрованного по цене.
В виджете нужно вывести весь отфильтрованный список заголовков из текущей категории.
Что можно написать в файле widget.php, чтобы записать этот список в переменную для передачи в шаблон?
#12 Как модернизировать фильтр поля applyFilter? 17 марта 2021 в 15:30


Там идентификатор по которому работает само поле хранится в одной ячейке, а строковое значение этого поля, которое выводится на сайте — в другой ячейке. Ячеек может быть только две — основная и "ненормальная". Больше нельзя добавить в этом случае.

Loadырь
Создал простейшее поле с содержимым в test.php
  1. class fieldTest extends cmsFormField {
  2. public $title = 'TEST';
  3. public $sql = 'varchar(500) NULL DEFAULT NULL';
  4. public $cache_sql = 'varchar(500) NULL DEFAULT NULL';
  5. public $filter_type = 'str';
  6. public $var_type = 'string';
  7. public $is_denormalization = true;
  8.  
  9. public function parse($value){
  10. return 'Cache: ' . $this->item[$this->getDenormalName()] . 'Test: ' . $this->item[$this->name];
  11. }
  12. }
в test.tpl.php
  1. echo html_input('text', $field->name, $field->item[$field->name], ['placeholder'=>'test']);
  2. echo html_input('text', $field->getDenormalName(), $field->item[$field->getDenormalName()], ['placeholder'=>'test_cache']);
Обычное поле пишет в базу вводимые значения, денорм — пишет NULL.
Если в самой базе поменять значение денорм-поля, то оно выводится в записи. Но если попробовать снова ввести данные в поле и сохранить, то в базе опять — NULL.
Что-то нужно сделать, чтобы в базу отправлялись вводимые значения из денорм-поля. Но вот что? )
#13 Как модернизировать фильтр поля applyFilter? 16 марта 2021 в 20:16


Гениев-то полно, добрых — чуть меньше, но сделать может каждый. Если вам нужен поиск чисто по "улице", то я бы в это поле сохранял значение улицы, а вот всё остальное уже закинул в денормальное поле (поле с суффиксом _cache). Хоть оно и не для это предназначено.

Попробуйте тогда этот фильтр

  1. $this->filter("JSON_EXTRACT(`" . $this->name . "` , '$.street') LIKE '%" . $value . "%';");

Loadырь
Это тоже не работает. Включается гифка бесконечной загрузки. Но никаких ошибок нигде не выскакивает.
Пробовал функцию JSON_EXTRACT в phpmyadmin, там выборка строк норм работает.
SELECT * FROM cms_con_board WHERE address->"$.street" = 'пр-т Мира';
Да, мне достаточно искать по значениям в одном ключе, например $.street.
Где можно посмотреть про "денормальное поле (поле с суффиксом _cache)" — что это такое?
Как вариант можно попробовать.
#14 Как модернизировать фильтр поля applyFilter? 16 марта 2021 в 17:56


Если это всё {"country":"Россия","city":"Москва","street":"пр-т Мира"} хранится в одной ячейке в БД, то никак. В одной ячейке можно фильтровать по "Содержит", "Не содержит", либо писать свой фильтр с JSON_EXTRACT dev.mysql.com/doc/refman/8.0/en/json-search-functions.html#function_json-extract.
Попробуйте это, хоть я и не уверен что сработает

  1. return $model->filterLike(JSON_EXTRACT($this->name , '$.street'), "%{$value}%");

Loadырь
Не сработало. JSON_EXTRACT думаю помог бы, но куда его прикрутить?
Может найдутся добрые гении и сделают тип поля для работы с json данными, в том числе и в фильтре?
Вроде вещь нужная много для чего )
#1 Как модернизировать фильтр поля applyFilter? 16 марта 2021 в 11:47
Создал свое поле, которое хранит адреса в формате json.
Например:
{"country":"Россия","city":"Москва","street":"пр-т Мира"}
Что нужно изменить в
  1. public function applyFilter($model, $value) {
  2. return $model->filterLike($this->name, "%{$value}%");
  3. }
чтобы фильтр искал только по адресу и не цеплял "country","city" и т.д.?
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.