Глупый вопрос: типы контента

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X

Как получить типы контента для формы

#1 8 мая 2020 в 17:25
Здравствуйте!
Наверное это глупый вопрос.
Мне нужно написать дополнение, заодно и поизучать как работает Instantcms.
Но уперся в проблему.
Делаю дополнение в админку. Только backend.
Нужно в параметрах form выбрать тип контента. Пытаюсь выбрать список типов контента из модели content, но пишет ошибку.
В NetBeans не видит методов работы с моделью content.
Может где почитать, какие классы и их методы откуда доступны, а откуда нет?
Делаю как по документации $this-model_content->getContentTypes(), Но выдает ошибку, нет мол такого метода…
#2 8 мая 2020 в 17:32
@sergvm,
Попробуйте так:
  1. cmsCore::getModel('content')->getContentTypes()
#3 8 мая 2020 в 17:48


@sergvm,
Попробуйте так:

  1. cmsCore::getModel('content')->getContentTypes()

Ris

Это работает. Я проверял. Но в документации написано:

В версиях InstantCMS выше 2.8.2, можно использовать обращением к динамическим свойствам $this→model_CONTROLLER_NAME, где CONTROLLER_NAME название требуемого контроллера, к модели которого нужно подключиться. Пример выше можно переписать вот так:

  1. // Получаем данные из модели users
  2. $users = $this->model_users->getUsers();

Instantcms

Такая конструкция существенно сокращает код. И она применяется в движке, я смотрел.
Получается, что она не везде может вызываться?
#4 8 мая 2020 в 18:06

Нужно в параметрах form выбрать тип контента

@sergvm
Как я понимаю, вы хотите это сделать в классе формы. Там это не работает, только из контроллеров.
#5 8 мая 2020 в 20:04


Нужно в параметрах form выбрать тип контента

@sergvm
Как я понимаю, вы хотите это сделать в классе формы. Там это не работает, только из контроллеров.

Fuze

Извините, но прочитайте предыдущий ответ.
Работает, но не все как в документации
И в том-то вопрос, где описано в документации, что работает и из чего: какие классы и откуда доступны?
#6 8 мая 2020 в 20:17

Работает, но не все как в документации

@sergvm
Работа с моделью в контроллерах.


Но наверное да, не слишком очевидно написано, дополнил.

Вы лучше сразу приводите пример кода или контекст, о чем вы спрашиваете, сходу не совсем понятно.
#7 8 мая 2020 в 20:27


Работает, но не все как в документации

@sergvm
Работа с моделью в контроллерах.


Но наверное да, не слишком очевидно написано, дополнил.

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

Fuze
Это подключение собственной модели.
А я речь веду о подключении модели content, например, (о чем и писал выше). Т.е. это подходит под определение "Подключение чужой модели"
Как в документации
pastenow.ru/edit/b1182c4559af3f11bf81c730b56d77fb
#8 8 мая 2020 в 20:40

Это подключение собственной модели.

@sergvm
Я вам на скриншоте выделил красным, чтобы вы поняли, что в документации всё описано логично, ни о каких классах форм там не сказано. Кроме этого, повторяю, я добавил сейчас в документацию все слова, чтобы интерпретация описания стала максимально однозначной.

Подобные вызовы доступны из контекста контроллера, т.е. из его фронтэнда, бэкенда и экшенов.


Если вам по прежнему не понятно, приведите часть своего кода.
#9 8 мая 2020 в 20:58


Это подключение собственной модели.

@sergvm
Я вам на скриншоте выделил красным, чтобы вы поняли, что в документации всё описано логично, ни о каких классах форм там не сказано. Кроме этого, повторяю, я добавил сейчас в документацию все слова, чтобы интерпретация описания стала максимально однозначной.

Подобные вызовы доступны из контекста контроллера, т.е. из его фронтэнда, бэкенда и экшенов.


Если вам по прежнему не понятно, приведите часть своего кода.

Fuze

Спасибо за добавление, увидел ( Не обновил кэш страницы со справкой :))
Хотя у меня в form работает и такой код:
  1. class formImpexpOptions extends cmsForm {
  2.  
  3. public function init() {
  4. return array(
  5. 'type' => 'fieldset',
  6. 'childs' => array(
  7. new fieldFile('file_from', array(
  8. 'title' => 'Файл импорта:',
  9. )),
  10. new fieldList('content_to', array(
  11. 'title' => 'Тип контента:',
  12. 'items' => array_column(cmsCore::getModel('content')->getContentTypes(),'title','id'),
  13. )),
  14. )
  15. )
  16. );
  17. }
  18.  
  19. }
Раз уж вы разработчик, то задам еще вопрос: откуда оптимальнее(правильнее) подключать чужую модель в плане производительности: контроллер или экшн?
#10 10 мая 2020 в 23:25
  1. new fieldList('ctype_id', array(
  2. 'title' => LANG_CONTENT_TYPE,
  3. 'generator' => function($item) {
  4.  
  5. $model = cmsCore::getModel('content');
  6. $tree = $model->getContentTypes();
  7.  
  8. $items = array();
  9.  
  10. if ($tree) {
  11. foreach ($tree as $item) {
  12. $items[$item['id']] = $item['title'];
  13. }
  14. }
  15.  
  16. return $items;
  17.  
  18. },
  19. )),
Любите мало кода?))
  1. new fieldList('ctype_id', array(
  2. 'title' => LANG_CONTENT_TYPE,
  3. 'items' => array_collection_to_list(cmsCore::getModel('content')->get('content_types'), 'id', 'title')
  4. )),

Раз уж вы разработчик, то задам еще вопрос: откуда оптимальнее(правильнее) подключать чужую модель в плане производительности: контроллер или экшн?

Я не разработчик, но рискну ответить — подключать надо там, где она вам нужна.
#11 10 мая 2020 в 23:40
Кстати, еще теоретический вопрос.
Что будет экономнее в плане потребления памяти?
  1. $model = cmsCore::getModel('content');
  2. $tree = $model->getContentTypes();
или
  1. $tree = cmsCore::getModel('content')->getContentTypes();
С точки зрения дилетанта, лишняя переменная болтающаяся в оперативке, занимает лишнюю память.
Причем переменная $model = cmsCore::getModel('content'); — это не два байта, это достаточно большой объем.
#12 10 мая 2020 в 23:46
Ris, не я автор этого кода. Открываем файл system/controllers/content/widgets/categories/options_form.php и задаем этот вопрос Fuze)))
Если уж говорить об оптимизации и потреблении памяти, то и все поля таблицы читать не обязательно, достаточно двух полей — id, title))

P.S. Кстати, учитывайте тот факт, что форма, это не та страница, которая нуждается в сверхоптимизации. Сколько форм отправляют ежедневно ваши пользователи и сколько миллисекунд вы на этом выиграете?))
#13 10 мая 2020 в 23:55

Если уж говорить об оптимизации и потреблении памяти, то и ве поля таблицы читать не обязательно, достаточно двух полей — id, title))

dwd
Увы, тогда всё равно придется получить полностью массив типов контента, а потом перебрать его и получить только id и title.
Массив все равно будет висеть в оперативке. Плюс операции на извлечение двух индексов, плюс еще куча переменных.
#14 11 мая 2020 в 00:07

Увы, тогда всё равно придется получить полностью массив типов контента, а потом перебрать его и получить только id и title. Массив все равно будет висеть в оперативке. Плюс операции на извлечение двух индексов, плюс еще куча переменных.

Наверно мы живем в разных мирах или я просто не умею объяснять. Прочувствуйте разницу между getContentTypes(), которая читает все поля таблицы и
  1. $model->selectOnly('id')->select('title')->get('content_types');
P.S. Переживаете за расход памяти — используйте unset(); Однако в данном случае это не имеет смысла, поскольку как только данная функция завершит свою работу занимаемая этими переменными память освободится.
#15 11 мая 2020 в 14:26

Раз уж вы разработчик, то задам еще вопрос: откуда оптимальнее(правильнее) подключать чужую модель в плане производительности: контроллер или экшн?

@sergvm
Я вопрос не понял. Экшн это часть контроллера. Подключайте любым способом, как удобнее, что здесь обсуждали.

Что будет экономнее в плане потребления памяти?

Ris
Равнозначно. Новый объект модели будет создан и там и там. Условная переменная всего лишь ссылка не него.

С точки зрения дилетанта, лишняя переменная болтающаяся в оперативке, занимает лишнюю память.

Ris
PHP подчищает за собой автоматически. Ансетить переменные без явной необходимости (когда у вас в переменной десятки мегабайт, какой-то цикл и т.п.) нет смысла. Экономить на спичках тоже.

Кстати, учитывайте тот факт, что форма, это не та страница, которая нуждается в сверхоптимизации

dwd
Именно.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.