Методы в system/core/model.php

#16 22 октября 2014 в 23:42
Геннадий Иванович, спасибо вам огромное!
Всё же я никак не пойму: зачем создавать суперскую объектную модель сайта, радоваться, что форма теперь создаётся в три десятка кликов, а одновременно требовать от пользователя-разработчика глубочайшего вникания в то, от чего его только что заботливо отгородили?
Другая непонятка: вроде бы ВРЕМЯ – не такая уж ненужная штука, в любой системе программирования с полдюжины функций встроенных имеется, чтобы удобно было временем оперировать и так, и этак… Почему же здесь времени не уделено вообще никакого внимания, кроме второстепенных настроечных возможностей?

Я уже подумал про использование выпадающих списков для выбора часов и минут, но это же опять, поперёк философии сайта, надо будет править какой-то шаблон, чтобы хотя бы эти списки сделать не во всю длину контроллера и на одной строке...
Всё поправимо, конечно, но почему так противоречиво?
Или я всё же опять чего-то недопонял?
#17 24 октября 2014 в 09:46
Так. Переформулирую вопрос.
Как в терминах Model.php переписать запрос

  1. SELECT d . * , f.id, f.image
  2. FROM cms_kino_dates d
  3. LEFT JOIN cms_kino_films f ON d.code = f.code
  4. WHERE d.date > '2014-10-23'
вот так не катит

  1. public function getKino($date){
  2. $this->filterEqual('date', $date);
  3. $this->join('kino_films', 'f', 'f.code = i.code');
  4. $this->select('f.id, f.image');
  5. return $this->get('kino_dates');
  6. }
код честно подсмотрел в фотобитвах.
#18 24 октября 2014 в 10:12

обнаружил в классе fieldDate две функции, где речь идёт о времени, но не очень понятно – можно ли этим воспользоваться?

Aquarius
  1. new fieldDate('date_pub', array(
  2. 'title' => LANG_CONTENT_DATE_PUB,
  3. 'default' => date('Y-m-d H:i'),
  4. 'options' => array(
  5. 'show_time' => true
  6. ),
  7. 'rules' => array(
  8. array('required')
  9. )
  10. ))
Поле даты будет дополнено выбором времени

Как в терминах Model.php переписать запрос

Евгений
У вас все верно, только вместо $this->join() используйте $this->joinLeft()

Почему же здесь времени не уделено вообще никакого внимания, кроме второстепенных настроечных возможностей?

Aquarius
Раньше (в 1.x) вы тратили меньше времени на обучение, но зато при создании расширений каждый раз делали одни и те же операции.
Сейчас обучение займет больше времени, но зато потом все основные операции (создание тех же форм) будут выполняться гораздо быстрее
#19 24 октября 2014 в 11:33

У вас все верно, только вместо $this->join() используйте $this->joinLeft()

r2
я перепрбовал и лефт, и райт, и от безысходности все варианты с join из model. Как только в методе появляется select — метод возвращает массив с 4мя элементами (уникальными, без повторов). Без join и select все хорошо. Возвращает все 5 записей из базы (4 уникальных фильма и один повтор в другом кинотеатре).

Вот для наглядности.
Мой запрос

Иллюстрация

А вот результат кода с join в методе

  1. array(4) {
  2. [2]=>
  3. array(7) {
  4. ["date"]=>
  5. string(10) "2014-10-24"
  6. ["film"]=>
  7. string(38) "Прогулка среди могил"
  8. ["code"]=>
  9. string(6) "596274"
  10. ["place"]=>
  11. string(14) "Мелодия"
  12. ["time"]=>
  13. string(29) "09:00 13:30 15:40 20:10 20:30"
  14. ["id"]=>
  15. string(1) "2"
  16. ["image"]=>
  17. string(13) "kino/2014/10/"
  18. }
  19. [3]=>
  20. array(7) {
  21. ["date"]=>
  22. string(10) "2014-10-24"
  23. ["film"]=>
  24. string(10) "Судья"
  25. ["code"]=>
  26. string(6) "588672"
  27. ["place"]=>
  28. string(14) "Мелодия"
  29. ["time"]=>
  30. string(29) "09:00 11:10 15:40 17:50 22:20"
  31. ["id"]=>
  32. string(1) "3"
  33. ["image"]=>
  34. string(13) "kino/2014/10/"
  35. }
  36. [1]=>
  37. array(7) {
  38. ["date"]=>
  39. string(10) "2014-10-24"
  40. ["film"]=>
  41. string(14) "Дракула"
  42. ["code"]=>
  43. string(6) "395057"
  44. ["place"]=>
  45. string(14) "Мелодия"
  46. ["time"]=>
  47. string(17) "11:40 13:50 18:20"
  48. ["id"]=>
  49. string(1) "1"
  50. ["image"]=>
  51. string(13) "kino/2014/10/"
  52. }
  53. [5]=>
  54. array(7) {
  55. ["date"]=>
  56. string(10) "2014-10-24"
  57. ["film"]=>
  58. string(18) "Выпускной"
  59. ["code"]=>
  60. string(6) "839200"
  61. ["place"]=>
  62. string(16) "Меридиан"
  63. ["time"]=>
  64. string(5) "22:45"
  65. ["id"]=>
  66. string(1) "5"
  67. ["image"]=>
  68. string(13) "kino/2014/10/"
  69. }
  70. }
  71.  
Еще после join и select почему-то нарушается нумерование элементов в массиве. При обычном запросе они 0,1,2,3, при запросе из model.php они 1, 2,3,5
#20 24 октября 2014 в 13:31
Такс… стал подглядывать другие файлы, и увидел реализацию запроса с синонимами для столбцов. Попробовал.

  1. public function getKino($date){
  2. $this->select('f.id', 'film_id');
  3. $this->select('f.image', 'film_image');
  4. $this->joinLeft('kino_films', 'f', 'f.code = i.code');
  5. $this->filterEqual('date', $date);
  6. return $this->get('kino_dates');
  7. }
Возвращает то, что нужно. По сути, два запроса одинаковых. Где логика работы метода селект — не понял. Но без синонимов он режет строки с повторяющейся ячейкой. facepalm
#21 24 октября 2014 в 14:54

Раньше (в 1.x) вы тратили меньше времени на обучение, но зато при создании расширений каждый раз делали одни и те же операции.
Сейчас обучение займет больше времени, но зато потом все основные операции (создание тех же форм) будут выполняться гораздо быстрее

r2
r2, безмерно вам благодарен, хотя мне безумно жаль тратить ваше поистине драгоценное время на такие мелочи!
Ведь если бы та документация, которая столь здо́ рово начата здесь docs.instantcms.ru/dev/controllers, была продолжена и закончена, огромное количество вопросов бы не понадобилось, да и дошедших до результата разработчиков было бы заметно больше.
Видео-туториалы – отличный и нужный проект, он реально заряжает на действия! Но извлекать из него справочные знания – крайне тягомотно и, как показывает этот диалог, не слишком эффективно...
Ещё раз спасибо!
#22 24 октября 2014 в 15:59

без синонимов он режет строки с повторяющейся ячейкой

Евгений
Это происходит потому, что эти строки имеют одинаковое значение в поле id

при запросе из model.php они 1, 2,3,5

Евгений
по-умолчанию метод get() модели делает ключами массива значения поля id для каждой строки
если посмотреть определение метода get() в классе cmsModel:
  1. public function get($table_name, $item_callback=false, $key_field='id')
третий параметр как раз задает какое поле делать ключом массива
вы можете отменить это поведение так:
  1. $this->get('kino_dates', false, false);
тогда массив на выходе будет пронумерован стандартно, от нуля
#23 24 октября 2014 в 16:03

Ведь если бы та документация, которая столь здо́ рово начата здесь docs.instantcms.ru/dev/controllers, была продолжена и закончена, огромное количество вопросов бы не понадобилось, да и дошедших до результата разработчиков было бы заметно больше

Aquarius
Поверьте, я и сам очень хорошо понимаю важность документации. Она обязательно будет продолжена как только выдастся возможность.
#24 25 октября 2014 в 12:18
Aquarius! Вот готовое решение для Вас Скачать — Дополнительное поле Дата и время ICMS2.1.1
Я использую это решение при создании своего компонента в форме поля даты и времени .
В таблице типа timestamp и datetime .
Формат постоянный date('Y-m-d H:i:s')
Пример поля в форме
  1. new fieldDatetime('Name**', array(
  2. 'title' => 'Title**',
  3. 'rules' => array(
  4. array('required'),
  5. array('max_length', 19),
  6. array('min_length', 10)
  7. ),
  8. 'default' => date('Y-m-d H:i:s')
  9. )

PS// Буду рад если Вам это поможет!
#25 26 октября 2014 в 00:23

Буду рад если Вам это поможет!

Геннадий Иванович
Да, Геннадий Иванович, однозначно поможет! Спасибо за столь радикальный способ!
Так же, как уже помогло решение от r2:

  1. new fieldDate('date_pub', array(
  2. 'title' => LANG_CONTENT_DATE_PUB,
  3. 'default' => date('Y-m-d H:i'),
  4. 'options' => array(
  5. 'show_time' => true
  6. ),
  7. 'rules' => array(
  8. array('required')
  9. )
  10. ))
Вот какая есть идея-просьба: если у вас имеется доступ к редактированию документации, вставьте там в соответствующем, пока, кстати, пустующем месте, эти оба приёма, поскольку для многих приложений важно собирать и выдавать сведения о времени.
А потом, когда документация дойдёт до этого места, автор придумает, как органично эти приёмы включить в текст основного повествования!
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.