MODX-Клуб превращается в фриланс-биржу

Всем привет!

Сегодня выкатил очень объемные и важные обновления на сайт. Для этого за последние три дня проработал порядка 50 часов (да-да, позавчера 32 часа к ряду проработал с мелкими паузами на естественные потребности). К сожалению, не все еще успел сделать (хотя все, что планировал в этот раз сделать, до конца недели выкачу точно), но тем не менее сделано уже очень многое и те, кто следил за последними обновлениями, оценит на сколько вырос функционал.

Самое главное: теперь у каждого появилась возможность создавать свои команды. Эти команды выводятся в разделе "Каталог веб-студий". Хотя для сеошности я назвал этот раздел так, на самом деле это могут быть не только веб-студии, но и просто коллеги, даже удаленные. Сейчас я пока запретил создавать более одной команды, но на днях я эту функцию разлочу.

Для чего создавать команды? Как минимум для того, чтобы продвигать себя. Этот функционал развивается с весьма прокаченной перелинковкой. К примеру, если три пользователя добавят по три работы в портфолио каждый и создадут каждый по одной команде и добавятся каждый друг к другу в команду, то у каждого будет числиться по три команды и по 9 работ в портфолио. Так же в портфолио можно указывать по какому профилю участвовал (Дизайн, программирование, управление и т.п.), можно по несколько направлений на одну работу. И потом в профиле пользователя эта информация учитывается, в скольких работах по какому направлению он участвовал.

И по портфолио важный момент: кто в работе участвовал, тому работа навсегда, куда бы он не переходил, или остается один сам по себе. А вот с компаниями два момента: если работа указана, что она выполнялась для этой студии, то она за ней так же закрепляется. Если нет, то нет. Таким образом у компании портфолио суммируется из своих постоянных работ и работ ее участников. Взял себе пару человек с работами - портфолио добавилось. Ушли - уменьшилось.

Функционал добавления работ в портфолио так же появится в самые ближайшие дни.

Уже сейчас перелинковка довольно объемная. В списке пользователей можно увидеть в каких командах они состоят, сколько у них работ в портфолио (включая даже те, в которых они просто отмечены как участники, а не так, что создал сайт полностью с нуля), а так же специализацию (специализация берется из портфолио).

В веб-студиях есть ссылки на владельца, сотрудников и портфолио. Можно, соответственно, посмотреть все работы студии и всех ее участников.

В самой карточке компании есть две ссылки на портфолио:

  1. Все работы команды.
  2. Только собственные проекты.

Объясню подробней: как я и говорил выше, у компании есть собственное портфолио, то есть какие сайты были созданы непосредственно ей (не важно, заказали на стороне услуги фрилансера, или собственная команда трудилась, главное - авторство заявлено студией). А есть портфолио сотрудников студии. Вот все работы - это в том числе и сотрудников, а свои - это свои.

Ну и напоследок продемонстрирую один из запросов, который получает информацию о компаниях, ее работах, команде и т.п., просто для примера (чтобы ощутить размах).

SELECT 
  modResource.*, 
  modResource.id as `object_id`, 
  tv_3_image.value as `tv_3_image`, 
  tv_10_extras.value as `tv_10_extras`, 
  concat('http://', modResource.pagetitle) as url, 
  Company.id as developer_id, 
  if(Company.website != '', concat('http://', Company.website), '') as developer_site, 
  Company.name as developer_title, 
  DeveloperResource.id as developer_resource_id, 
  DeveloperResource.uri as developer_uri, 
  ProjectMembers.*, 
  AuthorCompanies.*,
  Author.id as author_id, 
  Author.username as author_username, 
  AuthorProfile.fullname as author_fullname, 
  AuthorProfile.photo as author_photo 
  FROM 
    `tbl_site_content` AS `modResource` 
    JOIN `tbl_users` `Author` ON modResource.createdby = Author.id 
    JOIN `tbl_user_attributes` `AuthorProfile` ON Author.id = AuthorProfile.internalKey 
    left join (
      SELECT 
        ProjectMembersProjects.project_id, 
        group_concat(modUser.id SEPARATOR ',') as project_members, 
        group_concat(modUser.username SEPARATOR ';') as project_members_username, 
        group_concat(Profile.fullname SEPARATOR ';') as project_members_fullname, 
        group_concat(Profile.photo SEPARATOR ';') as project_members_photo 
          FROM `tbl_users` AS `modUser` 
            JOIN `tbl_user_attributes` `Profile` ON `modUser`.`id` =  `Profile`.`internalKey` 
            inner join (
              SELECT DISTINCT `user_id`, `project_id` 
              FROM `tbl_modxsite_projects_members` AS `modProjectMember` 
                WHERE `modProjectMember`.`status` = 1 
              ) `ProjectMembersProjects` 
            ON modUser.id = ProjectMembersProjects.user_id 
            WHERE  ( 
              `modUser`.`active` = 1 AND `Profile`.`blocked` = '0' 
            )  
            GROUP BY ProjectMembersProjects.project_id ) `ProjectMembers` 
    ON modResource.id = ProjectMembers.project_id 
    LEFT JOIN `tbl_site_tmplvar_contentvalues` `tv_developer` 
      ON tv_developer.tmplvarid = 11 
      AND tv_developer.contentid = modResource.id 
    LEFT JOIN `tbl_site_content` `DeveloperResource` ON DeveloperResource.id = tv_developer.value 
    LEFT JOIN `tbl_modxsite_companies` `Company` ON tv_developer.value = Company.resource_id 
    LEFT JOIN `tbl_site_tmplvar_contentvalues` `tv_3_image` ON tv_3_image.tmplvarid = 3 AND tv_3_image.contentid = modResource.id 
    LEFT JOIN `tbl_site_tmplvar_contentvalues` `tv_10_extras` ON tv_10_extras.tmplvarid = 10 AND tv_10_extras.contentid = modResource.id
    left join (
      SELECT 
        Experiences.user_id, 
        GROUP_CONCAT(modCompany.id SEPARATOR '||') as companies_id, 
        GROUP_CONCAT(modCompany.name SEPARATOR '||') as companies_name, 
        GROUP_CONCAT(CompaniesResources.uri SEPARATOR '||') as companies_uri 
      FROM 
        `tbl_modxsite_companies` AS `modCompany` 
        JOIN `tbl_site_content` `CompaniesResources` 
          ON CompaniesResources.id = modCompany.resource_id 
          AND CompaniesResources.deleted = 0 
          AND CompaniesResources.published = 1 
         JOIN `tbl_modxsite_experiences` `Experiences` 
          ON modCompany.id = Experiences.company_id 
            AND Experiences.status = 1 
        WHERE `modCompany`.`status` = 1 
      GROUP BY user_id 
    ) `AuthorCompanies` ON modResource.createdby = AuthorCompanies.user_id 
    WHERE  (  
      ( `modResource`.`deleted` = 0 AND `modResource`.`hidemenu` = 0 AND `modResource`.`published` = 1 )  
      AND (Company.id = 6 
        OR 
          EXISTS(
            SELECT `id` 
              FROM `tbl_modxsite_experiences` AS `modExperience` 
                WHERE company_id = 6
                  AND status = 1 
                  AND (start_date < now() 
                    AND (
                      end_date > now() OR end_date IS NULL
                    )
                  )
                AND FIND_IN_SET(user_id, ProjectMembers.project_members)
          )
        ) 
      AND `modResource`.`parent` = 1443 
      AND `modResource`.`id` IN (2090,2077,1910,1669,1551,1546,1540,1521) )  
    ORDER BY modResource.publishedon DESC

Да-да, это один запрос. Получает он много информации. При этом выполняется 5 тысячных секунды...

При этом база-то не маленькая. Документов 2000+, пользователей 3000, и куча прочей связанной инфы.

UPD: Проглазел, бага была, из-за чего не получалось комментарии добавлять. Поправил.