[Isocial-svn] SF.net SVN: isocial: [84]
Status: Pre-Alpha
Brought to you by:
aguidrevitch
From: <agu...@us...> - 2008-03-16 17:42:57
|
Revision: 84 http://isocial.svn.sourceforge.net/isocial/?rev=84&view=rev Author: aguidrevitch Date: 2008-03-16 10:43:01 -0700 (Sun, 16 Mar 2008) Log Message: ----------- generic autocomplete fields implemented, currently used for religious views field in basic user profile Modified Paths: -------------- app/application_controller.php app/controllers/profile_controller.php app/helpers/auto_complete_helper.php app/helpers/city_helper.php app/installers/basic_profile_installer.php app/installers/religious_view_installer.php app/models/basic_profile.php app/models/religious_view.php app/shared_model.php app/views/profile/basic.tpl public/stylesheets/Application.css Modified: app/application_controller.php =================================================================== --- app/application_controller.php 2008-03-16 13:46:01 UTC (rev 83) +++ app/application_controller.php 2008-03-16 17:43:01 UTC (rev 84) @@ -197,7 +197,11 @@ 'order' => 'is_native DESC, name' ) ); - $this->renderText( $this->city_helper->auto_complete_result($entries, $query, $this->params['city']) ); + if (!empty($entries)) { + $this->renderText( $this->city_helper->auto_complete_result($entries, $query, $this->params['city']) ); + } else { + $this->renderNothing(); + } } } Modified: app/controllers/profile_controller.php =================================================================== --- app/controllers/profile_controller.php 2008-03-16 13:46:01 UTC (rev 83) +++ app/controllers/profile_controller.php 2008-03-16 17:43:01 UTC (rev 84) @@ -15,28 +15,31 @@ function basic () { $this->basic_profile = $this->current_user->basic_profile->load(); - if (!empty($this->params['basic_profile'])) { - $this->BasicProfile->setAttributes($this->params['basic_profile']); - $this->BasicProfile->user->assign($this->current_user); - if ($this->Request->isPost() && $this->BasicProfile->save()) { + if ($this->Request->isPost() && !empty($this->params['basic_profile'])) { + + $this->basic_profile->setAttributes($this->params['basic_profile']); + if (!empty($this->params['basic_profile']['religious_view_id'])) { + $religious_view = $this->ReligiousView->voteOrCreate($this->params['basic_profile']['religious_view_id'], + $this->current_user); + $this->basic_profile->religious_view->assign($religious_view); + } + + if ($this->basic_profile->save()) { $this->redirectTo(array('action' => 'basic')); } } } - function auto_complete_for_basic_religious_view () { - if (empty($this->params['basic_profile']['religious_view'])) { - echo 1; + function auto_complete_for_basic_profile_religious_view_id () { + if (empty($this->params['basic_profile'])) { $this->renderNothing(); } else { - $entries = $this->ReligiousView->find('all', - array('conditions' => - array( - 'name LIKE ?', '%' . $this->params['basic_profile']['religious_view'] . '%' - ), - ) - ); - $this->renderText( $this->auto_complete_helper->auto_complete_result($entries, 'name', $this->params['basic_profile']['religious_view']) ); + $entries = $this->ReligiousView->findVoted($this->params['basic_profile']['religious_view_id']); + if (!empty($entries)) { + $this->renderText( $this->auto_complete_helper->auto_complete_result($entries, 'name', $this->params['basic_profile']['religious_view_id']) ); + } else { + $this->renderNothing(); + } } } Modified: app/helpers/auto_complete_helper.php =================================================================== --- app/helpers/auto_complete_helper.php 2008-03-16 13:46:01 UTC (rev 83) +++ app/helpers/auto_complete_helper.php 2008-03-16 17:43:01 UTC (rev 84) @@ -38,15 +38,56 @@ return ''; } foreach ($entries as $entry) { - $items[] = TagHelper::content_tag('li',!empty($phrase) ? TextHelper::highlight(TextHelper::h($entry->get($field)), $phrase) : TextHelper::h(@$entry->get($field))); + $items[] = TagHelper::content_tag('li', + !empty($phrase) + ? TextHelper::highlight(TextHelper::h($entry->get($field)), $phrase) + : TextHelper::h(@$entry->get($field)), array('id' => $entry->getId())); } return TagHelper::content_tag('ul', join('', array_unique($items))); } function text_field_with_auto_complete($object, $method, $tag_options = array(), $completion_options = array()) { - $completion_options['indicator'] = "'{$object}_{$method}'"; - return parent::text_field_with_auto_complete($object, $method, $tag_options, $completion_options); + + $this->object =& $this->_controller->{$object}; + $this->value = ''; + + if ($this->object) { + $id = $this->object->get($method); + if ($id) { + $model = @$completion_options['model']; + if (!$model) { + foreach ($this->object->getAssociated('belongsTo') as $name => $association) { + if ($association->getAssociationOption('primary_key_name') == $method) { + $model = $association; + break; + } + } + } + $dep = $model->find($id); + if (!empty($dep)) { + $this->value = $dep->name; + } + } + } + + $tag_options = array_merge(array( + 'value' => $this->value, + 'autocomplete' => 'on', + ), $tag_options); + + $completion_options = array_merge(array( + 'skip_style' => true, + 'url' => array('action' => "auto_complete_for_{$object}_{$method}"), + 'frequency' => 0.4, + 'indicator' => "'{$object}_{$method}'", + ), $completion_options); + + $text_field = $this->_controller->form_helper->text_field($object, $method, $tag_options); + $div = TagHelper::content_tag('div', '', array('id' => "{$object}_{$method}_auto_complete", 'class' => 'auto_complete')); + $javascript = $this->auto_complete_field("{$object}_{$method}", $completion_options); + + return $text_field . $div . $javascript; } } Modified: app/helpers/city_helper.php =================================================================== --- app/helpers/city_helper.php 2008-03-16 13:46:01 UTC (rev 83) +++ app/helpers/city_helper.php 2008-03-16 17:43:01 UTC (rev 84) @@ -28,7 +28,9 @@ $this->value = ''; if ($this->object && $city_id = $this->object->get($method)) { $city = $this->_controller->City->find($city_id); - $this->value = $city->name; + if (!empty($city)) { + $this->value = $city->name; + } } $tag_options = array_merge(array( Modified: app/installers/basic_profile_installer.php =================================================================== --- app/installers/basic_profile_installer.php 2008-03-16 13:46:01 UTC (rev 83) +++ app/installers/basic_profile_installer.php 2008-03-16 17:43:01 UTC (rev 84) @@ -9,14 +9,19 @@ `user_id` int(11) NOT NULL, `sex_id` int(11), `city_id` int(11), + `city_other` char(100), + `country_id` int(11), `birthdate` date DEFAULT NULL, `political_view_id` int(11), + `religious_view_id` int(11), `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (sex_id) REFERENCES sexes(id), FOREIGN KEY (city_id) REFERENCES cities(id), - FOREIGN KEY (political_view_id) REFERENCES political_views(id) + FOREIGN KEY (country_id) REFERENCES countries(id), + FOREIGN KEY (political_view_id) REFERENCES political_views(id), + FOREIGN KEY (religious_view_id) REFERENCES religious_views(id) ) ENGINE=InnoDB"); } Modified: app/installers/religious_view_installer.php =================================================================== --- app/installers/religious_view_installer.php 2008-03-16 13:46:01 UTC (rev 83) +++ app/installers/religious_view_installer.php 2008-03-16 17:43:01 UTC (rev 84) @@ -6,15 +6,42 @@ $this->execute( "CREATE TABLE `religious_views` ( `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - `name` char(100) NOT NULL DEFAULT '' + `name` char(100) NOT NULL DEFAULT '', + `votes` int(11) NOT NULL DEFAULT 0, + INDEX name_idx (name, votes) ) ENGINE=InnoDB"); + $this->execute( + "CREATE TABLE `religious_view_votes` ( + `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + `user_id` int(11), + `religious_view_id` int(11), + FOREIGN KEY (user_id) REFERENCES users(id), + FOREIGN KEY (religious_view_id) REFERENCES religious_views(id) + ) ENGINE=InnoDB"); + + $this->execute( + "CREATE TRIGGER rvv_insert AFTER INSERT ON religious_view_votes + FOR EACH ROW BEGIN + UPDATE `religious_views` SET votes = votes + 1 WHERE id = NEW.religious_view_id; + END; + "); + + $this->execute( + "CREATE TRIGGER rvv_delete AFTER DELETE ON religious_view_votes + FOR EACH ROW BEGIN + UPDATE `religious_views` SET votes = votes - 1 WHERE id = OLD.religious_view_id; + END; + "); } function down_1() { /**/ - $this->dropTable('religious_view'); + // triggers should be dropped automatically + // http://dev.mysql.com/doc/refman/5.1/en/drop-trigger.html + $this->dropTable('religious_view_votes'); + $this->dropTable('religious_views'); /**/ } } Modified: app/models/basic_profile.php =================================================================== --- app/models/basic_profile.php 2008-03-16 13:46:01 UTC (rev 83) +++ app/models/basic_profile.php 2008-03-16 17:43:01 UTC (rev 84) @@ -2,7 +2,7 @@ class BasicProfile extends ActiveRecord { - var $belongs_to = array('User', 'City'); + var $belongs_to = array('User', 'City', 'PoliticalView', 'ReligiousView'); } ?> Modified: app/models/religious_view.php =================================================================== --- app/models/religious_view.php 2008-03-16 13:46:01 UTC (rev 83) +++ app/models/religious_view.php 2008-03-16 17:43:01 UTC (rev 84) @@ -1,7 +1,15 @@ <?php -class ReligiousView extends ActiveRecord +class ReligiousView extends VotableActiveRecord { + var $votes_model = 'ReligiousViewVote'; + } +class ReligiousViewVote extends ActiveRecord { + + var $primary_key_name = 'religious_view_id'; + +} + ?> Modified: app/shared_model.php =================================================================== --- app/shared_model.php 2008-03-16 13:46:01 UTC (rev 83) +++ app/shared_model.php 2008-03-16 17:43:01 UTC (rev 84) @@ -25,4 +25,57 @@ } +class VotableActiveRecord extends ActiveRecord { + + var $votes_model; + var $min_votes_to_appear = 2; + + function &voteOrCreate ($value, $user) { + + if ($this->votes_model) { + @include_once(AkInflector::toModelFilename($this->votes_model)); + } + + $this->votes_object = new $this->votes_model(); + + $record = $this->findFirst(array('conditions' => array("name LIKE ?", $value))); + if (empty($record)) { + $this->name = $value; + $this->save(); + $record =& $this; + } + + if ($record->votes < $this->min_votes_to_appear) { + + $vote = $this->votes_object->findFirst( + array('conditions' => + array('user_id = ? and ' . $this->votes_object->primary_key_name . ' = ?', $user->getId(), $record->getId()) + ) + ); + + if (empty($vote)) { + $this->votes_object->setAttributes(array( + 'user_id' => $user->getId(), + $this->votes_object->primary_key_name => $record->getId() + )); + + if ($this->votes_object->save()) { + $record->reload(); + } + } + } + return $record; + } + + function &findVoted ($value) { + $records = $this->find('all', + array('conditions' => + array('name LIKE ? AND votes >= ' . $this->min_votes_to_appear, '%'. $value . '%') + ) + ); + return $records; + } + +} + ?> Modified: app/views/profile/basic.tpl =================================================================== --- app/views/profile/basic.tpl 2008-03-16 13:46:01 UTC (rev 83) +++ app/views/profile/basic.tpl 2008-03-16 17:43:01 UTC (rev 84) @@ -23,7 +23,7 @@ </div> <div class="formrow"> <label>_{Religious views}:</label> - <?= $auto_complete_helper->text_field_with_auto_complete('basic_profile', 'religious_view', array('autocomplete' => 'on', 'class' => 'textinput autocomplete'), array('skip_style' => true) )?> + <?= $auto_complete_helper->text_field_with_auto_complete('basic_profile', 'religious_view_id', array('autocomplete' => 'on', 'class' => 'textinput autocomplete'), array('skip_style' => true))?> </div> <div class="formrow"> <label></label> Modified: public/stylesheets/Application.css =================================================================== --- public/stylesheets/Application.css 2008-03-16 13:46:01 UTC (rev 83) +++ public/stylesheets/Application.css 2008-03-16 17:43:01 UTC (rev 84) @@ -375,7 +375,6 @@ width: 645px; } - .tabs .left { float: left; padding-left: 10px; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |