Сейчас с регистрацией и оплатой решаю, 750 рублей будет стоить. И места гарантировать надо, и шашлыки/пиво обеспечить :)
Сорри, картинки побились.

Всем добрый день!
Специально для тех, кто давно уже хотел переехать в Москву, но по каким-то причинам не решался, объявляю об уникальной возможности сделать это сейчас! MODX-Клуб, совместно с новым стратегическим партнером, открывает постоянную базу в ближайшем Подмосковье. И это не какой-то клочок земли, а 11 га территории с несколькими зданиями общей емкости на 800 человек (пансионат). Конечно не все знания нам сейчас будут переданы, так как мы просто не сможем такой объем сразу использовать, но цели намечены в процессе выйти на то, чтобы вся территория была отдана нам в пользование. На территории имеется несколько административных зданий (в том числе трехэтажное отремонтированное здание школы), дом культуры, ресторан, гостиничные корпуса, пейнтбольные площадки, панда-парк, беседки с мангалами, озеро, футбольная площадка и т.п. В общем, есть где разгуляться. Сейчас, конечно, не все еще в потрясающем виде, мягко говоря, но будем облагораживать и прокачивать. Ремонт сделаем (не силами IT-специалистов, а строителей-ремонтников :)), в пруд запустим карпов (чтобы рыбачить), столовую введем в эксплуатацию (столовая на 100 человек), свой транспорт (чтобы до электрички курсировал) и т.д. и т.п. От Москвы на самом деле относительно не далеко. Ж/д станция всего в пяти километрах от нас, а там на электричке 50 минут и вы почти в центре Москвы (м. Белорусская). Да и каждый день ездить никуда не надо — жить и работать — все на одной территории.
Несколько сумбурное вступление получилось, но, думаю, все поняли о чем речь:) А теперь о том, кто и как к нам может попасть. На самом деле сейчас требуются самые отважные. Условия, конечно, далеко не самые спартанские, но все-таки предстоит обжиться. Сейчас, условно, есть здание, завезется мебель и все необходимое для жизни, но если вы привыкли к комфорту, то скорее всего к нам еще рановато ехать. Но я помню как я в Москву улетал — с компьютером в сумке и в ночь перед отлетом в интернете смотрел где я вообще что снять могу, так что для меня подобные условия тогда были бы пределом мечтаний. То есть если вы не боитесь условных трудностей на первых парах — то вы потенциальный кандидата. Сразу отмечу финансовую сторону вопроса: вы оплачиваете только свою дорогу до Москвы и имеете финансовый резерв на билет в обратную сторону. За проживание и питание платить не придется. То есть вы приезжаете и все, никаких расходов на первое время не потребуется. Когда придется воспользоваться необходимостью покупки обратного билета? Если мы с вами сработаемся, то только когда вы сами это решите сделать. Мы нацелены на постоянное сотрудничество. Но даже если мы не сработаемся (что вряд ли), минимальный срок вашего отдыха здесь будет — месяц. То есть вы сможете и отдохнуть, и просто для себя многому научиться в MODX. Если вы проходите испытательный срок и мы сработаемся, значит будет зарплата (обсуждается с каждым индивидуально). Если вы уже состоявшийся специалист и хотите зарплату с первого месяца, этот вопрос так же решаем, сразу пишите об этом в своем резюме.
Немного фотографий. Ракурсы не самые лучшие, но в целом представление позволит создать.
Пожелания к соискателям. — Мы в первый месяц планируем всего принять до 10-ти человек (позже готовы сразу значительно увеличить лимиты, но пока не все еще сделано, не хотелось бы значительно увеличивать риски), по-этому будет конкурсный отбор кандидатов. Присылайте мне на почту n.lanets@modxclub.ru свои резюме. — Опыт не ниже среднего. Процесс обучения с нуля — очень емкий по времени, поэтому сейчас нужны специалисты хотя бы со средним уровнем. То есть хотя бы верстку понимать, какие-то сайтики небольшие опыт создания и т.п. Да, не придется сразу с первого дня работать с показателями эффективности, не менее месяца мы отводим на обучение, но все-таки надежней обучать тех, у кого уже есть какая-то база и понимание, что они точно хотят этим заниматься. Хотя предпочтение будет отдано MODX-разработчикам, тем не менее даже если вы специалист в другой области (дизайнер, laravel/bitrix-разработчик, системный администратор и т.п.) и хотите все-таки с нами двигаться — не стесняйтесь, присылайте заявки. — Огромным плюсом будет наличие своего любимого ноутбука на первое время. Чуть позже мы закупим необходимую технику, но на первое время все-таки хорошо бы иметь свой ноутбук. Но, если его нет, а приехать хочется, все равно присылайте заявку, это не обязательное условие, решим этот вопрос.
Весенний MODX DevCamp Есть и еще новость: мы ранее объявляли о своих планах провести слет в апреле, и вот в последний момент решили провести его не в форме митапа в каком-нибудь конференц-зале, а в форме дружественного кэмпинга на территории нашей новой базы. Здесь есть минус в том, что скорее всего мы не сможем организовать технические доклады с хорошей видеозаписью (хотя совершенно не факт, может даже все и получится), но есть серьезное преимущество — это будет целых три дня! :) То есть все, кто пожелает остаться с ночевкой, без ночлега не останутся. В программе много душевных бесед, шашлыки, пейнтбол, отдых и чистый воздух. Так что кто заинтересовался первой частью этого топика, но не решил еще твердо для себя готов он на этот шаг или нет, можно вот приехать в гости и там уже для себя решить окончательно. Даты проведения мероприятия: 22-24 апреля (хотели в самых последних числах, но тогда бы не смог к нам Василий Наумкин приехать. А так не гарантия, но шанс есть). С 10-ти утра готовы будем гостей принимать.
У кого какие вопросы-предложения есть, пишите в комментариях, с удовольствием отвечу.
P.P.S. Кто оплачивает свой билет, и если не авторизован, присылайте после оплаты обязательно мне на почту n.lanets@modxclub.ru информацию о платеже, чтобы я сразу фиксировал. А то яндекс.касса не дает детальной информации о платеже, и я там не могу видеть какой емейл был указан. Завтра в биллинг допишу сохранение всех деталей платежа.
P.P.P.S. Информация для тех, кто планирует приехать и остаться в нашей команде: 1. Присылаете нам резюме. 2. Получаете от нас подтверждение, что да, мы нам подходите. 3. Берете билет в один конец и билет на девкемп (это нам просто надо для планирования сколько будет человек, сколько чего готовить и т.п.). 4. После дев-кемпа остаетесь с нами — мы вам сразу эти 750 рублей возвращаем.
P.P.P.P.S. Если у кого-то не получается связаться с нами по почте, не забывайте, что в контактах есть офисный телефон.
P.P.P.P.P.S. Продолжение...
На счет производительности: не самый шустрый вариант, конечно, но более хитрый вариант без подзапроса с дополнительными условиями вообще мускул ложили. В целом, джоинить такой подзапрос не особо нагруженно, так как там получается связь один-к-одному. Здесь выборка из нескольких килотоваров на холодную 2 секунды занимает. Запросы кешируются, так что в целом сайт будет работать нормально.
Пример не неудачный, он просто простой. Вот пример посложнее:
$q2 = $this->modx->newQuery($this->classKey); $offersAlias = "offer"; $q2->setClassAlias($offersAlias); $q2->select(array( "property_198", "GROUP_CONCAT({$offersAlias}.id SEPARATOR '||') as offers_id", "GROUP_CONCAT({$offersAlias}.price SEPARATOR '||') as prices", "GROUP_CONCAT({$offersAlias}.article SEPARATOR '||') as articles", "GROUP_CONCAT({$offersAlias}.packaging SEPARATOR '||') as packages", )); $q2->where(array( "{$offersAlias}.published" => 1, "{$offersAlias}.deleted" => 0, "{$offersAlias}.hidemenu" => 0, "{$offersAlias}.property_198:!=" => "", )); $q2->groupby("{$offersAlias}.property_198"); $q2->prepare(); $sql = $q2->toSQL(); $c->query['from']['joins'][] = array( "type" => "left join", "table" => "({$sql})", "alias" => "t1", "conditions" => array( new xPDOQueryCondition(array( "sql" => "{$alias}.property_198 = t1.property_198", )), ), ); $c->select(array( "if(t1.offers_id IS NOT NULL, t1.offers_id, {$alias}.id) as offers_id", "if(t1.prices IS NOT NULL, t1.prices, {$alias}.price) as prices", "if(t1.articles IS NOT NULL, t1.articles, {$alias}.article) as articles", "if(t1.packages IS NOT NULL, t1.packages, {$alias}.packaging) as packages", ));

SQL:
SELECT if(modResource.remains > 0 , 1, 0) as in_store, if(t1.offers_id IS NOT NULL, t1.offers_id, modResource.id) as offers_id, if(t1.prices IS NOT NULL, t1.prices, modResource.price) as prices, if(t1.articles IS NOT NULL, t1.articles, modResource.article) as articles, if(t1.packages IS NOT NULL, t1.packages, modResource.packaging) as packages, FROM `modx_site_content` AS `modResource` left join ( SELECT `property_198`, GROUP_CONCAT(offer.id SEPARATOR '||') as offers_id, GROUP_CONCAT(offer.price SEPARATOR '||') as prices, GROUP_CONCAT(offer.article SEPARATOR '||') as articles, GROUP_CONCAT(offer.packaging SEPARATOR '||') as packages FROM `modx_site_content` AS `offer` WHERE ( `offer`.`published` = 1 AND `offer`.`deleted` = 0 AND `offer`.`hidemenu` = 0 AND `offer`.`property_198` != '' ) GROUP BY offer.property_198 ) `t1` ON modResource.property_198 = t1.property_198 WHERE ( ( `modResource`.`deleted` = 0 AND `modResource`.`hidemenu` = 0 AND `modResource`.`published` = 1 ) AND `modResource`.`template` in (3,21) )

Здесь выборка несколько килотоваров с группировкой по полю (тут товары с вариациями товаров). И вот когда у всех товаров были заполнено это дополнительное поле, участвующее в группировке, тогда да, обычным запросом обходился. А теперь появились товары, у которых это поле не было заполнено. Пришлось переписывать запрос, так как если я сейчас сделаю группировку по этому незаполненному полю, у меня будут сотни товаров в одной карточке, а если я исключу такие товары, то они у меня просто не попадут в выборку.
А что с производительностью, ведь подзапросы нагружают базу? Может быть я чего-то не понимаю, но почему бы не сделать leftJoin modResource и modUser, или это просто пример не удачный?
Материал для экспертов.
Вообще с этой задачей бился не один год, и вот только сегодня победил… Задача: средствами xPDO в запрос добавить подзапрос, то есть еще один select. Пример такого запроса:
SELECT modResource.* FROM `modx_site_content` AS `modResource` inner join (select * from modx_users) `t1` ON modResource.createdby = t1.id
Вообще, если у кого-то есть свои варианты решения данной задачи, напишите в комментариях, было бы интересно глянуть.
Итак, простого решения я не нашел. Вариант типа $q->leftJoin("(select * from modx_users)", «t1», «modResource.creteadby = t1.id»); не канает, так как xPDOQuery::leftJoin() ожидает первым параметром имя xPDO-класса, получив который будет пытаться определить имя таблицы методом xPDO::getTableName(). В результате мы получим ошибку:
Could not load class: (select * from modx_users) from mysql.(select * from modx_users)
Вот мой вариант решения этой задачи:
$q = $modx->newQuery('modResource'); $q->select(array( "modResource.*", )); $table = $modx->getTableName('modUser'); $q->query['from']['joins'][] = array( "type" => "inner join", "table" => "(select * from {$table})", "alias" => "t1", "conditions" => array( new xPDOQueryCondition(array( "sql" => "modResource.createdby = t1.id", )), ), ); $s = $q->prepare(); print $q->toSQL();
Можно этот же запрос расширить xPDO-подзапросом:
$q = $modx->newQuery('modResource'); $q->select(array( "modResource.*", )); $q2 = $modx->newQuery('modUser', array( "username" => "Fi1osof", )); $q2->select(array( "modUser.*", )); $q2->prepare(); $sql = $q2->toSQL(); $q->query['from']['joins'][] = array( "type" => "inner join", "table" => "({$sql})", "alias" => "t1", "conditions" => array( new xPDOQueryCondition(array( "sql" => "modResource.createdby = t1.id", )), ), ); $s = $q->prepare(); print $q->toSQL();
На выходе получаем SQL-запрос:
SELECT modResource.* FROM `modx_site_content` AS `modResource` inner join ( SELECT modUser.* FROM `modx_users` AS `modUser` WHERE `modUser`.`username` = 'Fi1osof' ) `t1` ON modResource.createdby = t1.id
Такой метод формирования запроса хорош тем, что имеющийся объект xPDOQuery $q можно использовать и для подсчета количества найденных строк $modx->getCount('modResource', $q), и для установки лимитов $q->limit($limit), и для сортировки $q->sortby(«modResource.id», «ASC»); и т.д. и т.п. Так же можно и в объекты сразу набивать $modx->getCollection(«modResource», $q) или $modx->getIterator(«modResource», $q). В общем, xPDO API можно использовать в полной мере.
Так же в процессе поиска данного решения был освоен и иной промежуточный вариант:
$q = $modx->newQuery('modResource'); $q->select(array( "modResource.*", "t1.*", )); $q->query['from']['tables'][] = array( "table" => "(select * from modx_users)", "alias" => "t1", ); $q->where(array( "modResource.createdby = t1.id", )); print_r($q->query); $s = $q->prepare(); print $q->toSQL();
Получаемый запрос:
SELECT modResource.*, t1.* FROM `modx_site_content` AS `modResource`, (select * from modx_users) AS `t1` WHERE modResource.createdby = t1.id
Но, во-первых, это эквивалент inner join (то есть left join уже не получается, если нужен), а во-вторых, давно уже такой вариант запроса не считается стандартом, JOIN-ы предпочтительней.
Можно на почту писать n.lanets@modxclub.ru
Разобрался. Добавил в нужный контроллер функцию:
public function checkPermissions() { return $this->modx->hasPermission('view_my_component'); }
Хорошо. Я попробую обновиться. Если не поможет, как мне к Вам обратиться за помощью? Сюда же написать?