2013-08-16 8 views
1

Мы построили сайт с Concrete5, который был первоначально разработан в Joomla. Наша задача состояла в том, чтобы вывести все, и Concrete5-itize. Основная часть этого сайта - около 1200 звуковых учений, каждое из которых имеет различные атрибуты, такие как тема, автор, программа, местоположение и т. Д.Счетчик Concrete5

Некоторые учения могут иметь более одного присваиваемого атрибута, например несколько ключевых слов или тем ,

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

  • Этика (20)
  • Fear (42)
  • Благодарности (55)

Мой исходный код оказался иметь слишком много подслушал, чтобы быть практичным для многих учений и так много атрибутов. В основном, я пробежал и для каждого атрибута, я просмотрел общий счет, основанный на подсчете PageList. Мы говорим о сотнях поисков с каждой загрузкой страницы. Включение кеша, похоже, не помогло.

Существуют ли какие-либо другие стратегии, которые оказались успешными для агрегирования счетчиков атрибутов по большому числу страниц?

Вот сайт для справки: http://everydayzen.org/teachings/

ответ

1

Я обычно говорю «не имеют доступа к базе данных напрямую, используйте API», но я думаю, что вы должны использовать DB здесь.

Просмотрите таблицу [Collection|File]SearchIndexAttributes. (Я не уверен, что учения - это файлы или страницы. Если на страницах вам нужно регулярно переиндексировать их, то через задание в панели управления.) Глядя на индексную таблицу будет намного проще, чем присоединиться к самым последним версии в таблице значений атрибутов. Когда вы увидите эту таблицу, вы можете сделать некоторые простые GROUPing в SQL.

Если вы хотите использовать API, вы можете сделать это, как и сегодня, в виде пакета, выполнить соответствующие вычисления и затем кешировать его.

Нет причин, по которым кеширование не должно работать, но первый удар (когда кэш холодный), конечно, займет все время. Вы должны кэшировать мою идею IndexAttributes (полное чтение и цикл таблицы не тривиально), но, по крайней мере, с холодным кешем, который должен занимать долю секунды против 10 или более секунд, что может потребовать сотни вызовов списка страниц.

1

я сделал что-то похожее на стройплощадке для concrete5, показывая отсчеты каждого отдела, что рабочие места падения в.

т.е. HR (32), Менеджер по продажам (12) и так далее

Это код, взятый из Helper, что acheives это (это только функция, связанная с собой):

<?php 
class JobHelper { 
/** 
* GetDepartmentJobsCount 
* Returns array of Department names with job count based on input Pages 
* @param Array(Pages) - Result of a PageList->getPages 
* @return Array 
*/ 
public function getDepartmentJobsCount($pages) { 
    $depts = $this->getDepartments(); 
    $cj = $this->setCounts($depts);   
    $cj = $this->setAttributeCounts($cj, $pages,'job_department'); 
    return $cj; 
} 

/** 
* GetDepartments 
* Return all available Departments 
* @return Array(Page) 
*/ 
public function getDepartmentPages(){ 
    $pld = new PageList(); 
    $pld->filterByPath('/working-lv'); //the path that your Teachings all sit under 
    $pld->setItemsPerPage(0); 
    $res = $this->getPage(); 
    $depts = array(); 
    foreach($res as $jp){ 
     $depts[$jp->getCollectionName()] = $jp; 
    } 
    ksort($depts); 
    return $depts; 
} 

/** 
* PopulateCounts 
* Returns array of page names and counts 
* @param Array - Array to feed from 
* @return Array 
*/ 
public function setCounts($v){ 
    foreach($v as $w){ 
     $a[$w]['count'] = 0; 
    } 
    return $a; 
} 

/** 
* PopulateCounts 
* Returns array of page names, with counts added from attribute, and paths 
* @param Array - Array to add counts and paths in to 
* @param Array(Pages) - Pages to run through 
* @param String - Attribute to also add to counts 
* @param String - Optional - Job Search parameter, leave blank to get Page URL 
* @return Array 
*/ 
public function setAttributeCounts($cj, $pages, $attr){ 
    foreach($pages as $p) { 
     $pLoc = explode('|',$p->getAttribute($attr)); // Our pages could have multiple departments pipe separated 
     foreach($pLoc as $locName){ 
      $cj[$locName]['count']++; 
     }   
    } 
    return $cj; 
} 

Вы можете сделать следующее из шаблона PageList

$jh = Loader::helper('job'); 
$deptCounts = $jh->getDepartmentJobsCount($pages); 
foreach($deptCounts as $dept => $data) { 
    echo $dept . '(' . $data['count] . ')'; 
}