Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

teampage.php

Zuletzt modifiziert: 09.10.2024, 12:52 - Dateigröße: 16.36 KiB


 001  <?php
 002  /**
 003  *
 004  * This file is part of the phpBB Forum Software package.
 005  *
 006  * @copyright (c) phpBB Limited <https://www.phpbb.com>
 007  * @license GNU General Public License, version 2 (GPL-2.0)
 008  *
 009  * For full copyright and license information, please see
 010  * the docs/CREDITS.txt file.
 011  *
 012  */
 013   
 014  namespace phpbb\groupposition;
 015   
 016  /**
 017  * Teampage group position class
 018  *
 019  * Teampage position is an ascending list 1, 2, ..., n for items which are displayed. 1 is the first item, n the last.
 020  */
 021  class teampage implements \phpbb\groupposition\groupposition_interface
 022  {
 023      /**
 024      * Group is not displayed
 025      */
 026      const GROUP_DISABLED = 0;
 027   
 028      /**
 029      * No parent item
 030      */
 031      const NO_PARENT = 0;
 032   
 033      /**
 034      * Database object
 035      * @var \phpbb\db\driver\driver_interface
 036      */
 037      protected $db;
 038   
 039      /**
 040      * User object
 041      * @var \phpbb\user
 042      */
 043      protected $user;
 044   
 045      /**
 046      * Cache object
 047      * @var \phpbb\cache\driver\driver_interface
 048      */
 049      protected $cache;
 050   
 051      /**
 052      * Constructor
 053      *
 054      * @param \phpbb\db\driver\driver_interface                $db        Database object
 055      * @param \phpbb\user                        $user    User object
 056      * @param \phpbb\cache\driver\driver_interface    $cache    Cache object
 057      */
 058      public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\user $user, \phpbb\cache\driver\driver_interface $cache)
 059      {
 060          $this->db = $db;
 061          $this->user = $user;
 062          $this->cache = $cache;
 063      }
 064   
 065      /**
 066      * Returns the teampage position for a given group, if the group exists.
 067      *
 068      * @param    int        $group_id    group_id of the group to be selected
 069      * @return    int            position of the group
 070      * @throws \phpbb\groupposition\exception
 071      */
 072      public function get_group_value($group_id)
 073      {
 074          // The join is required to ensure that the group itself exists
 075          $sql = 'SELECT g.group_id, t.teampage_position
 076              FROM ' . GROUPS_TABLE . ' g
 077              LEFT JOIN ' . TEAMPAGE_TABLE . ' t
 078                  ON (t.group_id = g.group_id)
 079              WHERE g.group_id = ' . (int) $group_id;
 080          $result = $this->db->sql_query($sql);
 081          $row = $this->db->sql_fetchrow($result);
 082          $this->db->sql_freeresult($result);
 083   
 084          if ($row === false)
 085          {
 086              // Group not found.
 087              throw new \phpbb\groupposition\exception('NO_GROUP');
 088          }
 089   
 090          return (int) $row['teampage_position'];
 091      }
 092   
 093      /**
 094      * Returns the row for a given group, if the group exists.
 095      *
 096      * @param    int        $group_id    group_id of the group to be selected
 097      * @return    array            Data row of the group
 098      * @throws \phpbb\groupposition\exception
 099      */
 100      public function get_group_values($group_id)
 101      {
 102          // The join is required to ensure that the group itself exists
 103          $sql = 'SELECT *
 104              FROM ' . GROUPS_TABLE . ' g
 105              LEFT JOIN ' . TEAMPAGE_TABLE . ' t
 106                  ON (t.group_id = g.group_id)
 107              WHERE g.group_id = ' . (int) $group_id;
 108          $result = $this->db->sql_query($sql);
 109          $row = $this->db->sql_fetchrow($result);
 110          $this->db->sql_freeresult($result);
 111   
 112          if ($row === false)
 113          {
 114              // Group not found.
 115              throw new \phpbb\groupposition\exception('NO_GROUP');
 116          }
 117   
 118          return $row;
 119      }
 120   
 121      /**
 122      * Returns the teampage position for a given teampage item, if the item exists.
 123      *
 124      * @param    int        $teampage_id    Teampage_id of the selected item
 125      * @return    int            Teampage position of the item
 126      * @throws \phpbb\groupposition\exception
 127      */
 128      public function get_teampage_value($teampage_id)
 129      {
 130          $sql = 'SELECT teampage_position
 131              FROM ' . TEAMPAGE_TABLE . '
 132              WHERE teampage_id = ' . (int) $teampage_id;
 133          $result = $this->db->sql_query($sql);
 134          $current_value = $this->db->sql_fetchfield('teampage_position');
 135          $this->db->sql_freeresult($result);
 136   
 137          if ($current_value === false)
 138          {
 139              // Group not found.
 140              throw new \phpbb\groupposition\exception('NO_GROUP');
 141          }
 142   
 143          return (int) $current_value;
 144      }
 145   
 146      /**
 147      * Returns the teampage row for a given teampage item, if the item exists.
 148      *
 149      * @param    int        $teampage_id    Teampage_id of the selected item
 150      * @return    array            Teampage row of the item
 151      * @throws \phpbb\groupposition\exception
 152      */
 153      public function get_teampage_values($teampage_id)
 154      {
 155          $sql = 'SELECT teampage_position, teampage_parent
 156              FROM ' . TEAMPAGE_TABLE . '
 157              WHERE teampage_id = ' . (int) $teampage_id;
 158          $result = $this->db->sql_query($sql);
 159          $row = $this->db->sql_fetchrow($result);
 160          $this->db->sql_freeresult($result);
 161   
 162          if ($row === false)
 163          {
 164              // Group not found.
 165              throw new \phpbb\groupposition\exception('NO_GROUP');
 166          }
 167   
 168          return $row;
 169      }
 170   
 171   
 172      /**
 173      * {@inheritDoc}
 174      */
 175      public function get_group_count()
 176      {
 177          $sql = 'SELECT teampage_position
 178              FROM ' . TEAMPAGE_TABLE . '
 179              ORDER BY teampage_position DESC';
 180          $result = $this->db->sql_query_limit($sql, 1);
 181          $group_count = (int) $this->db->sql_fetchfield('teampage_position');
 182          $this->db->sql_freeresult($result);
 183   
 184          return $group_count;
 185      }
 186   
 187      /**
 188      * {@inheritDoc}
 189      */
 190      public function add_group($group_id)
 191      {
 192          return $this->add_group_teampage($group_id, self::NO_PARENT);
 193      }
 194   
 195      /**
 196      * Adds a group by group_id
 197      *
 198      * @param    int        $group_id    group_id of the group to be added
 199      * @param    int        $parent_id    Teampage ID of the parent item
 200      * @return    bool        True if the group was added successfully
 201      */
 202      public function add_group_teampage($group_id, $parent_id)
 203      {
 204          $current_value = $this->get_group_value($group_id);
 205   
 206          if ($current_value == self::GROUP_DISABLED)
 207          {
 208              if ($parent_id != self::NO_PARENT)
 209              {
 210                  // Check, whether the given parent is a category
 211                  $sql = 'SELECT teampage_id
 212                      FROM ' . TEAMPAGE_TABLE . '
 213                      WHERE group_id = 0
 214                          AND teampage_id = ' . (int) $parent_id;
 215                  $result = $this->db->sql_query_limit($sql, 1);
 216                  $parent_is_category = (bool) $this->db->sql_fetchfield('teampage_id');
 217                  $this->db->sql_freeresult($result);
 218   
 219                  if ($parent_is_category)
 220                  {
 221                      // Get value of last child from this parent and add group there
 222                      $sql = 'SELECT teampage_position
 223                          FROM ' . TEAMPAGE_TABLE . '
 224                          WHERE teampage_parent = ' . (int) $parent_id . '
 225                              OR teampage_id = ' . (int) $parent_id . '
 226                          ORDER BY teampage_position DESC';
 227                      $result = $this->db->sql_query_limit($sql, 1);
 228                      $new_position = (int) $this->db->sql_fetchfield('teampage_position');
 229                      $this->db->sql_freeresult($result);
 230   
 231                      $sql = 'UPDATE ' . TEAMPAGE_TABLE . '
 232                          SET teampage_position = teampage_position + 1
 233                          WHERE teampage_position > ' . $new_position;
 234                      $this->db->sql_query($sql);
 235                  }
 236              }
 237              else
 238              {
 239                  // Add group at the end
 240                  $new_position = $this->get_group_count();
 241              }
 242   
 243              $sql_ary = array(
 244                  'group_id'            => $group_id,
 245                  'teampage_position'    => $new_position + 1,
 246                  'teampage_parent'    => $parent_id,
 247              );
 248   
 249              $sql = 'INSERT INTO ' . TEAMPAGE_TABLE . ' ' . $this->db->sql_build_array('INSERT', $sql_ary);
 250              $this->db->sql_query($sql);
 251   
 252              $this->cache->destroy('sql', TEAMPAGE_TABLE);
 253              return true;
 254          }
 255   
 256          $this->cache->destroy('sql', TEAMPAGE_TABLE);
 257          return false;
 258      }
 259   
 260      /**
 261      * Adds a new category
 262      *
 263      * @param    string    $category_name    Name of the category to be added
 264      * @return    bool        True if the category was added successfully
 265      */
 266      public function add_category_teampage($category_name)
 267      {
 268          if ($category_name === '')
 269          {
 270              return false;
 271          }
 272   
 273          $num_entries = $this->get_group_count();
 274   
 275          $sql_ary = array(
 276              'group_id'            => 0,
 277              'teampage_position'    => $num_entries + 1,
 278              'teampage_parent'    => 0,
 279              'teampage_name'        => truncate_string($category_name, 255, 255),
 280          );
 281   
 282          $sql = 'INSERT INTO ' . TEAMPAGE_TABLE . ' ' . $this->db->sql_build_array('INSERT', $sql_ary);
 283          $this->db->sql_query($sql);
 284   
 285          $this->cache->destroy('sql', TEAMPAGE_TABLE);
 286          return true;
 287      }
 288   
 289      /**
 290      * Deletes a group from the list and closes the gap in the position list.
 291      *
 292      * @param    int        $group_id        group_id of the group to be deleted
 293      * @param    bool    $skip_group        Skip setting the value for this group, to save the query, when you need to update it anyway.
 294      * @return    bool        True if the group was deleted successfully
 295      */
 296      public function delete_group($group_id, $skip_group = false)
 297      {
 298          $current_value = $this->get_group_value($group_id);
 299   
 300          if ($current_value != self::GROUP_DISABLED)
 301          {
 302              $sql = 'UPDATE ' . TEAMPAGE_TABLE . '
 303                  SET teampage_position = teampage_position - 1
 304                  WHERE teampage_position > ' . $current_value;
 305              $this->db->sql_query($sql);
 306   
 307              $sql = 'DELETE FROM ' . TEAMPAGE_TABLE . '
 308                  WHERE group_id = ' . $group_id;
 309              $this->db->sql_query($sql);
 310   
 311              $this->cache->destroy('sql', TEAMPAGE_TABLE);
 312              return true;
 313          }
 314   
 315          $this->cache->destroy('sql', TEAMPAGE_TABLE);
 316          return false;
 317      }
 318   
 319      /**
 320      * Deletes an item from the list and closes the gap in the position list.
 321      *
 322      * @param    int        $teampage_id    teampage_id of the item to be deleted
 323      * @param    bool    $skip_group        Skip setting the group to GROUP_DISABLED, to save the query, when you need to update it anyway.
 324      * @return    bool        True if the item was deleted successfully
 325      */
 326      public function delete_teampage($teampage_id, $skip_group = false)
 327      {
 328          $current_value = $this->get_teampage_value($teampage_id);
 329   
 330          if ($current_value != self::GROUP_DISABLED)
 331          {
 332              $sql = 'DELETE FROM ' . TEAMPAGE_TABLE . '
 333                  WHERE teampage_id = ' . $teampage_id . '
 334                      OR teampage_parent = ' . $teampage_id;
 335              $this->db->sql_query($sql);
 336   
 337              $delta = (int) $this->db->sql_affectedrows();
 338   
 339              $sql = 'UPDATE ' . TEAMPAGE_TABLE . '
 340                  SET teampage_position = teampage_position - ' . $delta . '
 341                  WHERE teampage_position > ' . $current_value;
 342              $this->db->sql_query($sql);
 343   
 344              $this->cache->destroy('sql', TEAMPAGE_TABLE);
 345              return true;
 346          }
 347   
 348          $this->cache->destroy('sql', TEAMPAGE_TABLE);
 349          return false;
 350      }
 351   
 352      /**
 353      * {@inheritDoc}
 354      */
 355      public function move_up($group_id)
 356      {
 357          return $this->move($group_id, 1);
 358      }
 359   
 360      /**
 361      * Moves an item up by teampage_id
 362      *
 363      * @param    int        $teampage_id    teampage_id of the item to be move
 364      * @return    bool        True if the group was moved successfully
 365      */
 366      public function move_up_teampage($teampage_id)
 367      {
 368          return $this->move_teampage($teampage_id, 1);
 369      }
 370   
 371      /**
 372      * {@inheritDoc}
 373      */
 374      public function move_down($group_id)
 375      {
 376          return $this->move($group_id, -1);
 377      }
 378   
 379      /**
 380      * Moves an item down by teampage_id
 381      *
 382      * @param    int        $teampage_id    teampage_id of the item to be moved
 383      * @return    bool        True if the group was moved successfully
 384      */
 385      public function move_down_teampage($teampage_id)
 386      {
 387          return $this->move_teampage($teampage_id, -1);
 388      }
 389   
 390      /**
 391      * {@inheritDoc}
 392      */
 393      public function move($group_id, $delta)
 394      {
 395          $delta = (int) $delta;
 396          if (!$delta)
 397          {
 398              return false;
 399          }
 400   
 401          $move_up = ($delta > 0) ? true : false;
 402          $data = $this->get_group_values($group_id);
 403   
 404          $current_value = (int) $data['teampage_position'];
 405          if ($current_value != self::GROUP_DISABLED)
 406          {
 407              $this->db->sql_transaction('begin');
 408   
 409              if (!$move_up && $data['teampage_parent'] == self::NO_PARENT)
 410              {
 411                  // If we move items down, we need to grab the one sibling more,
 412                  // so we do not ignore the children of the previous sibling.
 413                  // We will remove the additional sibling later on.
 414                  $delta = abs($delta) + 1;
 415              }
 416   
 417              $sql = 'SELECT teampage_position
 418                  FROM ' . TEAMPAGE_TABLE . '
 419                  WHERE teampage_parent = ' . (int) $data['teampage_parent'] . '
 420                      AND teampage_position' . (($move_up) ? ' < ' : ' > ') . $current_value . '
 421                  ORDER BY teampage_position' . (($move_up) ? ' DESC' : ' ASC');
 422              $result = $this->db->sql_query_limit($sql, $delta);
 423   
 424              $sibling_count = 0;
 425              $sibling_limit = $delta;
 426   
 427              // Reset the delta, as we recalculate the new real delta
 428              $delta = 0;
 429              while ($row = $this->db->sql_fetchrow($result))
 430              {
 431                  $sibling_count++;
 432                  $delta = $current_value - $row['teampage_position'];
 433   
 434                  if (!$move_up && $data['teampage_parent'] == self::NO_PARENT && $sibling_count == $sibling_limit)
 435                  {
 436                      // Remove the additional sibling we added previously
 437                      $delta++;
 438                  }
 439              }
 440              $this->db->sql_freeresult($result);
 441   
 442              if ($delta)
 443              {
 444                  // First we move all items between our current value and the target value up/down 1,
 445                  // so we have a gap for our item to move.
 446                  $sql = 'UPDATE ' . TEAMPAGE_TABLE . '
 447                      SET teampage_position = teampage_position' . (($move_up) ? ' + 1' : ' - 1') . '
 448                      WHERE teampage_position' . (($move_up) ? ' >= ' : ' <= ') . ($current_value - $delta) . '
 449                          AND teampage_position' . (($move_up) ? ' < ' : ' > ') . $current_value;
 450                  $this->db->sql_query($sql);
 451   
 452                  // And now finally, when we moved some other items and built a gap,
 453                  // we can move the desired item to it.
 454                  $sql = 'UPDATE ' . TEAMPAGE_TABLE . '
 455                      SET teampage_position = teampage_position ' . (($move_up) ? ' - ' : ' + ') . abs($delta) . '
 456                      WHERE group_id = ' . (int) $group_id;
 457                  $this->db->sql_query($sql);
 458   
 459                  $this->db->sql_transaction('commit');
 460                  $this->cache->destroy('sql', TEAMPAGE_TABLE);
 461   
 462                  return true;
 463              }
 464   
 465              $this->db->sql_transaction('commit');
 466          }
 467   
 468          $this->cache->destroy('sql', TEAMPAGE_TABLE);
 469          return false;
 470      }
 471   
 472      /**
 473      * Moves an item up/down
 474      *
 475      * @param    int        $teampage_id    teampage_id of the item to be moved
 476      * @param    int        $delta        number of steps:
 477      *                                - positive = move up
 478      *                                - negative = move down
 479      * @return    bool        True if the group was moved successfully
 480      */
 481      public function move_teampage($teampage_id, $delta)
 482      {
 483          $delta = (int) $delta;
 484          if (!$delta)
 485          {
 486              return false;
 487          }
 488   
 489          $move_up = ($delta > 0) ? true : false;
 490          $data = $this->get_teampage_values($teampage_id);
 491   
 492          $current_value = (int) $data['teampage_position'];
 493          if ($current_value != self::GROUP_DISABLED)
 494          {
 495              $this->db->sql_transaction('begin');
 496   
 497              if (!$move_up && $data['teampage_parent'] == self::NO_PARENT)
 498              {
 499                  // If we move items down, we need to grab the one sibling more,
 500                  // so we do not ignore the children of the previous sibling.
 501                  // We will remove the additional sibling later on.
 502                  $delta = abs($delta) + 1;
 503              }
 504   
 505              $sql = 'SELECT teampage_id, teampage_position
 506                  FROM ' . TEAMPAGE_TABLE . '
 507                  WHERE teampage_parent = ' . (int) $data['teampage_parent'] . '
 508                      AND teampage_position' . (($move_up) ? ' < ' : ' > ') . $current_value . '
 509                  ORDER BY teampage_position' . (($move_up) ? ' DESC' : ' ASC');
 510              $result = $this->db->sql_query_limit($sql, $delta);
 511   
 512              $sibling_count = 0;
 513              $sibling_limit = $delta;
 514   
 515              // Reset the delta, as we recalculate the new real delta
 516              $delta = 0;
 517              while ($row = $this->db->sql_fetchrow($result))
 518              {
 519                  $sibling_count++;
 520                  $delta = $current_value - $row['teampage_position'];
 521   
 522                  // Remove the additional sibling we added previously
 523                  // But only, if we included it, this is not be the case
 524                  // when we reached the end of our list
 525                  if (!$move_up && $data['teampage_parent'] == self::NO_PARENT && $sibling_count == $sibling_limit)
 526                  {
 527                      $delta++;
 528                  }
 529              }
 530              $this->db->sql_freeresult($result);
 531   
 532              if ($delta)
 533              {
 534                  $sql = 'SELECT COUNT(teampage_id) as num_items
 535                      FROM ' . TEAMPAGE_TABLE . '
 536                      WHERE teampage_id = ' . (int) $teampage_id . '
 537                          OR teampage_parent = ' . (int) $teampage_id;
 538                  $result = $this->db->sql_query($sql);
 539                  $num_items = (int) $this->db->sql_fetchfield('num_items');
 540                  $this->db->sql_freeresult($result);
 541   
 542                  // First we move all items between our current value and the target value up/down 1,
 543                  // so we have a gap for our item to move.
 544                  $sql = 'UPDATE ' . TEAMPAGE_TABLE . '
 545                      SET teampage_position = teampage_position' . (($move_up) ? ' + ' : ' - ') . $num_items . '
 546                      WHERE teampage_position' . (($move_up) ? ' >= ' : ' <= ') . ($current_value - $delta) . '
 547                          AND teampage_position' . (($move_up) ? ' < ' : ' > ') . $current_value . '
 548                          AND NOT (teampage_id = ' . (int) $teampage_id . '
 549                              OR teampage_parent = ' . (int) $teampage_id . ')';
 550                  $this->db->sql_query($sql);
 551   
 552                  $delta = (!$move_up && $data['teampage_parent'] == self::NO_PARENT) ? (abs($delta) - ($num_items - 1)) : abs($delta);
 553   
 554                  // And now finally, when we moved some other items and built a gap,
 555                  // we can move the desired item to it.
 556                  $sql = 'UPDATE ' . TEAMPAGE_TABLE . '
 557                      SET teampage_position = teampage_position ' . (($move_up) ? ' - ' : ' + ') . $delta . '
 558                      WHERE teampage_id = ' . (int) $teampage_id . '
 559                          OR teampage_parent = ' . (int) $teampage_id;
 560                  $this->db->sql_query($sql);
 561   
 562                  $this->db->sql_transaction('commit');
 563                  $this->cache->destroy('sql', TEAMPAGE_TABLE);
 564   
 565                  return true;
 566              }
 567   
 568              $this->db->sql_transaction('commit');
 569          }
 570   
 571          $this->cache->destroy('sql', TEAMPAGE_TABLE);
 572          return false;
 573      }
 574   
 575      /**
 576      * Get group type language var
 577      *
 578      * @param    int        $group_type    group_type from the groups-table
 579      * @return    string        name of the language variable for the given group-type.
 580      */
 581      static public function group_type_language($group_type)
 582      {
 583          switch ($group_type)
 584          {
 585              case GROUP_OPEN:
 586                  return 'GROUP_REQUEST';
 587              case GROUP_CLOSED:
 588                  return 'GROUP_CLOSED';
 589              case GROUP_HIDDEN:
 590                  return 'GROUP_HIDDEN';
 591              case GROUP_SPECIAL:
 592                  return 'GROUP_SPECIAL';
 593              case GROUP_FREE:
 594                  return 'GROUP_OPEN';
 595          }
 596      }
 597  }
 598