Нужно писать js который будет все это обрабатывать. Я для себя писал, можно было удалять, добавлять, редактировать и перемещать узлы drug'n'drop-ом. Сейчас скрипта не осталось, поделиться не смогу. Но там ничего сложного.zvnman писал(а):Как сделать управление ветками дерева CTreeView с использованием Ajax, типа:
root
-категория_1 add|edit|del|down
--категория_1.1 add|edit|del|down|up
--категория_1.2 add|edit|del|down|up
-категория_2 add|edit|del|down|up
--категория_2.1 add|edit|del|down|up
---категория_2.1.1 add|edit|del|down|up
---категория_2.1.2 add|edit|del|down|up
Nested Sets + CTreeView, CDropdownList, CListBox
- timlar
- Сообщения: 1382
- Зарегистрирован: 2009.09.19, 17:49
- Откуда: Украина, Днепропетровск
- Контактная информация:
Re: Nested Sets + CTreeView, CDropdownList, CListBox
Twitter: @timlar_ua
Re: Nested Sets + CTreeView, CDropdownList, CListBox
Спасибо за ответ!Timlar писал(а): Нужно писать js который будет все это обрабатывать. Я для себя писал, можно было удалять, добавлять, редактировать и перемещать узлы drug'n'drop-ом. Сейчас скрипта не осталось, поделиться не смогу. Но там ничего сложного.
Жаль что пока нет примера для реализации, я думаю что многим такой вариант управления деревом понравится.
Я не так давно начал юзать Yii и пока не могу освоить гибкость фреймворка с использованием JS.
Если сделаю доработку обязательно выложу код!
Re: Nested Sets + CTreeView, CDropdownList, CListBox
CTreeView
НЕ показывает активный пункт меню, ни класса ни id.
НЕ показывает активный пункт меню, ни класса ни id.
В сознании новичка много возможностей, в сознании эксперта — лишь несколько.
Re: Nested Sets + CTreeView, CDropdownList, CListBox
Код: Выделить всё
public function behaviors(){
return array(
'TreeBehavior' => array(
'class' => 'application.extensions.nestedset.TreeBehavior',
'_idCol' => 'id',
'_lftCol' => 'lft',
'_rgtCol' => 'rgt',
'_lvlCol' => 'level',
),
'TreeViewTreebehavior' => array(
'class' => 'application.extensions.nestedset.TreeViewTreebehavior',
)
);
}
- timlar
- Сообщения: 1382
- Зарегистрирован: 2009.09.19, 17:49
- Откуда: Украина, Днепропетровск
- Контактная информация:
Re: Nested Sets + CTreeView, CDropdownList, CListBox
Я бы рекомендовал использовать вот это расширение: http://code.google.com/p/yiiext/source/ ... del/trees/. Сам с ним работаю, намного удобнее чем то, о котором говорится в данной теме.
Twitter: @timlar_ua
-
- Сообщения: 350
- Зарегистрирован: 2009.09.17, 16:47
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Nested Sets + CTreeView, CDropdownList, CListBox
Не нашел по данному расширению темы, поэтому пишу сюда.
При moveAsLast и видимо других подобных действиях не вызывается afterSave(); Это сделано специально, если да, то почему?
При moveAsLast и видимо других подобных действиях не вызывается afterSave(); Это сделано специально, если да, то почему?
Предупрежден - значит вооружен.
devKP.ru
devKP.ru
Re: Nested Sets + CTreeView, CDropdownList, CListBox
Да, это сделано специально. Операция переноса не вызывает событие afterSave(). В будующем планируется, что библиотека будет расширять стандартные AR события своими. Для этого метода это будет afterMove().
Re: Nested Sets + CTreeView, CDropdownList, CListBox
Сделал все как в посте, в самом начале темы, выскакивает ошибка include(CNestedSetBehavior.php): failed to open stream: No such file or directory. В чем может быть причина?
Код: Выделить всё
/home/artem/mysite/motor.l/public/framework/YiiBase.php(396)
384 * @return boolean whether the class has been loaded successfully
385 */
386 public static function autoload($className)
387 {
388 // use include so that the error PHP file may appear
389 if(isset(self::$_coreClasses[$className]))
390 include(YII_PATH.self::$_coreClasses[$className]);
391 else if(isset(self::$classMap[$className]))
392 include(self::$classMap[$className]);
393 else
394 {
395 if(strpos($className,'\\')===false)
396 include($className.'.php');
397 else // class name with namespace in PHP 5.3
398 {
399 $namespace=str_replace('\\','.',ltrim($className,'\\'));
400 if(($path=self::getPathOfAlias($namespace))!==false)
401 include($path.'.php');
402 else
403 return false;
404 }
405 return class_exists($className,false) || interface_exists($className,false);
406 }
407 return true;
408 }
- timlar
- Сообщения: 1382
- Зарегистрирован: 2009.09.19, 17:49
- Откуда: Украина, Днепропетровск
- Контактная информация:
Re: Nested Sets + CTreeView, CDropdownList, CListBox
2 webgold: Прочитайте это сообщение
Twitter: @timlar_ua
Re: Nested Sets + CTreeView, CDropdownList, CListBox
А как используя данный класс вывести дерево в CtreeView?Timlar писал(а):Я бы рекомендовал использовать вот это расширение: http://code.google.com/p/yiiext/source/ ... del/trees/. Сам с ним работаю, намного удобнее чем то, о котором говорится в данной теме.
- Darth_Ixis
- Сообщения: 105
- Зарегистрирован: 2010.08.23, 10:03
- Откуда: KZ, Almaty
Re: Nested Sets + CTreeView, CDropdownList, CListBox
Планируется ли введение возможности отключения транзакций внутри поведения?
Из-за отсутствия данной возможности нельзя самому инициализировать транзакции, как требуется.
Например, нельзя написать так:
Из-за отсутствия данной возможности нельзя самому инициализировать транзакции, как требуется.
Например, нельзя написать так:
Код: Выделить всё
public function actionDelete($category_id)
{
if (Y::app()->request->isPostRequest) {
try {
$category = $this->loadModel($category_id);;
$transaction = $category->dbConnection->beginTransaction();
if ($category->delete())
$transaction->commit();
else
throw new Exception($category->getErrors());
}
catch (Exception $e) {
$transaction->rollBack();
throw new CHttpException(400, $e->getMessage());
}
}
else
throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
}
Re: Nested Sets + CTreeView, CDropdownList, CListBox
zvnman писал(а):А как используя данный класс вывести дерево в CtreeView?Timlar писал(а):Я бы рекомендовал использовать вот это расширение: http://code.google.com/p/yiiext/source/ ... del/trees/. Сам с ним работаю, намного удобнее чем то, о котором говорится в данной теме.
Я просто доработал, используя обсуждаемое поведение, добавив к NestedSetBehavior:
Код: Выделить всё
...
public function getTreeViewData($rootNodeId = null, $isReturnRootNode = true){
$keyField = 'id';
if ($rootNodeId == null)
$rawTree = $this->getTreeWithoutManyRoots();
else
$rawTree = $this->getTreeWithManyRoots($rootNodeId);
// Init variables needed for the array conversion
$tree = array();
$node =& $tree;
$position = array();
$lastitem = '';
$depth = 1;
foreach($rawTree as $rawItem){
// If its a deeper item, then make it subitems of the current item
if ($rawItem->getLevelValue() > $depth)
{
$position[] =& $node; //$lastitem;
$depth = $rawItem->getLevelValue();
$node =& $node[$lastitem]['children'];
}
// If its less deep item, then return to a level up
else
{
while ($rawItem->getLevelValue() < $depth)
{
end($position);
$node =& $position[key($position)];
array_pop($position);
$depth = $node[key($node)]['node']->getLevelValue();
}
}
if(!$rawItem->hasChildNodes())
$rawItem->owner->name = '<a href="/category/'.$rawItem->owner->id.'">'.$rawItem->owner->name.'</a>';
else
$rawItem->owner->name = '<span>'.$rawItem->owner->name.'</span>';
// Add the item to the final array
$node[$rawItem->$keyField]['node'] = $rawItem;
$node[$rawItem->$keyField]['id'] = (int) 'node'.$rawItem->owner->id;
$node[$rawItem->$keyField]['text'] = (string) $rawItem->owner->name;
// save the last items' name
$lastitem = $rawItem->$keyField;
}
// we don't care about the root node
if (!$isReturnRootNode){
reset($tree);
$tree = $tree[key($tree)]['children'];
//array_shift($tree);
}
return $tree;
}
protected function getTreeWithoutManyRoots(){
$owner=$this->getOwner();
return $owner->findAll(array('order'=>$this->leftAttribute));
}
protected function getTreeWithManyRoots($rootId){
$owner=$this->getOwner();
return $owner->findAll(
array(
'condition' => $this->rootAttribute.'=:rootId',
'order'=>$this->leftAttribute,
'params' => array(':rootId'=>$rootId)
));
}
protected function hasChildNodes(){
return $this->getLeftValue() != ($this->getRightValue() - 1);
}
protected function getLeftValue(){
$fieldName = $this->leftAttribute;
$owner=$this->getOwner();
return $owner->$fieldName;
}
protected function getRightValue(){
$fieldName = $this->rightAttribute;
$owner=$this->getOwner();
return $owner->$fieldName;
}
protected function getLevelValue(){
$fieldName = $this->levelAttribute;
$owner=$this->getOwner();
return $owner->$fieldName;
}
protected function getRootValue(){
$fieldName = $this->rootAttribute;
$owner=$this->getOwner();
return $owner->$fieldName;
}
Re: Nested Sets + CTreeView, CDropdownList, CListBox
Подскаите, пожалуйста, как можно построить дерево, данные для которого получены в результате выполнения хранимой процедуры? ведь в этом случае модель с ActiveRecord не создать...
Re: Nested Sets + CTreeView, CDropdownList, CListBox
почему же не создать
вот тут можно почитать об этом
http://rmcreative.ru/blog/post/yii-obek ... at-vyborki
вот тут можно почитать об этом
http://rmcreative.ru/blog/post/yii-obek ... at-vyborki
Re: Nested Sets + CTreeView, CDropdownList, CListBox
А каким образом тогда определить класс AR, ведь получается, что не прокатит, так как таблицы то нету, соответственно и метаданные для создания класса получить неоткуда
Код: Выделить всё
public function tableName()
{
return 'tbl_name';
}
Re: Nested Sets + CTreeView, CDropdownList, CListBox
что за метод запоминания открытого узла и где он прописан? а то у меня при переходе со страницы на страницу дерево снова все сворачиваетсяДалее в этой же директории создаем (если не существует) папку /views в которой создаем файл tree.php. Открываем его и пишем:
КОД: ВЫДЕЛИТЬ ВСЁ
<?php
$this->widget('CTreeView', array(
'data'=>$tree, // передаем массив
'animated'=>'medium', // скорость анимации свертывания/развертывания
'collapsed'=>true, // если тру, то при генерации дерева, все его узлы будут свернуты
'persist'=>'location', // метод запоминания открытого узла
'unique'=>true, // если тру, то при открытии одного узла, будут закрываться остальные
'cssFile'=>'/css/treeview/jquery.treeview.css', // меняем расположение css файла (он немного подправлен мной)
));
?>
Re: Nested Sets + CTreeView, CDropdownList, CListBox
Здравствуйте! Начал недавно учить yii.
И вот дошло дело до древовидных категорий, скачал отсюда http://code.google.com/p/yiiext/source/ ... del/trees/, behavior и подключил. Но при сохранении пишет ошибку:
You should not use CActiveRecord::save() method when NestedSetBehavior attached.
Подскажите пожалуйста, как решить эту проблему.
И вот дошло дело до древовидных категорий, скачал отсюда http://code.google.com/p/yiiext/source/ ... del/trees/, behavior и подключил. Но при сохранении пишет ошибку:
You should not use CActiveRecord::save() method when NestedSetBehavior attached.
Подскажите пожалуйста, как решить эту проблему.
- timlar
- Сообщения: 1382
- Зарегистрирован: 2009.09.19, 17:49
- Откуда: Украина, Днепропетровск
- Контактная информация:
Re: Nested Sets + CTreeView, CDropdownList, CListBox
Данное расширение теперь находится здесь: https://github.com/yiiext/nested-set-behaviornigredo писал(а):Здравствуйте! Начал недавно учить yii.
И вот дошло дело до древовидных категорий, скачал отсюда http://code.google.com/p/yiiext/source/ ... del/trees/, behavior и подключил. Но при сохранении пишет ошибку:
You should not use CActiveRecord::save() method when NestedSetBehavior attached.
Подскажите пожалуйста, как решить эту проблему.
Twitter: @timlar_ua
Re: Nested Sets + CTreeView, CDropdownList, CListBox
Спасибо! скачал с новой ссылки, все равно та же ошибка. Ошибка возникает в behavior-функции beforeSave($event), если посмотреть код функции, то получается, что переменная $this->_ignoreEvent = false, но по логике функции должна быть true.
- timlar
- Сообщения: 1382
- Зарегистрирован: 2009.09.19, 17:49
- Откуда: Украина, Днепропетровск
- Контактная информация:
Re: Nested Sets + CTreeView, CDropdownList, CListBox
А код сохранения можно увидеть?
Twitter: @timlar_ua