NeighborBehavior.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace Tools\Model\Behavior;
  3. use Cake\ORM\Behavior;
  4. use Cake\ORM\Query;
  5. use Cake\Utility\Hash;
  6. use InvalidArgumentException;
  7. /**
  8. * Neighbor Behavior
  9. */
  10. class NeighborBehavior extends Behavior {
  11. /**
  12. * Default config for a model that has this behavior attached.
  13. *
  14. * Setting force_modified to true will have the same effect as overriding the save method as
  15. * described in the code example for "Using created and modified" in the Cookbook.
  16. *
  17. * @var array
  18. * @link http://book.cakephp.org/2.0/en/models/saving-your-data.html#using-created-and-modified
  19. */
  20. protected $_defaultConfig = [
  21. ];
  22. public function neighbors($id, array $options = []) {
  23. if (empty($id)) {
  24. throw new InvalidArgumentException("The 'id' key is required for find('neighbors')");
  25. }
  26. $sortField = $this->_table->hasField('created') ? 'created' : $this->_table->primaryKey();
  27. $defaults = [
  28. 'sortField' => $this->_table->alias() . '.' . $sortField,
  29. //'displayField' => $this->_table->alias() . '.' . $this->_table->displayField()
  30. ];
  31. $options += $defaults;
  32. $normalDirection = (!empty($options['reverse']) ? false : true);
  33. $sortDirWord = $normalDirection ? ['ASC', 'DESC'] : ['DESC', 'ASC'];
  34. $sortDirSymb = $normalDirection ? ['>=', '<='] : ['<=', '>='];
  35. if (empty($options['value'])) {
  36. $data = $this->_table->find('all', ['conditions' => [$this->_table->primaryKey() => $id]])->first();
  37. list($model, $sortField) = pluginSplit($options['sortField']);
  38. $options['value'] = $data[$sortField];
  39. }
  40. $return = [];
  41. $findOptions = [];
  42. if (isset($options['contain'])) {
  43. $findOptions['contain'] = $options['contain'];
  44. }
  45. if (!empty($options['fields'])) {
  46. $findOptions['fields'] = $options['fields'];
  47. }
  48. $findOptions['conditions'][$this->_table->alias() . '.' . $this->_table->primaryKey() . ' !='] = $id;
  49. $prevOptions = $findOptions;
  50. $prevOptions['conditions'] = Hash::merge($prevOptions['conditions'], [$options['sortField'] . ' ' . $sortDirSymb[1] => $options['value']]);
  51. $prevOptions['order'] = [$options['sortField'] => $sortDirWord[1]];
  52. //debug($prevOptions);
  53. $return['prev'] = $this->_table->find('all', $prevOptions)->first();
  54. $nextOptions = $findOptions;
  55. $nextOptions['conditions'] = Hash::merge($nextOptions['conditions'], [$options['sortField'] . ' ' . $sortDirSymb[0] => $options['value']]);
  56. $nextOptions['order'] = [$options['sortField'] => $sortDirWord[0]];
  57. //debug($nextOptions);
  58. $return['next'] = $this->_table->find('all', $nextOptions)->first();
  59. return $return;
  60. }
  61. }