Деревья в admin generator. Переделываем под Propel 1.2

Приветствуем!

Хотите что-то написать?

Нужно назвать себя.

Если вы пришли в первый раз,
то нужно зарегистрироваться.

Читайте нас в:

Блог на ya.ru
Блог на Деловом квартале
Блог на Twitter.om
Блог на Livejournal.com
05 февраля

Деревья в admin generator. Переделываем под Propel 1.2

Наконец-то выкладываю нужные куски кода для заточки деревьем под Propel 1.2. Тестировалось на Symfony 1.1.6.

Для того чтобы заработали деревья необходимо воспользоваться плагином sfPropelActAsNestedSetBehaviorPlugin.

Ваш _list.php будет выглядеть примерно так:

      <tbody>
<?php foreach ($pager->getResults() as $i => $tree): $odd = fmod(++$i, 2) ? 'odd' : 'even' ?>
<tr id="node-<?php echo $tree->getId(); ?>" class="sf_admin_row <?php echo $odd ?><?php
// insert hierarchical info
if ($tree->getTreeParent())
{
echo " child-of-node-".$tree->getTreeParent();
}
?>">
<?php include_partial('list_td_batch_actions', array('tree' => $tree)) ?>
<?php include_partial('list_td_tabular', array('tree' => $tree)) ?>
<?php include_partial('list_td_actions', array('tree' => $tree)) ?>
</tr>
<?php endforeach; ?>
</tbody>

Так же изменится executeBatchOrder в модуле. Выглядеть он будет так:

  public function executeBatchOrder(sfWebRequest $request)
  {
    $newparent = $request->getParameter('newparent');
    $ids = array();
    foreach ($newparent as $key => $val) {
      $ids[$key] = true;
      if (!empty($val))
        $ids[$val] = true;
    }
    $ids = array_keys($ids);

    //validate if all id's exist
    $validator = new sfValidatorPropelChoiceMany(array('model' => 'Tree'));
    try {
      // validate ids
      $ids = $validator->clean($ids);

      // the id's validate, now update the tree
      $count = 0;
      $flash = "";

      foreach ($newparent as $id => $parentId) {
        if (!empty($parentId)) {
          $node = TreePeer::retrieveByPK($id);
          $parent = TreePeer::retrieveByPK($parentId);

          /**
           * Данное условие задаёт различное поведение.
           * Если элементы одного и того же уровня - тот они
           * рассматриваются как соседи.
           * Если же уровни разные и один не является родителем другого - то
           * как parent->child
           * 
           */
          if (!$parent->isDescendantOf($node) && $parent->getLevel() != $node->getLevel()) {
            $node->moveToFirstChildOf($parent);
            $node->save();
            $count++;
            $flash .= "<br/>Moved '".$node->getTitle()."' under '".$parent->getTitle()."'.";
          } else {
            $node->moveToNextSiblingOf($parent);
            $node->save();
            $count++;
            $flash .= "<br/>Moved '".$node->getTitle()."' after '".$parent->getTitle()."'.";
          }
        }
      }

      if ($count > 0) {
        $this->getUser()->setFlash('notice', sprintf("Tree order updated, moved %s item%s:".$flash, $count, ($count > 1 ? 's' : '')));
      } else {
        $this->getUser()->setFlash('error', "You must at least move one item to update the tree order");
      }
    }
    catch (sfValidatorError $e) {
      $this->getUser()->setFlash('error', 'Cannot update the tree order, maybe some item are deleted, try again');
    }

    $this->redirect('tree/list');
  }

Вобщем-то это все отличия. Всё остальное ничем не отличается.

Тэги: nested set, propel

Коментарии:

Роман 2009-02-05 14:44:46

Спасибо огромное

ответить
maddogg 2009-02-05 15:18:32

айм рилли сорри за задержку :)

ответить
tyaga 2009-03-24 04:10:02

maddog, спасибо огромаднейшее за работу, есть вопрос

То, что выложили вы, основано на http://redotheoffice.com/?p=74, но я так понимаю, что вы сделали и сортировку соседей? Вот как вы изменили js, который в этом коде?

ответить
maddogg 2009-03-24 09:40:12

абсолютно никак. Все условия — в самой сортировке

ответить
tauruz 2009-11-02 16:05:29

А как бы модель БД создать под propel???

ответить
tauruz 2009-11-04 02:18:41

А на TreeForm.class.php ваш можно посмотреть?

ответить
maddogg 2009-11-04 14:04:02

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

ответить
tauruz 2009-11-04 14:54:32

Больше всего интересует там методы configure(), doSave() и пример скинте плиз. Заранее благодарен!

ответить

Свой комментарий: