[support] PHP Allowed Values for CCK Field as Associative Array
Shai Gluskin
shai at content2zero.com
Wed Jan 27 02:36:06 UTC 2010
Thanks William,
Now the array returns:
Array
(
[Cats] => Cats
[Dogs] => Dogs
[Goats] => Goats
)
Thought that would work... the list in the select is right. But upon submit
it throws an "illegal value" error.
Searching on d.o. I found a reference to cck wanting the array to be nested
one level deeper? Not sure that was exactly the same situation. Any other
ideas?
Shai
On Tue, Jan 26, 2010 at 8:14 PM, William Smith <william.darren at gmail.com>wrote:
> Sorry if I misunderstand the problem, but could you not use
> drupal_map_assoc right before you return your array?
>
>
> $arr = explode("\n", $node->body);
> return drupal_map_assoc($arr);
>
> On Tue, Jan 26, 2010 at 8:01 PM, Shai Gluskin <shai at content2zero.com>wrote:
>
>> Support Folks,
>>
>> Need/Use-case: a very simple, lightweight UI for a customer to edit
>> options on a select for a CCK field.
>>
>> Idea to solve it. Create an unpublished node (linked to via for the
>> customer via a custom site-admin block) whose body field are the select-list
>> options. One option per line.
>>
>> In the CCK field I'm using the PHP option to return an array to create the
>> allowed options:
>>
>> This following code works... but is not quite what I want:
>> (I know that the client input part should be sanitized for security... but
>> I'm just trying to get it to work before I do that part.)
>>
>> $sql = "SELECT body FROM {node_revisions} WHERE nid=1274 ORDER BY
>> timestamp DESC LIMIT 1";
>> $res = db_query($sql);
>> $node = db_fetch_object($res);
>> $arr = explode("\n",$node->body);
>> return $arr
>>
>> from a node body field that looks like:
>>
>> Cats
>> Dogs
>> Goats
>>
>> It returns an indexed array like
>>
>> Array
>> (
>> [0] => Cats
>> [1] => Dogs
>> [2] => Goats
>>
>> )
>>
>> *Problem:* What gets stored in the database is the integer key from the
>> indexed array created by explode(). The data integrity is thus completely
>> dependent upon the order of the items listed. I don't want that. I want
>> people entering the data to be able to change the order. *I want an
>> associative array in which the keys and labels are the same.*
>>
>> Note that if, via the field configuration UI, I simply list the values in
>> the allowed values box... Drupal turns that list into an associative array
>> in which the keys and values are the same. Exactly what I want! But I don't
>> know how to create that for the custom PHP value set. I'm putting the code
>> here from CCK where this happens. I don't quite get it.
>>
>> Any hints would be most appreciated,
>>
>> Shai
>>
>> /**
>> * Create an array of the allowed values for this field.
>> *
>> * Used by number and text fields, expects to find either
>> * PHP code that will return the correct value, or a string
>> * with keys and labels separated with '|' and with each
>> * new value on its own line.
>> *
>> * @param $field
>> * The field whose allowed values are requested.
>> * @param $flatten
>> * Optional. Use TRUE to return a flattened array (default).
>> * FALSE can be used to support optgroups for select widgets
>> * when allowed values list is generated using PHP code.
>> */
>> function content_allowed_values($field, $flatten = TRUE) {
>> static $allowed_values;
>>
>> $cid = $field['field_name'] .':'. ($flatten ? '1' : '0');
>> if (isset($allowed_values[$cid])) {
>> return $allowed_values[$cid];
>> }
>>
>> $allowed_values[$cid] = array();
>>
>> if (isset($field['allowed_values_php'])) {
>> ob_start();
>> $result = eval($field['allowed_values_php']);
>> if (is_array($result)) {
>> if ($flatten) {
>> $result = content_array_flatten($result);
>> }
>> $allowed_values[$cid] = $result;
>> }
>> ob_end_clean();
>> }
>>
>> if (empty($allowed_values[$cid]) && isset($field['allowed_values'])) {
>> $list = explode("\n", $field['allowed_values']);
>> $list = array_map('trim', $list);
>> $list = array_filter($list, 'strlen');
>> foreach ($list as $opt) {
>> // Sanitize the user input with a permissive filter.
>> $opt = content_filter_xss($opt);
>> if (strpos($opt, '|') !== FALSE) {
>> list($key, $value) = explode('|', $opt);
>> $allowed_values[$cid][$key] = (isset($value) && $value !=='') ?
>> $value : $key;
>> }
>> else {
>> $allowed_values[$cid][$opt] = $opt;
>> }
>> }
>> // Allow external modules to translate allowed values list.
>> drupal_alter('content_allowed_values', $allowed_values[$cid], $field);
>> }
>> return $allowed_values[$cid];
>> }
>>
>> --
>> [ Drupal support list | http://lists.drupal.org/ ]
>>
>
>
> --
> [ Drupal support list | http://lists.drupal.org/ ]
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.drupal.org/pipermail/support/attachments/20100126/0e828c54/attachment-0001.html
More information about the support
mailing list