Сергей Шлоков

Сергей Шлоков

С нами с 31 января 2013; Место в рейтинге пользователей: #3
Сергей Шлоков
18 ноября 2019, 16:21
+1
ЧТО делает сниппет differenceBetweenDatesInSeconds все разобрались. Осталось только понять ЗАЧЕМ?
Сергей Шлоков
17 ноября 2019, 09:39
+4
Ты в Laravel не ходи, расстроишься. Там аж две библиотеки хелперов из коробки. И Тейлору ничего не говори. Его твоё мнение может огорчить.

Такое впечатление, что это просто синтаксический сахар. То есть, ничего особо полезного не несет.
Боюсь тебя расстроить, но MODX — это синтаксический сахар над PHP. Юзай последний. Не отказывайся от своих принципов.

И, соответственно, его не стоит использовать. Это помешает другим работать над проектом.
Не используй. Сделай мне больно.

П.С. Только щас заметил, что мой коммент почему-то попал не в корень, а залетел в ответ на твой коммент. Видимо глаза уже подводят.
Сергей Шлоков
17 ноября 2019, 09:29
+2
Не путай логику отображения с логикой приложения. Последней не место во вьюхах. Вот пример логики отображения.

Лично я не вижу особой необходимости в объекте $_modx как ограничителе функциональности для безопасности. Этого нет ни в одном шаблонизаторе. Видимо никому не понадобилась такая фича. А вот как объект для работы со вьюхами (шаблонами, чанками, ресурсами) он хорош. Для правильной работы, если можно так выразится. И юзер $_modx->user там нужен! Хотя я бы сделал юзера отдельным объектом для удобства. Но считаю, что кэшменеджер тут лишний. Вот такое имхо. Но, как правильно сказал Павел, ты может делать что хочешь и как хочешь. Fenom позволяет юзать даже объект $modx. It's up to you.
Сергей Шлоков
16 ноября 2019, 09:11
3
+8
Эх, молодежь. Всё делается гораздо проще. Ставим modHelpers и используем функцию snippet.
{snippet("mySnippet", ["param" => "value"], 604800)}  // сохраняем на неделю. Третий параметр лучше указать через массив (см. ниже)

А в cron удаляем кэш и парсим страницу сниппетом
... // инициализация MODX
// Лучше указать отдельную папку для хранения данных. Иначе данные будут лежать в папке cache/default, которая очищается при сохранении любого объекта MODX.
$options = array(
  cache_key => 'mysnippet_cache',
  cache_expires => 604800,
);
cache()->delete("mySnippet", $options);
snippet("mySnippet", ["param" => "value"], $options);
Что важно! В данном случае сам сниппет на странице вызывается некэшированным. Поэтому кэш самой страницы обновлять не нужно. Только кэш сниппета!!! Обратите внимание, насколько код стал проще.

Функция snippet() сама проверит кэш. Если его нет, то выполнит указанный сниппет и результат сохранит в кэш. И не нужно вычислять все эти секунды. Cron каждую неделю будет обновлять кэш независимо от того, есть он или нет. Поэтому сниппет differenceBetweenDatesInSeconds не нужен. И даже вреден. Ибо делает ненужную работу для каждого запроса страницы.

П.С. И ещё совет. Не пихайте логику во вьюхи. Это бад практис! Перенесите логику в сниппет и вызывайте его на странице.
Сергей Шлоков
14 ноября 2019, 07:23
+2
Одно замечание. Префикс «mod» зарезервирован для системного функционала. А твой компонент явно никак не связан с ядром. Лучше не нарушать правила!
Сергей Шлоков
05 ноября 2019, 16:57
0
Продолжаем ликбез. Если Вы хотите, чтобы человек,. написавший комментарий, Вам ответил, нужно ответить на его комментарий. Тогда он получит уведомление. Это раз.
Два. Забейте в поиск «pdoresources modx» и получите нужные ответы. Можно глянуть доку. Тут нужно обратить внимание на параметр «parents». Подсказка —
&parents=`[[*parent]]`
Это нужно вызывать в шаблоне статей.
Сергей Шлоков
05 ноября 2019, 09:16
0
но думал что по алигории с папкой, есть папка в ней контент, в другой папке свой контент, а выходит в какую бы папку контект не залил, он виден из всех.
Во-первый, не аллегория, а аналогия. Во-вторых, именно так и работает.
Сергей Шлоков
03 ноября 2019, 12:56
+1
Тогда можно и так freelancemodxthebestfuckingcmsofalltime7723.tv ))
Сергей Шлоков
03 ноября 2019, 10:08
0
так как хочу делать структуру сайта с 3 категориями и в последней статьи для удобства фильтра
Видимо имеется ввиду 3 уровня категории.

pdoMenu работает с данными уже ввиде дерева, а не с плоским списком. Проще всего реализовать такое через Fenom. К сожалению, из коробки сниппеты pdoTools не умеют работать сырыми данными. Попробуйте разобраться с таким решением. Дальше как два пальца…
Сергей Шлоков
03 ноября 2019, 09:40
+2
Полностью согласен. С маркетинговой точки зрения не должно быть привязки к региону — ни ru, ни by, ни ua. Если проект задумавается как масштабный для РУ-сегмента, то домен com или pro. И без ограничений по коммерции (не знаю, разрешено ли это на pro).

Моё мнение — выделить на него одну минуту, сняв шляпу и помолчав. RIP.
Сергей Шлоков
18 октября 2019, 07:40
1
+1
Можно написать в другом формате
'select' => '["MedPred.*, COUNT(profile.id) as `users`, COUNT(IF(get_upload_count(profile.internalKey) > 0, 1, NULL)) as `uploads`"]'
В таком формате xPDO вставляется без обработки.

П.С, Это json массив с одной строкой.
Сергей Шлоков
17 октября 2019, 07:43
+2
[[+publishedon:strtotime:add=`3600`:date=`%a, %d %b %Y %H:%M:%S +0400`]]
Сергей Шлоков
13 октября 2019, 23:01
0
Мы раньше вроде были на «ты». Я так постарел?

Обрати внимание на метод $app->run();
В нём вызываются конкретные классы. Причем, если не указан конкретный реквест, то он определяется автоматически по установленным пакетам (я выше писал).

Но признаюсь, синтаксис в slim4 мне сложноват, он прям на полную использует все нововведения седьмых версий php
А мне безумно нравится. В пекло PHP 5. ))

Я на данном этапе решил, что методы из интерфейса psr-7 (и psr-15 ) вшиты в сам php.
Найн. Ю а ронг.
Сергей Шлоков
13 октября 2019, 19:36
0
В комментарии это не обьяснишь. Попробуй почитать тут. Но ты как-то широко шагнул. Сначала нужно базовые знания получить, а потом усложнять.
Интерфейсы дают малую связанность. Т.е. ты можешь подсунуть в метод любой класс, соответствующий определенным требованиям. За это как раз и отвечает интерфейс.

Но где прописана реализация этих методов из стандарта psr-7?
У того же Slim эти классы пробрасываются при инициализации приложения. В нем жестко прописана проверка наличия нескольких пакетов. Сначала свой пакет, потом Guzzle и ещё какие то. Не помню. Но можно и самому инстанциировать любой свой класс запроса или ответа. Главное, чтобы соответствовал интерфейсу. Иначе будет ошибка.

Есть фреймворки. строго следующие этим стандартам. К примеру Slim.
Тройка ещё не соответствует. Например, $response->toJson() не соответствует стандарту. А вот четверка поддерживает почти все текущие утвержденные стандарты. После тройки приходится привыкать. И всякие методы обработки запроса и ответа выносить на сервисный уровень.
Сергей Шлоков
05 октября 2019, 10:08
0
Это не претензия. Просто пример одной из возможных реализаций. Можно и так и эдак и по всякому.
Сергей Шлоков
05 октября 2019, 09:57
1
+1
Мысли в воздух.
Не обязательно расширять сервис ради проверки прав. Мы можем сделать любую проверку самостоятельно
// Вместо этой проверки
if (!$rest->checkPermissions()) {
    $rest->sendUnauthorized(true);
}
// Пишем свою 
if (!$modx->hasPermission('some_permission')) {
    $modx->sendUnauthorizedPage();
    // echo json_encode(['success' => false, 'message' => 'Permission denied.']); exit;
}
Сергей Шлоков
05 октября 2019, 09:38
+1
Следуя парадигме современной разработки, использовать папку model нужно только для моделей. Т.е. класс модели xPDO, схема и мап-файл. Остальному там не место.
Сергей Шлоков
04 октября 2019, 14:11
0
Уберите у 404 страницы из футера форму обратной связи.
Сергей Шлоков
29 сентября 2019, 22:31
+3
REST — это архитектурный стиль. А RESTful API — это реализация этого стиля.
Правильно говорить именно RESTful API, но в народе уже прижилось неправильное название REST API.