Алексей Карташов

Алексей Карташов

Был в сети 23 ноября 2019, 13:47
Заказы не принимаю
Нажать кнопку «Переустановить» рядом с пакетом и заново выбрать эту галочку? =)

Вообще должна быть системная настройка специальная, но что-то сходу я её не нашёл, поэтому переустановка — 100% вариант.
Та же шляпа(
Удаляю у себя сессионную куку и раскомменчиваю die в коде выше.
1. Первая загрузка страницы — false false. Ок.
2. Логинюсь в админке.
3. Обновляю страницу — true true. Ок.
Да только вот в этот момент из админки уже выкинуло и на третье обновление страницы снова получаю false false.

И такая картина что на OnHandleRequest, что на OnWebPageInit.

Чет вся эта modx-магия меня уже задалбывать начинает. Мож и правда у меня руки не из того места..
Сейчас буду все плагины всех компонентов отключать и дебажить.
Т.к. не мне одному интересна данная тема и кто-то даже добавил этот тикет себе в избранное, то расскажу-ка я об ещё одной возникшей проблеме дабы сэкономить потомкам часы гугления и нервы.

Вот такой вот нехитрый код:
$id = 1;

$o = $modx->getObject('myObjectOne', $id);
$o->fromArray(array(
  'active' => 0
));
// или так:
// $o->set('active', 0);

var_dump($o->save());
будет приводить к вот такой вот ошибке (в modx-логе):
Attempt to save lazy object: Array( <массив объекта> )

Дело в том, что такой вот унаследованный объект полученный методом $modx->getObject будет lazy (а вот через newObject всё хорошо). Не буду расписывать что это такое и почему. Факт в том, что сохраняться ничего не будет.
Чтобы всё работало как ожидается, надо в унаследованных классах переопределять метод set:
function set ($k, $v= null, $vType= '') {
  if ($this->isLazy()) $this->_loadFieldData($this->_lazy);
  return parent::set($k, $v, $vType);
}
Либо перед изменением данных объекта делать
$o->toArray();
// а потом что-то изменяем
$o->set('active', 0);
Тогда тоже будет хорошо, но это не удобно.

Лучше переопределить метод set и не заморачиваться. В этом случае $o->fromArray() тоже будет работать адекватно.
Потому что у Битрикса своя партнёрская программа для веб-студий, на чем они (студии) дополнительно зарабатывают. Это часть битриксовского маркетинга.
Плюс практически вся разработка основана на мышетыкательном интерфейсе, которого для типовых задач типовой веб-студии хватает с головой, для всего остального есть маркетплейс ©. Редактор всего и вся с фронтенда. Огромная документация на русском. Много решений для интернет-магазинов, интеграции с различными CRM-ками и ERP (пресловутый 1С через commerceML), из-за чего всякие эльдорадо и техносилы именно на битриксе и сделаны. Плюс продавать "Это ж 1С! Гарантия! <сколько-то там> лет поддержки!" гораздо проще, чем любой другой продукт, даже коробочный.
Ну и не стоит забывать об активнейшем маркетинге этого самого битрикса.
___________________

Вы не подумайте, это — не реклама. Сам я с битриксом работал лишь однажды 3-4 года назад.
Но 2 года назад как раз работал в такой вот типовой региональной веб-студии, которая к моменту моего трудоустройства (seo-шником, как ни странно)) переехала с modx evo на битрикс.
Так вот абзац до черты — это практически дословный пересказ того, что на вопрос "чем modx не угодил? почему битрикс?" мне ответил директор той студии.

Такие дела. Маркетинг, как ни странно, решает.

p.s. не знаю как сейчас, но раньше тормоза у него были знатные.
тыц.
Ну как бы это… Не правильно жеж настроено.
У тебя переадресация идёт абсолютно для любых адресов, а тебе надо только для несуществующих.
Изначально смысл такой — если папка или директория физически на сервере не существует, то этот адрес отправляется в index.php в get-параметре «q», и этот параметр уже обрабатывает сам modx (ищет этот урл среди ресурсов).

Вот эти строки оригинальном htaccess'е, который идёт вместе с modx (1):
RewriteCond %{REQUEST_FILENAME} !-f # файл на сервере физически не существует
RewriteCond %{REQUEST_FILENAME} !-d # директория на сервере физически не существует
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] # отправляем этот адрес в точку входа modx

Так вот этот приём и нужно использовать (2):
RewriteCond %{REQUEST_FILENAME} !-f # файл на сервере физически не существует
RewriteCond %{REQUEST_FILENAME} !-d # директория на сервере физически не существует
RewriteCond %{REQUEST_URI} (.*)/ # проверяем, что есть слэш на конце урл
RewriteRule ^(.*)/$ http://site.ru/$1 [R=301,L] #делаем редирект
И уже не нужно писать отдельные условия-исключения для всяких там папок, типа 'manager', 'assets' и всех других.

Строки (2) нужно вставить перед строками (1), иначе апач отдаст строку с урл в index.php и до редиректа дело не дойдёт.

p.s. и да, я не тестировал, пишу по памяти ибо последний раз htaccess настраивал с год назад. Но вроде должно работать. Переходите на nginx :-)