How to add admin user attributes in Magento - magento

I'd like to add some new attributes to the admin users in Magento. These users are different than customers (just to make it clear) and it's only possible to set their user/name/lastname/mail/pass, but I'd like to add a few new attributes.
To do so, I guess I can use the addattribute function, but I need to find out which is the id of these admin users. For example, if I want to add a new attribute to a customer, I can use a function like this:
$setup->addAttribute('customer','attribute_id', $attr );
So, in this case, 'customer' is the id for customers. How can I find out which id is used for admin users? (this question can be extended to "How can I find the different id for the different types of attributes in Magento?").
==There is a chance that there is no way to change this. I've taken a look at the admin_user table and it's quite simple, all fields are there. So maybe there are no attributes in this case.==
Thanks

You can find all such ids (entity ids) in the eav_entity_type table.
And yes, there is no record for admin user. Because all data about admin users are stored in flat tables but not in eav. So to add a new attribute to admin user, you need to add a new column in the admin_user table

You will need to add a column to the admin_user table.
$installer->getConnection()->addColumn($installer->getTable('admin/user'), 'location', array(
'type' => Varien_Db_Ddl_Table::TYPE_TEXT,
'length' => 256,
'nullable' => true,
'default' => null
));
Then, if you want to add/edit this field from the backend you need to rewrite the method Mage_Adminhtml_Block_Permissions_User_Edit_Tab_Main::_prepareForm and add a new element in there:
$fieldset->addField('location', 'select', array(
'name' => 'is_active',
'label' => Mage::helper('adminhtml')->__('location'),
'id' => 'is_active',
'title' => Mage::helper('adminhtml')->__('location'),
'class' => 'input-select',
'style' => 'width: 80px',
'options' => array('1' => Mage::helper('adminhtml')->__('Yes'), '0' => Mage::helper('adminhtml')->__('No')),
));
Clear the cache and it should work.

No option till 1.7
thats what i use in the template to show the sku to an specific user bit dirty but works fine:
<?php
//EGS SKU added for Power User
$_powerUser = 777;
if (Mage::getSingleton('customer/session')->getCustomer()->getId() == $_powerUser)
{
echo '<div class="price-from">' . $_product->getSku() . '</div>';
}
?>

Related

Yii filter condition

In my admin.php, I have a table and one of the columns is Status which gives only 2 options, Open or Close.
The below is in my admin.php
array(
'name' => 'complete',
'header'=>'Status',
'value' => '($data->complete == 0) ? Yii::t(\'app\', \'Open\') : Yii::t(\'app\', \'Close\')',
'filter' => array('0' => Yii::t('app', 'Open'), '1' => Yii::t('app', 'Close')),
),
I want it to show only the Open condition instead of everything. What can I add into the code?
If you want to show by default only the rows that are still open (not completed), you can simply go to the controller in the admin action and add:
$model->complete=0;
That should be placed just after defining the model and before assigning attributes from $_GET, so it can be overwritten if user choses other option.

How to create custom source model for custom attribute type select?

I tried to search this but couldn't find any. When creating a custom product attribute with select type programmatically, Magento always assigns eav/entity_attribute_source_table as the source model.
There are 2 issues with this default source model:
I can't auto populate the field with data taken programmatically from somewhere else other than have to type the data list manually one by one.
Although I have specified the "default" or "default_value" (I can see in the database that the value is there), the field is still showing empty as the first line.
How I can change the default source_model to my own source model for select type?
Thank you
The key you are looking for is to pass a source value in your SQL setup. Make sure your $installer is an EAV setup object.
You would do the following in your setup script:
$installer = $this;
$installer->starSetup();
// Setup customer multiselect attribute
$attr = array(
'backend' => 'eav/entity_attribute_backend_array',
'input' => 'multiselect',
'label' => 'Permissions',
'note' => 'Used for group-based frontend permissions.',
'required' => false,
'sort_order' => '1000',
'source' => 'eav/entity_attribute_source_table', // Change it here
'user_defined' => true
);
$installer->addAttribute('customer', 'permissions', $attr);
// Add options for permissions
$options = array(
'attribute_id' => $installer->getAttributeId('customer', 'permissions'),
'value' => array(
'place_order' => array('Can Place Orders'),
'view_catalog' => array('Can View the Catalog'),
)
);
$installer->addAttributeOption($options);
$installer->endSetup();
Utimately, I believe the source model can be anything that provides a toOptionArray() function.
There is a great example of this in Mage_Customer, installer: mysql4-upgrade-1.5.9.9-1.6.0.0.php
In it, a country source model is being assigned to customer address attribute country_id.
$installer->updateAttribute(
'customer_address',
'country_id',
'source_model',
'customer/entity_address_attribute_source_country'
);
Change this to catalog_product, your attribute, and source model.
You set the source type as shown below.
'source' => 'categoryattr/attribute_source_type',
and create the file Attribute\Source\Type.php and the create the options and set the value 0 for default option.
$this->_options[] = array (
'label' => 'Select Category',
'value' => '0'
);
please refer below for file structure and step by step explanation.
http://www.pearlbells.co.uk/how-to-create-custom-attribute-source-type-in-magento/

Magento Admin formfield multiselect selected

I´m currently developing a custom module for magento thats going to list employees.
I have figured out almost everything. The only thing I got left is how the selected values is going to be highlighted.
The problem I´m having is for the backend.
I got 2 tabs per employee, one for employee data and one tab for magento categories.
1 employee can have 1 or more categories.
The database table that the categories are stored in are a non-eav table.
So my question is
What in a multiselect determines which values are selected? As it is now, only one value is selected.
I think you can do this by simply passing in an array of the id's to be selected into the 'value' attribute of the field being added for the multiselect in the _prepareForm() method. Something like the following.
$fieldset->addField('category_id', 'multiselect', array(
'name' => 'categories[]',
'label' => Mage::helper('cms')->__('Store View'),
'title' => Mage::helper('cms')->__('Store View'),
'required' => true,
'values' => Mage::getSingleton('mymodule/mymodel')->getMymodelValuesForForm(),
'value' => array(1,7,10),
));
The id of the form element (e.g. category_id) must not be an attribute in your model, otherwise when the form values get set with $form->setValues() later on, the attribute value will be overwritten.
I normally store multiple selections as a text column separated by commas much like most magento modules handles stores which requires a slightly different approach as shown below.
In the form block for the tab with the multiselect, you firstly define the element to be displayed like so in the _prepareForm() method. You then get the values from the model and set put them into the form data.
protected function _prepareForm()
{
...
$fieldset->addField('store_id', 'multiselect', array(
'name' => 'stores[]',
'label' => Mage::helper('cms')->__('Store View'),
'title' => Mage::helper('cms')->__('Store View'),
'required' => true,
'values' => Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(false, true),
));
...
if ( Mage::getSingleton('adminhtml/session')->getMymodelData() )
{
$data = Mage::getSingleton('adminhtml/session')->getMymodelData();
} elseif ( Mage::registry('mymodel_data') ) {
$data = Mage::registry('mymodel_data')->getData();
}
$data['store_id'] = isset($data['stores']) ? explode(',', $data['stores']) : array();
$form->setValues($data);
}
I normally store the selected stores (categories as in your case) in the main model as a text column and comma separated values of ids, hence the explode.
In the controller for for the edit action, I put the model being edited into the mage registry so we can load it and it's values in the step above.
Mage::register('mymodel_data', $model);
Thanks for answering.
This is how my field looks like:
$fieldset->addField('npn_CatID', 'multiselect', array(
'label' => Mage::helper('employeelist')->__('Kategori'),
'class' => 'required-entry',
'required' => true,
'name' => 'npn_CatID',
'values' => $data,
'value' => array(3,5)
));
npn_CatID is the value in my db where the category id is saved.
I have tried to change the name and field ID but cant get it working.
When its the field id is like above ONE value is selected and its the last one inserted for the chosen employee
My data array looks likes
array(array('value' => '1', 'label' => 'USB'), array('value' => '2', 'label' => 'Memories'))

custom edit file Upload field

I have create a custom edit field in manage customer in admin html and also have created a field in database table customer_entity attribute name is Upload_Logo_Cst. but now when i am storing the value in it by admin side then the entered value does not store in Upload_Logo_Cst. pla help me with the appropriate solutions...
$fieldset->addField('customer_entity/Upload_Logo_Cst', 'File', array(
'label' => Mage::helper('customer')->__('Upload Logo'),
'name' => 'uploadlogo',
'id' => 'uploadlogo',
));

Magento Disable Filter Field to Admin Grid

I have a custom module with a backend page. In the grid, I show the customer email as the user name. By default, Magento adds a filter to every column in the grid. Now, when I try to filter by the customer's email, I get an exception saying that my custom table doesn't have an email column. Magento is trying to find that in my custom table. How can I fix this problem, or how can I remove the field of that column so that the admin can't filter by that field.
Thanks.
Add the option
'filter' => false
to the column you want to remove the filter from in the grid view (e.g. app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php)
$this->addColumn('email', array(
'header' => Mage::helper('module')->__('Email'),
'align' =>'left',
'index' => 'email',
'filter' => false,
));
I guess you meant "how can I remove the field of that column so that the admin can ' t filter by that field"
If so, I can tell you how to remove the email field.
Open /app/code/local/Namespace/Module/Block/Adminthml/Module/Grid.php
Somewhere in the protected function _prepareColumns() you should find something like :
$this->addColumn('email', array(
'header' => Mage::helper('module')->__('Email'),
'align' =>'left',
'index' => 'email',
));
Just comment this lines.
And watch out that, in the __construct method at the very beginning of the whole class, you don't have
$this->setDefaultSort('email');
If so, change it to
$this->setDefaultSort('id'); // if you have an id field in your module.
If you don't have an email column in your custom table, then I assume you're creating your grid by joining your custom table to a core table that contains the users email address, such as customer_entity.
When you filter on a column, Magento uses the column index to produce the where clause. Which in your case will give something like WHERE email LIKE '%filter value%', but it wont find email in your custom table.
You might be able to fix this by using filter_index to explicitly tell Magento which table and column to use when building the where clause. Try something like this
$this->addColumn('email', array(
'header' => Mage::helper('module')->__('Email'),
'index' => 'email',
'filter_index' => 'core_table.email',
));
where core_table is the table you are joining with.

Resources