Page 1 of 1

Best Way to Limit record in table to only 1

Posted: 2016-01-13 14:39
by bambinou
Hello,

I am trying to hook up the back end with a front end template, my problem is that I need to be able to only let the customer upload 1 record in the table whih consist of (1 id, 1 picture, 1 page title, 1 page description). The user should be able to edit or delete this record but not add another one.

What is the best way to do this please?

Thanks,

Re: Best Way to Limit record in table to only 1

Posted: 2016-01-13 14:59
by Bertv
Hi,
I have the same situation and solved it as followed:
- create the table in AppGini; checked the 'hide in homepage and 'hide in navigation menu'.
- in phpMyAdmin I create the record with id 1
- in the links-home.php and links-navmenu.php in the hooks folder I create an entry with the url: 'url' => 'tablename_view.php?SelectedID=1'

Regards,

Re: Best Way to Limit record in table to only 1

Posted: 2016-01-13 15:09
by bambinou
Thanks, I will give it a shot tonight! Great way of doing it:-)
I did not think about hard coding the parameters......

Re: Best Way to Limit record in table to only 1

Posted: 2016-01-13 18:41
by bambinou
I tried your solution, unfortunately there is a problem with that.

Imagine that I do not want to have any data in that table before giving my script to someone, the person will have to click on "add", it is fine because the first id will be 1 if the table has been reset. The problem arise after that, after inserting that value, a "add new" button shows up, now I could edit this in PHP but will need to go into the fields themselves with a condition like echo button if id is not equal to 1 but if I do this, I am going to mix myself up between the script auto generation from appgini and my own code....I wonder if there is a way to change that....

Thanks,

Re: Best Way to Limit record in table to only 1

Posted: 2016-02-07 23:38
by shasta59
Using Appgini 5.50

Try placing this script in your hooks file for the table you wish to limit to one record per user. It goes under the before insert function. You will get a message displaying which states it could not save the new record. User can modify their one record all they want but cannot save a new copy or a new record.

It will make the program not allow the save. It is very basic but works. You also may wish to add in a note about limiting to one record in the template file etc.

Code: Select all

function yourtablename_before_insert(&$data, $memberInfo, &$args){
	$memberid1 = ($memberInfo['username']);
	$getrecordcount = sqlValue("select COUNT(tableName) FROM membership_userrecords WHERE tableName = 'yourtablename' AND memberID = '$memberid1' ");
if ($getrecordcount > 0) return FALSE;

		return TRUE;
	}
$memberid1 - this holds the value for the member username
$getrecordcount - this is the number of records where the count of the number of records in membership_userrecords contains the value in $memberid1.
membership_userrecords - this is a default table created automatically by AppGini
tableName - a field in membership_userrecords which holds the name of the table the record belongs to
yourtablename - this is the name of your table (it should match the name of the hook file you are putting this code in minus the php extension)



You do not need to use or create the variable $memberid1 if you do not want to. You can incorporate the variable value directly in the statement if you wish. I find this way makes it easier to explain.

I also recommend you trap for the admin user or other user group like this to allow the admin or some other group to create more than one. I use this where I have a database which I need to have a member info table but only want 1 record in there.

Here is sample code for allowing the admin or others to create more than one record if you wish. Depends upon your usage I guess. It goes before the line beginning with $memberid1. Right below the function line.

Code: Select all

if($memberInfo['group']=='Admins' || $memberInfo['group']=='someothergroup'){
		 return TRUE;
		
	}else{
Hope this works for you.

Alan

Re: Best Way to Limit record in table to only 1

Posted: 2016-02-08 00:08
by shasta59
Using Appgini 5.50

The method I described above, with a little additional code, can also be used to limit new record creation between dates.

For example:

You wish to not allow a member/user to create more than X number of records between Jan 1 and Jan 15. You just adapt the above code to check how many records they created between the two dates and either allow or do not allow new record creation.

In cases where I use this I check to see how many records have been created in the last X number of days. If it exceeds a certain limit then they are not allowed to create more records. I set this value in the Admin section using code I added to allow easy setting of the number of days. But that is a whole other discussion area.

Alan

Re: Best Way to Limit record in table to only 1

Posted: 2016-02-08 09:45
by bambinou
Thank you Alan,

I wish your reply came 1 month earlier :-))) as I was so stuck in the project that I had to move to Yii2 to get the project going.
I will give it a shot with Appgini sometime next week as I would still want to use Appgini.

Thanks again,

Ben

Re: Best Way to Limit record in table to only 1

Posted: 2016-11-26 20:57
by Mike Ryba
Hi Shasta,

I'm in version 5.0 rev. 835, and have tried your hook code solution for limiting 1 record saved to a table - but with no success. My code implementation is as follows:

Code: Select all

function ad_manager_before_insert(&$data, $memberInfo, &$args){

   $memberid1 = ($memberInfo['username']);
   $getrecordcount = sqlValue("select COUNT(tableName) FROM membership_userrecords WHERE tableName = 'ad-manager' AND memberID = '$memberid1' ");
if ($getrecordcount > 0) return FALSE;
		return TRUE;
	}
I consistently get a "record saved" message and find that additional record(s) get added. I tried the IF statement as >1 in case that might have made a difference. But neither >0 or >1 do the trick.

I even changed the return TRUE; to return FALSE; just to make sure the before_insert section of the hook file was working. In that case, I did get the "record cannot be saved" message. If it hadn't been for that, I would've thought the code wasn't being executed at all. I had placed several ECHO "text"; commands in various places in your code but they didn't display.

Any guidance would be appreciated - greatly!

Re: Best Way to Limit record in table to only 1

Posted: 2017-04-21 10:12
by bambinou
I wish they had a lot ore tutorials on their website(without the need to pay more on udemy....) Basic things like this one becomes really difficult .

Re: Best Way to Limit record in table to only 1

Posted: 2019-12-12 06:11
by rrahmad
any update on this? it doest work.

Re: Best Way to Limit record in table to only 1

Posted: 2019-12-12 07:00
by sjohn
Suggestion for a simple solution :
If it is always one record per user for a table, then you could in the table you want to have this rule, create a field where you store the username.
And then specify the field as unique.
This should do, that a user is allowed to create a record if it is the first time he tries.
If he tries to create one more record for that table, it should be impossible as there is already a record with that users id, and as the field is defined as unique, this is not allowed.

Long time ago, I suggested to Ahmad that it should be possible to specify in the admin table settings, how many records that was allowed for a table per user. Hope it is in the pipeline.

Re: Best Way to Limit record in table to only 1

Posted: 2019-12-12 07:02
by jsetzer
If I need one record per member, there is at least three ways to do this:
  • Add a field called memberID, default: > Created by, [x] Unique. This will deny insert, but the Add-New button will still be visible.
  • After insert, modify membership_userpermissions: revoke insert for current user on that table. This user-specific permission will overrule the group-permission
  • Get number of records for getLoggedMemberID() and then set $options->AllowInsert = ($count < 1); in TABLENAME_init()-function.
Last suggestion is the easiest option.

Best,
Jan