674 lines
19 KiB
PHP
674 lines
19 KiB
PHP
<?php
|
|
|
|
/**
|
|
* SOTESHOP/stCategory
|
|
*
|
|
* Ten plik należy do aplikacji stCategory opartej na licencji (Open License SOTE) Otwarta Licencja SOTE.
|
|
* Nie zmieniaj tego pliku, jeśli chcesz korzystać z automatycznych aktualizacji oprogramowania.
|
|
* Jeśli chcesz wprowadzać swoje modyfikacje do programu, zapoznaj się z dokumentacją, jak zmieniać
|
|
* oprogramowanie bez zmiany kodu bazowego http://www.sote.pl/modifications
|
|
*
|
|
* @package stCategory
|
|
* @subpackage actions
|
|
* @copyright SOTE (www.sote.pl)
|
|
* @license http://www.sote.pl/license/open (Open License SOTE) Otwarta Licencja SOTE
|
|
* @version $Id: actions.class.php 10063 2010-12-30 12:57:19Z marcin $
|
|
*/
|
|
|
|
/**
|
|
* Akcje kategorii
|
|
*
|
|
* @author Marcin Butlak <marcin.butlak@sote.pl>
|
|
*
|
|
* @package stCategory
|
|
* @subpackage actions
|
|
*/
|
|
class stCategoryActions extends autostCategoryActions
|
|
{
|
|
public function executeList()
|
|
{
|
|
return $this->redirect('@stCategory?action=manager');
|
|
}
|
|
|
|
public function executeAjaxJstreeJson()
|
|
{
|
|
$results = CategoryPeer::doSelectByParentIdAsJsTreeFormat($this->getRequestParameter('id'));
|
|
|
|
return $this->renderJSON($results);
|
|
}
|
|
public function executeAjaxCategoryFilterChildren()
|
|
{
|
|
$url = $this->getRequestParameter('url');
|
|
$id = $this->getRequestParameter('id');
|
|
$parent = CategoryPeer::retrieveByPK($id);
|
|
|
|
if (null === $parent)
|
|
{
|
|
return sfView::HEADER_ONLY;
|
|
}
|
|
|
|
$result = $this->getRenderPartial('stCategory/categories', array('parent' => $parent, 'expanded' => array(), 'selected' => null, 'url' => $url));
|
|
|
|
return $this->renderText($result);
|
|
}
|
|
|
|
public function executeAjaxCategoryTree()
|
|
{
|
|
$roots = CategoryPeer::doSelectRoots(new Criteria());
|
|
|
|
$html_data = '';
|
|
|
|
$this->default = $this->getRequestParameter('default');
|
|
$this->show_default = $this->getRequestParameter('show_default', true);
|
|
$this->allow_assign_leaf_only = $this->getRequestParameter('allow_assign_leaf_only', false);
|
|
$this->tree_id = $this->getRequestParameter('tree_id');
|
|
$this->limit = $this->getRequestParameter('limit');
|
|
|
|
$allow_assign_root = $this->getRequestParameter('allow_assign_root', false);
|
|
|
|
$path = array();
|
|
|
|
$assigned = $this->getRequestParameter('assigned');
|
|
|
|
$this->assigned = $assigned ? array_flip(explode(',', $assigned)) : array();
|
|
|
|
|
|
if ($this->assigned)
|
|
{
|
|
foreach (CategoryPeer::retrieveByPKs(array_keys($this->assigned)) as $cat)
|
|
{
|
|
foreach ($cat->getPath('doSelectIds') as $p)
|
|
{
|
|
$path[] = $p;
|
|
}
|
|
}
|
|
|
|
$path = array_flip($path);
|
|
}
|
|
|
|
|
|
if (!$path && $roots)
|
|
{
|
|
$path[$roots[0]->getId()] = $roots[0]->getId();
|
|
}
|
|
|
|
|
|
foreach ($roots as $root)
|
|
{
|
|
$id = $root->getId();
|
|
|
|
$assigned = isset($this->assigned[$id]);
|
|
|
|
if (isset($path[$root->getId()]))
|
|
{
|
|
$params = array('status' => 'open', 'children' => $this->getAjaxTreeChildren($root, $path));
|
|
}
|
|
else
|
|
{
|
|
$params = array('status' => $root->hasChildren() ? 'closed' : 'leaf');
|
|
}
|
|
|
|
if ($allow_assign_root && !$this->allow_assign_leaf_only)
|
|
{
|
|
if (1 == $this->limit)
|
|
{
|
|
$content = stJQueryToolsHelper::getJsTreeHtmlSingleAssignedControl('jstree_category', $id, $assigned, false);
|
|
}
|
|
else
|
|
{
|
|
$content = stJQueryToolsHelper::getJsTreeHtmlAssignedControl('jstree_category', $id, $assigned, false);
|
|
}
|
|
|
|
$params['content'] = $content;
|
|
}
|
|
|
|
$params['scope'] = $this->tree_id;
|
|
|
|
$html_data .= stJQueryToolsHelper::getJsTreeHtmlRow($root->getId(), htmlspecialchars(strtr($root->getOptName(), array("\n" => "", "\r" => "")), ENT_QUOTES), $params);
|
|
}
|
|
|
|
$this->html_data = $html_data;
|
|
}
|
|
|
|
public function executeAjaxCategoryChildren()
|
|
{
|
|
$id = $this->getRequestParameter('id');
|
|
|
|
$assigned = $this->getRequestParameter('assigned');
|
|
|
|
$this->default = $this->getRequestParameter('default');
|
|
$this->show_default = $this->getRequestParameter('show_default');
|
|
$this->allow_assign_leaf_only = $this->getRequestParameter('allow_assign_leaf_only', false);
|
|
$this->tree_id = $this->getRequestParameter('tree_id');
|
|
$this->limit = $this->getRequestParameter('limit');
|
|
|
|
if ($assigned)
|
|
{
|
|
$this->assigned = array_flip(explode(',', $assigned));
|
|
}
|
|
|
|
$parent = CategoryPeer::retrieveByPK($id);
|
|
|
|
if (!$parent)
|
|
{
|
|
return sfView::NONE;
|
|
}
|
|
|
|
$html_data = $this->getAjaxTreeChildren($parent);
|
|
|
|
return $this->renderText($html_data);
|
|
}
|
|
|
|
public function executeSetRootPosition()
|
|
{
|
|
$id = $this->getRequestParameter("id");
|
|
|
|
$move = $this->getRequestParameter('move');
|
|
|
|
$node = CategoryPeer::retrieveByPK($id);
|
|
|
|
if ($node->isRoot())
|
|
{
|
|
if ($move == 'up')
|
|
{
|
|
$this->treeMoveUp($node);
|
|
}
|
|
elseif ($move == 'down')
|
|
{
|
|
$this->treeMoveDown($node);
|
|
}
|
|
}
|
|
|
|
return $this->redirect('stCategory/manager');
|
|
}
|
|
|
|
public function executeIndex()
|
|
{
|
|
$this->redirect('category/manager');
|
|
}
|
|
|
|
/**
|
|
* Wyświetla zarządzanie kategoriami
|
|
*/
|
|
public function executeManager()
|
|
{
|
|
$category_id = $this->getRequestParameter('category_id');
|
|
$i18n = $this->getContext()->getI18N();
|
|
$selected = array();
|
|
|
|
if ($category_id)
|
|
{
|
|
$category = CategoryPeer::retrieveByPK($category_id);
|
|
|
|
if ($category && $category->getLevel() > 1)
|
|
{
|
|
foreach ($category->getPath() as $current)
|
|
{
|
|
$selected[] = $current->getId();
|
|
}
|
|
}
|
|
}
|
|
|
|
$this->roots = CategoryPeer::doSelectByParentIdAsJsTreeFormat(null, $selected);
|
|
$this->maxRootPosition = CategoryPeer::getMaxRootPosition();
|
|
|
|
$this->setFlash('info', $i18n->__('Aby dodać/usunąć/edytować kategorię należy kliknąć prawym przyciskiem myszy na nazwę kategorii.'), false);
|
|
}
|
|
|
|
/**
|
|
* Dodaje nowe drzewo kategorii
|
|
*/
|
|
public function executeAddTree()
|
|
{
|
|
stAuthUsersListener::checkModificationCredentials($this, $this->getRequest(), 'stCategory', false);
|
|
|
|
$name = $this->getRequestParameter("category_tree_name");
|
|
|
|
$tree = new Category();
|
|
|
|
$tree->setCulture(stLanguage::getOptLanguage());
|
|
|
|
$tree->setName($name);
|
|
|
|
$tree->makeRoot();
|
|
|
|
$tree->save();
|
|
|
|
$tree->setScope($tree->getId());
|
|
|
|
$tree->save();
|
|
|
|
$this->redirect('category/manager');
|
|
}
|
|
|
|
/**
|
|
* Dodaje nową kategorię do drzewa
|
|
*/
|
|
public function executeAjaxAdd()
|
|
{
|
|
stAuthUsersListener::checkModificationCredentials($this, $this->getRequest(), 'stCategory', false);
|
|
|
|
$name = $this->getRequestParameter("name");
|
|
|
|
$parentId = $this->getRequestParameter("parent_id");
|
|
|
|
$c = new Criteria();
|
|
|
|
$parent = CategoryPeer::retrieveByPK($parentId);
|
|
|
|
$category = new Category();
|
|
|
|
$category->setCulture(stLanguage::getHydrateCulture());
|
|
|
|
$category->setName($name);
|
|
|
|
$category->insertAsLastChildOf($parent);
|
|
|
|
$category->save();
|
|
|
|
return $this->renderJSON(array('id' => $category->getId(), 'name' => $category->getName()));
|
|
}
|
|
|
|
public function executeAjaxDelete()
|
|
{
|
|
$id = $this->getRequestParameter("id");
|
|
|
|
$category = CategoryPeer::retrieveByPK($id);
|
|
|
|
if ($category)
|
|
{
|
|
$i18n = $this->getContext()->getI18N();
|
|
if (stConfig::getInstance('stCategory')->get('check_for_product_before_delete') && $category->hasProducts())
|
|
{
|
|
return $this->renderJSON(array("error" => $i18n->__('Kategoria nie może być usunięta dopóki ma przypisane produkty', null, 'stCategory')));
|
|
}
|
|
|
|
$category->delete();
|
|
}
|
|
|
|
return sfView::HEADER_ONLY;
|
|
}
|
|
|
|
/**
|
|
* Aktualizuje nazwę kategorii i zwraca jej nazwę jako odpowiedź na wywołanie Ajax
|
|
*
|
|
* @return string
|
|
*/
|
|
public function executeAjaxRename()
|
|
{
|
|
stAuthUsersListener::checkModificationCredentials($this, $this->getRequest(), 'stCategory', false);
|
|
|
|
$name = $this->getRequestParameter("name");
|
|
$id = $this->getRequestParameter("id");
|
|
|
|
$category = CategoryPeer::retrieveByPK($id);
|
|
|
|
if ($category)
|
|
{
|
|
$category->setCulture(stLanguage::getHydrateCulture());
|
|
|
|
$category->setName($name);
|
|
|
|
$category->save();
|
|
|
|
return $this->renderJSON(array('id' => $category->getId(), 'name' => $name));
|
|
}
|
|
|
|
return sfView::HEADER_ONLY;
|
|
}
|
|
|
|
public function executeAjaxMove()
|
|
{
|
|
stAuthUsersListener::checkModificationCredentials($this, $this->getRequest(), 'stCategory', false);
|
|
|
|
$category_id = $this->getRequestParameter('id');
|
|
|
|
$sibling_id = $this->getRequestParameter('sibling_id');
|
|
|
|
$parent_id = $this->getRequestParameter('parent_id');
|
|
|
|
$category = CategoryPeer::retrieveByPK($category_id);
|
|
|
|
if ($category)
|
|
{
|
|
if ($sibling_id)
|
|
{
|
|
$category->moveToPrevSiblingOf(CategoryPeer::retrieveByPK($sibling_id));
|
|
}
|
|
else
|
|
{
|
|
$category->moveToLastChildOf(CategoryPeer::retrieveByPK($parent_id));
|
|
}
|
|
|
|
$category->save();
|
|
|
|
ProductHasCategoryPeer::cleanCache();
|
|
}
|
|
|
|
return sfView::HEADER_ONLY;
|
|
}
|
|
|
|
|
|
/**
|
|
* Usuwa całe drzewo lub gałąź kategorii
|
|
*/
|
|
public function executeDelete()
|
|
{
|
|
stAuthUsersListener::checkModificationCredentials($this, $this->getRequest(), 'stCategory', false);
|
|
|
|
$category = CategoryPeer::retrieveByPK($this->getRequestParameter("id"));
|
|
|
|
|
|
if ($category)
|
|
{
|
|
if (stConfig::getInstance('stCategory')->get('check_for_product_before_delete') && $category->hasProducts())
|
|
{
|
|
$i18n = $this->getContext()->getI18N();
|
|
$this->setFlash('warning', $i18n->__('Drzewo nie może być usuniętę dopóki ma przypisane produkty', null, 'stCategory'));
|
|
return $this->redirect($this->getRequest()->getReferer());
|
|
}
|
|
|
|
$category->delete();
|
|
}
|
|
|
|
$this->redirect('category/manager');
|
|
}
|
|
|
|
/**
|
|
* Wiąże produkt z wybranymi kategoriami
|
|
*/
|
|
public function executeAddToManager()
|
|
{
|
|
$this->product_id = $this->getRequestParameter('product_id');
|
|
|
|
if ($this->getRequest()->getMethod() == sfRequest::POST)
|
|
{
|
|
|
|
$categories = $this->getRequestParameter('category');
|
|
|
|
CategoryPeer::addProduct($this->product_id, $categories);
|
|
}
|
|
}
|
|
|
|
public function validateAddTree()
|
|
{
|
|
$ok = true;
|
|
|
|
if ($this->getRequest()->getMethod() == sfRequest::POST)
|
|
{
|
|
$name = $this->getRequestParameter('category_tree_name');
|
|
|
|
if (empty($name))
|
|
{
|
|
$this->getRequest()->setError('category_tree_name', 'Musisz podać nazwę drzewa');
|
|
|
|
$ok = false;
|
|
}
|
|
elseif (CategoryPeer::checkByName($name))
|
|
{
|
|
$this->getRequest()->setError('category_tree_name', 'Nazwa już istnieje');
|
|
|
|
$ok = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$ok = false;
|
|
}
|
|
|
|
return $ok;
|
|
}
|
|
|
|
/**
|
|
* Informuje o błędzie dodania drzewa kategorii
|
|
*/
|
|
public function handleErrorAddTree()
|
|
{
|
|
return $this->forward('stCategory', 'manager');
|
|
}
|
|
|
|
/**
|
|
* Dodaje zdjęcie do produktu
|
|
*
|
|
* @param Product $product Produkt
|
|
*/
|
|
protected function saveCategoryImage($category)
|
|
{
|
|
$category_images = $this->getRequestParameter('category_images');
|
|
$plupload = stJQueryToolsHelper::parsePluploadFromRequest($category_images);
|
|
|
|
if ($plupload['delete'])
|
|
{
|
|
$category->destroyAsset();
|
|
}
|
|
|
|
if ($plupload['modified'])
|
|
{
|
|
foreach ($plupload['modified'] as $filename)
|
|
{
|
|
$ext = sfAssetsLibraryTools::getFileExtension($filename);
|
|
$category->createAsset($category->getId() . '.' . $ext, $plupload['dir'].'/'.$filename);
|
|
$category->save();
|
|
}
|
|
}
|
|
|
|
stJQueryToolsHelper::pluploadCleanup($plupload);
|
|
}
|
|
|
|
protected function processDelete($id)
|
|
{
|
|
$category = CategoryPeer::retrieveByPK($id);
|
|
|
|
if (stConfig::getInstance('stCategory')->get('check_for_product_before_delete') && $category->hasProducts())
|
|
{
|
|
$i18n = $this->getContext()->getI18N();
|
|
$this->setFlash('warning', $i18n->__('Kategoria nie może być usunięta dopóki ma przypisane produkty', null, 'stCategory'));
|
|
return $this->redirect($this->getRequest()->getReferer());
|
|
}
|
|
|
|
return parent::processDelete($id);
|
|
}
|
|
|
|
protected function saveCategory($category)
|
|
{
|
|
$v = strip_tags($category->getName());
|
|
|
|
$category->setName($v);
|
|
|
|
parent::saveCategory($category);
|
|
|
|
$this->saveCategoryImage($category);
|
|
}
|
|
|
|
protected function saveConfig()
|
|
{
|
|
|
|
parent::saveConfig();
|
|
|
|
appCategoryHorizontalListener::clearCache();
|
|
|
|
$fc = new stFunctionCache('stCategoryTree');
|
|
|
|
$fc->removeAll();
|
|
|
|
stTheme::clearSmartyCache(true);
|
|
|
|
stFastCacheManager::clearCache();
|
|
|
|
}
|
|
|
|
protected function treeMoveUp(Category $node, $by = 1)
|
|
{
|
|
stAuthUsersListener::checkModificationCredentials($this, $this->getRequest(), 'stCategory', false);
|
|
|
|
$position = $node->getRootPosition();
|
|
|
|
$c = new Criteria();
|
|
|
|
$c->add(CategoryPeer::ROOT_POSITION, $position - $by);
|
|
|
|
$prev = CategoryPeer::doSelectOne($c);
|
|
|
|
if ($prev)
|
|
{
|
|
$node->setRootPosition($prev->getRootPosition());
|
|
|
|
$prev->setRootPosition($position);
|
|
|
|
$node->save();
|
|
|
|
$prev->save();
|
|
}
|
|
}
|
|
|
|
protected function treeMoveDown(Category $node, $by = 1)
|
|
{
|
|
stAuthUsersListener::checkModificationCredentials($this, $this->getRequest(), 'stCategory', false);
|
|
|
|
$position = $node->getRootPosition();
|
|
|
|
$c = new Criteria();
|
|
|
|
$c->add(CategoryPeer::ROOT_POSITION, $position + $by);
|
|
|
|
$next = CategoryPeer::doSelectOne($c);
|
|
|
|
if ($next)
|
|
{
|
|
$node->setRootPosition($next->getRootPosition());
|
|
|
|
$next->setRootPosition($position);
|
|
|
|
$node->save();
|
|
|
|
$next->save();
|
|
}
|
|
}
|
|
|
|
protected function getAjaxTreeChildren(Category $parent, $path = array())
|
|
{
|
|
$html_data = '';
|
|
|
|
foreach ($parent->getChildren() as $child)
|
|
{
|
|
$id = $child->getId();
|
|
|
|
$assigned = isset($this->assigned[$id]);
|
|
|
|
$content = '';
|
|
|
|
if (!$this->allow_assign_leaf_only || $child->isLeaf())
|
|
{
|
|
if (1 == $this->limit)
|
|
{
|
|
$content = stJQueryToolsHelper::getJsTreeHtmlSingleAssignedControl('jstree_category', $id, $assigned, false);
|
|
}
|
|
else
|
|
{
|
|
$content = stJQueryToolsHelper::getJsTreeHtmlAssignedControl('jstree_category', $id, $assigned, false);
|
|
}
|
|
}
|
|
|
|
if ($this->show_default)
|
|
{
|
|
$content .= stJQueryToolsHelper::getJsTreeHtmlDefaultControl('jstree_category', $id, $this->default == $id, !$assigned);
|
|
}
|
|
|
|
if (isset($path[$id]))
|
|
{
|
|
$params = array(
|
|
'status' => 'open',
|
|
'content' => $content,
|
|
'children' => $this->getAjaxTreeChildren($child, $path, $this->assigned),
|
|
);
|
|
}
|
|
else
|
|
{
|
|
$params = array(
|
|
'status' => $child->hasChildren() ? 'closed' : 'leaf',
|
|
'content' => $content,
|
|
);
|
|
}
|
|
|
|
$params['scope'] = $this->tree_id;
|
|
|
|
$html_data .= stJQueryToolsHelper::getJsTreeHtmlRow($child->getId(), htmlspecialchars(strtr($child->getOptName(), array("\n" => "", "\r" => "")), ENT_QUOTES), $params);
|
|
}
|
|
|
|
return $html_data;
|
|
}
|
|
|
|
public function executeProductAddGroup()
|
|
{
|
|
stAuthUsersListener::checkModificationCredentials($this, $this->getRequest(), $this->getModuleName());
|
|
|
|
$ids = $this->getRequestParameter('product[selected]', array($this->getRequestParameter('id')));
|
|
$related_id = $this->getRequestParameter('forward_parameters[category_id]');
|
|
$forward_parameters = $this->getUser()->getAttributeHolder()->getAll('sf_admin/autoStCategory/product_forward_parameters');
|
|
|
|
$langages = LanguagePeer::doSelectActive(new Criteria());
|
|
|
|
foreach ($ids as $id)
|
|
{
|
|
$c = new Criteria();
|
|
$c->add(ProductHasCategoryPeer::CATEGORY_ID, $related_id);
|
|
$c->add(ProductHasCategoryPeer::PRODUCT_ID, $id);
|
|
|
|
if (!ProductHasCategoryPeer::doCount($c))
|
|
{
|
|
$product_has_category = new ProductHasCategory();
|
|
$product_has_category->setCategoryId($related_id);
|
|
$product_has_category->setProductId($id);
|
|
$product_has_category->save();
|
|
$product = $product_has_category->getProduct();
|
|
foreach ($langages as $lang)
|
|
{
|
|
$product->setCulture($lang->getOriginalLanguage());
|
|
stNewSearch::buildIndex($product, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
return $this->redirect('stCategory/productList?page='.$this->getRequestParameter('page', 1).'&category_id='.$forward_parameters['category_id']);
|
|
}
|
|
|
|
|
|
public function executeProductRemoveGroup()
|
|
{
|
|
stAuthUsersListener::checkModificationCredentials($this, $this->getRequest(), $this->getModuleName());
|
|
|
|
$ids = $this->getRequestParameter('product[selected]', array($this->getRequestParameter('id')));
|
|
$related_id = $this->getRequestParameter('forward_parameters[category_id]');
|
|
$forward_parameters = $this->getUser()->getAttributeHolder()->getAll('sf_admin/autoStCategory/product_forward_parameters');
|
|
|
|
$c = new Criteria();
|
|
$c->add(ProductHasCategoryPeer::CATEGORY_ID, $related_id);
|
|
$c->add(ProductHasCategoryPeer::PRODUCT_ID, array_values($ids), Criteria::IN);
|
|
|
|
$langages = LanguagePeer::doSelectActive(new Criteria());
|
|
|
|
foreach (ProductHasCategoryPeer::doSelectJoinProduct($c) as $product_has_category)
|
|
{
|
|
$product = $product_has_category->getProduct();
|
|
$product_has_category->delete();
|
|
foreach ($langages as $lang)
|
|
{
|
|
$product->setCulture($lang->getOriginalLanguage());
|
|
stNewSearch::buildIndex($product, true);
|
|
}
|
|
}
|
|
|
|
return $this->redirect('stCategory/productList?page='.$this->getRequestParameter('page', 1).'&category_id='.$forward_parameters['category_id']);
|
|
}
|
|
|
|
public function addProductFiltersCriteria($c){
|
|
|
|
parent::addProductFiltersCriteria($c);
|
|
|
|
if (isset($this->filters['list_image']) && $this->filters['list_image'] !== ''){
|
|
$c->add(ProductPeer::OPT_IMAGE, null, $this->filters['list_image'] ? Criteria::ISNOTNULL : Criteria::ISNULL);
|
|
}
|
|
}
|
|
|
|
}
|