Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/croogo/croogo/Taxonomy/src/View/Helper/TaxonomiesHelper.php
<?php

namespace Croogo\Taxonomy\View\Helper;

use
Cake\Event\Event;
use
Cake\View\Helper;
use
Croogo\Core\Croogo;

/**
 * Taxonomies Helper
 *
 * @category Taxonomy.View/Helper
 * @package  Croogo.Taxonomy
 * @version  1.0
 * @author   Fahad Ibnay Heylaal <contact@fahad19.com>
 * @license  http://www.opensource.org/licenses/mit-license.php The MIT License
 * @link     http://www.croogo.org
 */
class TaxonomiesHelper extends Helper
{

    public
$helpers = [
       
'Html',
    ];

    public function
implementedEvents()
    {
        return
parent::implementedEvents() + [
           
'Helper.Layout.beforeFilter' => 'filter',
        ];
    }

   
/**
     * beforeRender
     */
   
public function beforeRender($viewFile)
    {
       
$request = $this->getView()->getRequest();
        if (
$request->getParam('prefix') === 'admin' && !$request->is('ajax')) {
           
$this->_adminTabs();
        }
    }

   
/**
     * Hook admin tabs when $taxonomy is set
     */
   
protected function _adminTabs()
    {
       
$request = $this->getView()->getRequest();
       
$controller = $request->getParam('controller');
        if (empty(
$this->getView()->viewVars['taxonomies']) || $controller == 'Terms') {
            return;
        }
       
$title = __d('croogo', 'Terms');
       
$element = 'Croogo/Taxonomy.terms_tab';
       
Croogo::hookAdminTab('Admin/' . $controller . '/add', $title, $element);
       
Croogo::hookAdminTab('Admin/' . $controller . '/edit', $title, $element);
    }

   
/**
     * Filter content for Vocabularies
     *
     * Replaces [vocabulary:vocabulary_alias] or [v:vocabulary_alias] with Terms list
     *
     * @param Event $event
     * @return string
     */
   
public function filter(Event $event, $options = [])
    {
       
$data = $event->getData();
       
preg_match_all('/\[(vocabulary|v):([A-Za-z0-9_\-]*)(.*?)\]/i', $data['content'], $tagMatches);
        for (
$i = 0, $ii = count($tagMatches[1]); $i < $ii; $i++) {
           
$regex = '/(\S+)=[\'"]?((?:.(?![\'"]?\s+(?:\S+)=|[>\'"]))+.)[\'"]?/i';
           
preg_match_all($regex, $tagMatches[3][$i], $attributes);
           
$vocabularyAlias = $tagMatches[2][$i];
           
$options = [];
            for (
$j = 0, $jj = count($attributes[0]); $j < $jj; $j++) {
               
$options[$attributes[1][$j]] = $attributes[2][$j];
            }
           
$data['content'] = str_replace(
               
$tagMatches[0][$i],
               
$this->vocabulary($vocabularyAlias, $options),
               
$data['content']
            );
        }

        return
$event->getData();
    }

   
/**
     * Show Vocabulary by Alias
     *
     * @param string $vocabularyAlias Vocabulary alias
     * @param array $options (optional)
     * @return string
     */
   
public function vocabulary($vocabularyAlias, $options = [])
    {
       
$_options = [
           
'tag' => 'ul',
           
'tagAttributes' => [],
           
'type' => null,
           
'link' => true,
           
'plugin' => 'Croogo/Nodes',
           
'controller' => 'Nodes',
           
'action' => 'term',
           
'element' => 'Croogo/Taxonomy.vocabulary',
        ];
       
$options = array_merge($_options, $options);

       
$output = '';
        if (isset(
$this->_View->viewVars['vocabulariesForLayout'][$vocabularyAlias]['threaded'])) {
           
$vocabulary = $this->_View->viewVars['vocabulariesForLayout'][$vocabularyAlias];
           
$output .= $this->_View->element(
               
$options['element'],
                [
                   
'vocabulary' => $vocabulary,
                   
'options' => $options,
                ]
            );
        }

        return
$output;
    }

   
/**
     * Nested Terms
     *
     * @param array $terms
     * @param array $options
     * @param int $depth
     */
   
public function nestedTerms($terms, $options, $depth = 1)
    {
       
$_options = [];
       
$options = array_merge($_options, $options);

       
$output = '';
        foreach (
$terms as $term) {
            if (
$options['link']) {
               
$termAttr = [
                   
'id' => 'term-' . $term->term->id,
                ];
               
$termOutput = $this->Html->link(
                   
$term->term->title,
                    [
                       
'plugin' => $options['plugin'],
                       
'controller' => $options['controller'],
                       
'action' => $options['action'],
                       
'type' => $options['type'],
                       
'term' => $term->term->slug,
                    ],
                   
$termAttr
               
);
            } else {
               
$termOutput = $term->term->title;
            }
            if (isset(
$term['children']) && count($term['children']) > 0) {
               
$termOutput .= $this->nestedTerms($term['children'], $options, $depth + 1);
            }
           
$termOutput = $this->Html->tag('li', $termOutput);
           
$output .= $termOutput;
        }
        if (
$output != null) {
           
$output = $this->Html->tag($options['tag'], $output, $options['tagAttributes']);
        }

        return
$output;
    }

   
/**
     * Generate string of type links
     *
     * @param array $typeData Array of Type records
     * @param array $termData Array of Term records
     * @return string
     */
   
public function generateTypeLinks($typeData, $termData)
    {
       
$typeLinks = '';
       
$typeLink = [];
       
$typeLink[] = ' (';

        foreach ((array)
$typeData as $type) {
           
$typeLink[] = $this->Html->link(
               
$type->title,
                [
                   
'prefix' => false,
                   
'plugin' => 'Croogo/Nodes',
                   
'controller' => 'Nodes',
                   
'action' => 'term',
                   
'type' => $type->alias,
                   
'term' => $termData->slug,
                ],
                [
                   
'target' => '_blank',
                ]
            );
        }

       
$typeLink[] = ')';
       
$typeLinks = implode(' ', $typeLink);

        return
$typeLinks;
    }
}