/** * Helper for creating DOM element ids used by javascript behaviors * * If no type and package identifiers were supplied, * uses the current option $_GET variable, and changing com_foo_bar to com-foo_bar. * '-' are used as separators, and in our javascript used to parse identifier strings. * If a form got the id com-foo_bar-people, * then we can assume that the toolbar will have the id toolbar-people, * * @author Stian Didriksen <*****@*****.**> * @param array | int $parts * @return string */ public function id($parts = array()) { if (!is_array($parts) && is_int($parts)) { $parts['id'] = (int) $parts; } // If we pass a string, set $parts back as an array in order to proceed. if (!is_array($parts)) { settype($parts, 'array'); } // Set the defaults, if needed $defaults = array(); if (!isset($parts['type.package'])) { // We only want to replace the first underscore, not the rest. $defaults['type_package'] = str_replace('com_', 'com-', KRequest::get('get.option', 'cmd')); } if (!isset($parts['view'])) { $view = KRequest::get('get.view', 'cmd'); // The view part always needs to be plural to allow ajax BREAD. if (KInflector::isSingular($view)) { $view = KInflector::pluralize($view); } $defaults['view'] = $view; } if (!isset($parts['id']) && KRequest::has('get.id', 'int')) { $defaults['id'] = KRequest::get('get.id', 'int'); } // Filter away parts that are unset on purpose using a null value, or a negative boolean. return implode('-', array_filter(array_merge($defaults, $parts))); }
/** * Initializes the configuration for the object * * Called from {@link __construct()} as a first step of object instantiation. * * @param array Configuration settings */ protected function _initialize(KConfig $config) { $config->append(array( 'layout' => KInflector::isSingular($this->getName()) ? 'form' : 'default' )); parent::_initialize($config); }
/** * Add a command * * Disable the menubar only for singular views that are editable. * * @param string The command name * @param mixed Parameters to be passed to the command * @return KControllerToolbarInterface */ public function addCommand($name, $config = array()) { parent::addCommand($name, $config); $controller = $this->getController(); if ($controller->isEditable() && KInflector::isSingular($controller->getView()->getName())) { $this->_commands[$name]->disabled = true; } return $this; }
/** * _actionGet here we will check if the we access a singular or a plural, * when plural the action will return true if singular we will check if the requested tile exists. * * @param KCommandContext $context * @return bool|KDatabaseRow */ protected function _actionGet(KCommandContext $context) { if (KInflector::isSingular($this->_request->view) && !$this->_request->type) { if (!file_exists(JPATH_FILES . '/' . $this->_request->path) || is_dir(JPATH_FILES . '/' . $this->_request->path)) { return false; } } return parent::_actionGet($context); }
/** * Display the view * * @return void */ protected function _actionDisplay(KCommandContext $context) { //Check if we are reading or browsing $action = KInflector::isSingular($this->getView()->getName()) ? 'read' : 'browse'; //Execute the action $this->execute($action, $context); $view = $this->getView(); if (!$view instanceof ComNinjaViewHtml && $view instanceof KViewTemplate) { $view->getTemplate()->addFilters(array(KFactory::get('admin::com.ninja.template.filter.document'))); } $view->setLayout($this->_request->layout); return $view->display(); }
public function _createToolbar() { $identifier = $this->getToolbar(); $name = $identifier->name; $package = $identifier->package; KFactory::get('admin::com.ninja.helper.default')->css('/toolbar.css'); $img = KInflector::isPLural($name) ? KFactory::get('admin::com.ninja.helper.default')->img('/48/' . $name . '.png') : KFactory::get('admin::com.ninja.helper.default')->img('/48/' . KInflector::pluralize($name) . '.png'); if (!$img) { $img = KInflector::isSingular($name) ? KFactory::get('admin::com.ninja.helper.default')->img('/48/' . $name . '.png') : KFactory::get('admin::com.ninja.helper.default')->img('/48/' . KInflector::singularize($name) . '.png'); } if ($img) { KFactory::get('admin::com.ninja.helper.default')->css('.header.icon-48-' . $name . ' { background-image: url(' . $img . '); }'); } return KFactory::get($identifier, array('icon' => $name)); }
/** * @param $column * @return null */ private function __getRelation($type, $column) { $relations = $this->getRelations(); $taxonomies = json_decode($this->{$type}); if (KInflector::isSingular($column)) { return $this->getService($relations->{$type}->{$column}->identifier)->id($taxonomies->{$column})->getItem(); } if (KInflector::isPlural($column)) { $model = $this->getService($relations->{$type}->{$column}->identifier); $state = $model->getState(); if ($relations->{$type}->{$column}->{$column}->state) { foreach ($relations->{$type}->{$column}->state as $key => $value) { if ($filter = $state[$key]->filter) { $state->remove($key)->insert($key, $filter, $value); } } } return $model->id($taxonomies->{$column})->getList(); } }
/** * Push the controller data into the document * * This function divert the standard behavior and will push specific controller data * into the document * * @return KDispatcherDefault */ protected function _actionRender(KCommandContext $context) { $controller = KFactory::get($this->getController()); $view = $controller->getView(); $document = KFactory::get('lib.joomla.document'); $document->setMimeEncoding($view->mimetype); if ($view instanceof ComDefaultViewHtml) { $document->setBuffer($view->getToolbar()->render(), 'modules', 'toolbar'); $document->setBuffer($view->getToolbar()->renderTitle(), 'modules', 'title'); if (KInflector::isSingular($view->getName()) && !KRequest::has('get.hidemainmenu')) { KRequest::set('get.hidemainmenu', 1); } if (isset($view->views)) { foreach ($view->views as $name => $title) { $active = $name == strtolower($view->getName()); $component = $this->_identifier->package; JSubMenuHelper::addEntry(JText::_($title), 'index.php?option=com_' . $component . '&view=' . $name, $active); } } } return parent::_actionRender($context); }
/** * @param $column * @return null */ private function __getRelation($type, $column) { $relations = $this->getRelations(); $taxonomies = json_decode($this->{$type}); $identifier = new KServiceIdentifier($relations->{$type}->{$column}->identifier); if ($this->getRelations()->{$type}->{$column}->fallback == 1) { $identity_column = KInflector::singularize($this->getIdentifier()->name) . '_id'; $id = $this->id; } else { $identity_column = 'id'; $id = $taxonomies->{$column}; } if (KInflector::isSingular($column)) { $result = $this->getService($identifier)->set($identity_column, $id)->getItem(); if (!$result->id) { $result = null; } } else { $model = $this->getService($identifier); $state = $model->getState(); if (isset($relations->{$type}->{$column}->{$column}->state)) { foreach ($relations->{$type}->{$column}->state as $key => $value) { if ($filter = $state[$key]->filter) { $state->remove($key)->insert($key, $filter, $value); } } } try { $result = $model->{$identity_column}($id)->getList(); } catch (Exception $e) { return $result = null; } if ($result->count() == 0) { $result = null; } } return $result; }
/** * Add many-to-many or one-to-many or one-to-one relationship to a mapper. The cardinality * of a relationship can be an integer or the string 'many'. * * @param KConfig $config Relationship options * * @return AnDomainRelationshipManytoone */ protected static function _has(KConfig $config) { //since the mixer is a singleton use the mixer object directly $description = $config['description']; //set the default cardinality //If name singular 1 else many $config->append(array('cardinality' => KInflector::isSingular($config['name']) ? 1 : 'many')); $cardinality = (int) $config->cardinality; $config->parent = $description->getEntityIdentifier(); //a one to one relationship if (is_numeric($config->cardinality) && (int) $cardinality == 1) { $relationship = AnDomainPropertyAbstract::getInstance('relationship.onetoone', $config); //add the belnogs to relation to the child description //if it doesn't exists. Since it's a one-to-one relatonship //the parent entity uniquly identifies the child entity $child_description = $relationship->getChildRepository()->getDescription(); $property = $child_description->getProperty($relationship->getChildKey()); if (!$property) { $property = $child_description->setRelationship($relationship->getChildKey(), array('type' => 'belongs_to', 'parent' => $relationship->getParent())); } if ($relationship->isRequired()) { $child_description->addIdentifyingProperty($property); } } elseif (!$config->through) { $relationship = AnDomainPropertyAbstract::getInstance('relationship.onetomany', $config); //the child repository must have a belongs to relationship //if not then lets create one for it automatically if (!$relationship->getChildProperty()) { $child_key = $relationship->getChildKey(); $belongs_to_options = array('parent' => $description->getEntityIdentifier(), 'type' => 'belongs_to'); if ($config->child_column) { $belongs_to_options['child_column'] = $config->child_column; } if ($config->parent_key) { $belongs_to_options['parent_key'] = $config->parent_key; } $property = $relationship->getChildRepository()->getDescription()->setRelationship($child_key, $belongs_to_options); } } else { $through_one_to_many = null; //if subscription is through a one-to-many relationship if (strpos($config->through, '.') === false && ($through_one_to_many = $description->getProperty($config->through))) { unset($config->through); $config->append(array('parent_delete' => $through_one_to_many->getDeleteRule(), 'as' => $through_one_to_many->getName(), 'through' => $through_one_to_many->getChild(), 'parent' => $through_one_to_many->getParent(), 'child_key' => $through_one_to_many->getChildKey(), 'parent_key' => $through_one_to_many->getParentKey())); } $relationship = AnDomainPropertyAbstract::getInstance('relationship.manytomany', $config); //lets create a child relationship for the parent //in the link entity if it doesn't exists if (!$relationship->getChildProperty()) { $child_key = $relationship->getChildKey(); $belongs_to_options = array('parent' => $description->getEntityIdentifier(), 'type' => 'belongs_to'); if ($config->child_column) { $belongs_to_options['child_column'] = $config->child_column; } $property = $relationship->getChildRepository()->getDescription()->setRelationship($child_key, $belongs_to_options); } //lets create a child relationship for the target //in the link entity if it doesn't exists if (!$relationship->getTargetChildProperty()) { $child_key = $relationship->getTargetChildKey(); $belongs_to_options = array('type' => 'belongs_to', 'parent' => $relationship->getTargetRepository()->getDescription()->getEntityIdentifier()); if ($config->target_child_column) { $belongs_to_options['target_child_column'] = $config->child_column; } $property = $relationship->getChildRepository()->getDescription()->setRelationship($child_key, $belongs_to_options); } //create has_many relationship for both the parent and the target //if there's no relationship set before $parent = $relationship->getJunctionAlias(); $target = $parent; if (empty($through_one_to_many)) { $through_one_to_many = $description->setRelationship($target, array('type' => 'has', 'cardinality' => $config->cardinality, 'child_key' => $relationship->getChildKey(), 'parent_key' => $relationship->getParentKey(), 'child' => $relationship->getChild(), 'parent_delete' => $relationship->getDeleteRule())); } elseif ($through_one_to_many->getName() != $target) { $description->setAlias($through_one_to_many->getName(), $target); } $through_one_to_many_target = $relationship->getTargetRepository()->getDescription()->setRelationship($parent, array('cardinality' => $config->cardinality, 'type' => 'has', 'child_key' => $relationship->getTargetChildKey(), 'parent_key' => $relationship->getTargetParentKey(), 'child' => $relationship->getChild(), 'parent_delete' => $relationship->getDeleteRule())); /* * Duplicate Delete for two object that have has many to has many * relationship with each other */ // print $through_one_to_many_target->getParentRepository()->getIdentifier()->name.' has many '.$through_one_to_many_target->getName().'<br/>'. // $through_one_to_many->getParentRepository()->getIdentifier()->name.' has many '.$through_one_to_many->getName().'<br/><hr/>'; } return $relationship; }
/** * Initializes the configuration for the object * * Called from {@link __construct()} as a first step of object instantiation. * * @param array Configuration settings */ protected function _initialize(KConfig $config) { $path[] = dirname($this->getIdentifier()->filepath) . '/html'; $config->append(array('template_filters' => array('form', 'module'), 'media_url' => JURI::base() . '../media', 'layout' => KInflector::isSingular($this->getName()) ? 'form' : 'default', 'template_paths' => $path)); parent::_initialize($config); }
/** * Display action * * This function translates a GET request into a read or browse action. If the view name is * singular a read action will be executed, if plural a browse action will be executed. * * This function will not render anything if the following conditions are met : * * - The result of the read or browse action is not a row or rowset object * - The contex::status is 404 NOT FOUND and the view is not a HTML view * * @param KCommandContext A command context object * @return string|false The rendered output of the view or FALSE if something went wrong */ protected function _actionDisplay(KCommandContext $context) { //Check if we are reading or browsing $action = KInflector::isSingular($this->getView()->getName()) ? 'read' : 'browse'; //Execute the action $result = $this->execute($action, $context); //Only process the result if a valid row or rowset object has been returned if ($result instanceof KDatabaseRowInterface || $result instanceof KDatabaseRowsetInterface) { $view = $this->getView(); if ($context->status != KHttpResponse::NOT_FOUND || $view instanceof KViewHtml) { if ($view instanceof KViewTemplate && isset($this->_request->layout)) { $view->setLayout($this->_request->layout); } $result = $view->display(); } else { $result = false; } } return $result; }
/** * Set the mimetype of the document and hide the menu if required * * @return KDispatcherDefault */ protected function _actionRender(KCommandContext $context) { $view = $this->getController()->getView(); //Set the document mimetype JFactory::getDocument()->setMimeEncoding($view->mimetype); //Disabled the application menubar if ($this->getController()->isEditable() && KInflector::isSingular($view->getName())) { KRequest::set('get.hidemainmenu', 1); } return parent::_actionRender($context); }
<?php /** * @version $Id: inline.php 1042 2011-10-09 02:16:36Z johanjanssens $ * @category Nooku * @package Nooku_Modules * @subpackage Widget * @copyright Copyright (C) 2011 - 2012 Timble CVBA and Contributors. (http://www.timble.net). * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> * @link http://www.nooku.org */ defined('KOOWA') or die('Restricted access'); $parts = $url->getQuery(true); $package = substr($parts['option'], 4); $view = $parts['view']; unset($parts['option']); unset($parts['view']); $action = KInflector::isSingular($view) ? 'read' : 'browse'; echo @service('admin::com.' . $package . '.controller.' . KInflector::singularize($view))->setRequest($parts)->{$action}();
/** * Function for getting a plural and human readable version of a name * * @author Stian Didriksen <*****@*****.**> * @param bool $pluralize Wether to pluralize or not */ public function getReadableName($pluralize = true) { $name = $this->getName(); if ($pluralize && KInflector::isSingular($name)) { $name = KInflector::pluralize($name); } return KInflector::humanize($name); }
/** * @dataProvider providePlurals */ public function testIsSingular($singular, $plural) { $this->assertTrue(KInflector::isSingular($singular)); }
/** * Method to set a model object attached to the controller * * @param mixed An object that implements KObjectServiceable, KServiceIdentifier object * or valid identifier string * @throws KControllerException If the identifier is not a model identifier * @return object A KModelAbstract object or a KServiceIdentifier object */ public function setModel($model) { if (!$model instanceof KModelAbstract) { if (is_string($model) && strpos($model, '.') === false) { // Model names are always plural if (KInflector::isSingular($model)) { $model = KInflector::pluralize($model); } $identifier = clone $this->getIdentifier(); $identifier->path = array('model'); $identifier->name = $model; } else { $identifier = $this->getIdentifier($model); } if ($identifier->path[0] != 'model') { throw new KControllerException('Identifier: ' . $identifier . ' is not a model identifier'); } $model = $identifier; } $this->_model = $model; return $this->_model; }
/** * Check is the relations in the data are mentioned in the config. If not then they are not returned. * * @param $config, either ancestors or descendants from the config * @param $data, the post data * @return array, the new relations */ private function __getNewRelations($config, $data) { $new_relations = array(); foreach ($config as $name => $value) { if (isset($data[$name])) { $relation = $data[$name]; // If relation name is plural, save as array if (KInflector::isPlural($name) && !is_array($relation)) { $relation = array($relation); } else { if (KInflector::isSingular($name) && is_array($relation) && count($relation) == 1) { $relation = $relation[0]; } } $new_relations[$name] = $relation; } } return $new_relations; }
/** * Get action * * This function translates a GET request into a read or browse action. If the view name is * singular a read action will be executed, if plural a browse action will be executed. * * If the result of the read or browse action is not a row or rowset object the fucntion will * passthrough the result, request the attached view to render itself. * * @param KCommandContext A command context object * @return string|false The rendered output of the view or FALSE if something went wrong */ protected function _actionGet(KCommandContext $context) { //Check if we are reading or browsing $action = KInflector::isSingular($this->getView()->getName()) ? 'read' : 'browse'; //Execute the action $result = $this->execute($action, $context); //Only process the result if a valid row or rowset object has been returned if ($result instanceof KDatabaseRowInterface || $result instanceof KDatabaseRowsetInterface) { $result = parent::_actionGet($context); } return (string) $result; }
/** * Set the toolbar's title and icon * * @return string */ public function renderTitle() { $name = $this->getName(); $img = KInflector::isPLural($name) ? KFactory::get('admin::com.ninja.helper.default')->img('/48/' . $name . '.png') : KFactory::get('admin::com.ninja.helper.default')->img('/48/' . KInflector::pluralize($name) . '.png'); if (!$img) { $img = KInflector::isSingular($name) ? KFactory::get('admin::com.ninja.helper.default')->img('/48/' . $name . '.png') : KFactory::get('admin::com.ninja.helper.default')->img('/48/' . KInflector::singularize($name) . '.png'); } if ($img) { KFactory::get('admin::com.ninja.helper.default')->css('.header.icon-48-' . $name . ' { background-image: url(' . $img . '); }'); } $this->name = $this->getName(); $this->title = $this->_title; return $this->getTemplate()->loadIdentifier('admin::com.ninja.view.toolbar.toolbar_title', array('name' => $this->getName(), 'title' => $this->_title))->render(true); }