ukyo

FieldtypeFontIconPicker

42 posts in this topic

FieldtypeFontIconPicker

v.0.1.6

  • Fix FieldtypeFontIconPicker sanitizeValue()

v.0.1.5

  • Added uikit icon select support (required AdminThemeUikit), because uikit icons not working standalone.

v.0.1.4 :

  • Fix issue FontIconPicker inside repeater

v.0.1.3 :

  • FontAwesome updated to 4.7.0

v.0.1.2 :

  • Little Corrections
  • Some works about icon pickers inside repeater via ajax load

v.0.1.1 :

  • FontAwesome updated to 4.6.3

v.0.1.0 :

  • Custom CSS file url support
  • Added hook method ___beforeRender(), you can check hook example for usage
  • Added multiple icons library use option
  • Added Ionicons Library
  • Now module using cdn for load icon fonts

v.0.0.9 inside dev branch

  • Added hook method ___beforeRender(), you can check hook example for usage
  • Added multiple icons library use option
  • Added Ionicons Library
  • Now module using cdn for load icon fonts

v.0.0.8

  • FontAwesome 4.5 update, Improvements and Performance updates
  • Important ! After update module check your input settings, because i changed input attribute names (This will only effect input options, like theme, category). Changed loading icon method from input:hidden to select>optgroup>option, added module js file for load and correct icon picker container many changes….

v.0.0.7

  • FontAwesome updated to 4.4.0

v.0.0.6

  • Missed... array compatibility for usage, from [$foo, $bar] to array($foo, $bar)

v.0.0.5

  • Fix for oldest pw versions (Assets file loding scripts moved to inputfieldfonticonpicker module)

v.0.0.4

  • Array compatibility for usage, from [$foo, $bar] to array($foo, $bar)

v.0.0.3

  • Small z-index problem solved

v.0.0.2

  • MarkupFontIconPicker added

v.0.0.1

  • Start Point

Module allow you to use Fotn-Awesome icons easily. You can select icons directly from icon select list, also you can set settings for each InputfieldFontIconPicker.
 
NOTE : Module store data without prefix, you need to add "prefix" when you want to show your icon on front-end, because some of front-end frameworks using font-awesome with different "prefix".

Example :

if($my-icon-field) echo "<i class='my-prefix-{$my-icon-field}' />";

Hook Before Render Example This example using /site/templates/admin.php file for hook

wire()->addHook('InputfieldFontIconPicker::beforeRender', function($event) {
    if(!$event->return) return;

    // Get Input Name (For specified input hook, if you want apply all InputfieldFontIconPicker remove inputName check)
    $inputName = "";
    if(isset($event->object->attributes['name'])) $inputName = $event->object->attributes['name'];

    // Get Input Name (For specified input hook, if you want apply all InputfieldFontIconPicker remove inputName check)
    if($inputName == 'icon_picker') {

        /**
        * Load your custom icons function file
        * Your array need to be same format with Icons/FontAwesome.php or Icons/Ionicons.php
        * Also you can pass directly an array
        */
        wireIncludeFile('MyCustomIconFile');

        // Set icons as $icons variable
        $icons = MyCustomIconsArray();

        // Set your options
        $return = array(
            'attributes' => array(
                'category' => '',
                'theme' => 'fip-grey',
                'empty-icon' => 1,
                'empty-icon-value' => '',
                'icons-per-page' => 20,
                'has-search' => 1
            ),
            'icons' => $icons
        );

        // Return the event
        $event->return = $return;
    }

    $event->return;
});

MarkupFontIconPicker Usage

// MarkupFontIconPicker::render(YourIconField=string, Options=array)
echo MarkupFontIconPicker::render($page->YourIconField, [
        'prefix' => 'uk-icon-', // Icon class prefix, if you have different prefix, default is : "fa fa-"
        'tag' => 'span', // Icon tag default is : "i"
        'class' => 'fa-lg', // If you have extra cutom classes, for example : icons sizes, Array or Sting value
        'style' => 'your custom styles if you have' // Array or String Value
    ]);

Module Using

Screenshots - InputfieldFontIconPicker input settings

InputfieldFontIconPicker Setting "Category Select"
 
65mw6e.jpg

InputfieldFontIconPicker Setting "Theme Select"

2nksx94.jpg

Screenshots - InputfieldFontIconPicker page edit views

InputfieldFontIconPicker Search
1zdpsnk.jpg

InputfieldFontIconPicker Categories

66zuyw.jpg
 
For issues and other things here is MY Github Repo

10 people like this

Share this post


Link to post
Share on other sites

Great work - just playing with it now and it's really slick - thanks for the contribution!

One thing I noticed - not a big deal, but when you search by text, with "From all categories" selected, it duplicates the matching icons.

Also, out of interest, did you see this: http://processwire.com/blog/posts/processwire-core-updates-2.5.15/#new-icon-selection-module-in-the-core

It's an Inputfield, but not a Fieldtype, so it can't be used in templates as is, but I wonder how these two modules could be consolidated, or maybe they should remain completely separate - just thinking out loud - I have no idea whether Ryan is planning a matching fieldtype for his module.

Share this post


Link to post
Share on other sites

Great work - just playing with it now and it's really slick - thanks for the contribution!

One thing I noticed - not a big deal, but when you search by text, with "From all categories" selected, it duplicates the matching icons.

Also, out of interest, did you see this: http://processwire.com/blog/posts/processwire-core-updates-2.5.15/#new-icon-selection-module-in-the-core

It's an Inputfield, but not a Fieldtype, so it can't be used in templates as is, but I wonder how these two modules could be consolidated, or maybe they should remain completely separate - just thinking out loud - I have no idea whether Ryan is planning a matching fieldtype for his module.

Thanks for your feedback !

I think, duplicate problem is not actually a problem. Why ? : I took all icons from font-awesome website by categorized and 1 icon may in more than 1 category.

I see @Ryan module, i am trying to use always dev version of processwire and i can follow updates, new things better, but you can't use it on page as a field. @Ryan solution is good for templates and field icons select.

If you think from customer side : Simple example, think you have links page for social network website. You need an icon for each link page and you can easily select icon from select list. you don't need to search icon class inside font-awesome website or inside a icon class guide. Just select it from list. Also its possible to limit icons from input setting tab by category.

Share this post


Link to post
Share on other sites

Great work - I have a few sites I could use this on!

If you submit this to the modules directory I will happily tag you as a module author on your dev profile too :)

Share this post


Link to post
Share on other sites

Yes, I submit it. Waiting for approve.

Also if you can, can you correct the url of my dev profile

False  -> /alt-ve-bir-bilisim-teknolojileri/ (Loosing small "ı")  ???

True   -> /alti-ve-bir-bilisim-teknolojileri/ (Turkish characters ). ı -> i

note: I added logo also again. When you make post on dev form profile, if validation is not ok fields coming as blank field.

O0

Share this post


Link to post
Share on other sites

Having a small z-index problem

attachicon.gifScreen Shot 2015-02-08 at 5.19.31 PM.png

Thanks for your feedback!

Z-index problem causing from content section ("<div id='content' class='content'>").

Icon selector z-index value is "10000" and not effecting outside of "content" section, if you add z-index value = 2, to "<div id='content' class='content'>" element its looking ok.

Need a hack for ("<div id='content' class='content'>") section by jquery or core team can add a z-index value for this section. If core team can do it, i don't need a hack for z-index. If they can't i can add a little hack for this problem. Will wait for core team answer.

Share this post


Link to post
Share on other sites

But PW has the "<div id='content' class='content'>" with z-index: 0, jquery is fine. I don't see a reason why PW needs a z-index: 0 there at all as it will result all absolute containers inside #content underlap #footer cause #footer has no z-index.

Share this post


Link to post
Share on other sites

Z-index values looking ok, but how copyright informations coming up?

When i check page render result with firebug, footer section looking ok, .container element inside footer section coming up of absolute element.

My solution is hack #content element or #footer .container element by little jquery code. Add a z-index value when document ready to #content "z-index: 2;" or #footer .container "z-index: -1;". Problem solve with this method.


You can change InputfieldFontIconPicker.module line 94 with this code, I will update repo also :
 
$output .= "\n<script>
		\n\tjQuery(document).ready(function($) {
		\n\t\t$('#{$options['id']}').fontIconPicker({
		\n\t\t\tsource: {$options['icons']},
		\n\t\t\t{$settings}
		\n\t\t});
		\n\t\tif($('#content').length) {
		\n\t\t\t$('#content').css('z-index', 2);
		\n\t\t}
		\n\t});
		\n</script>";

Share this post


Link to post
Share on other sites

Ugly things! :)

PW should remove the z-index:0 from #content. No need to add it and if there's a reason it can be solved differently by adding z-index: 0 to footer too, but then why? PW has that wrong not your module or the plugins so PW needs to sort that out cause it's a ”bug".

It's like "adding !important to all elements that need overriding specification problems in you CSS".


Z-index values looking ok, but how copyright informations coming up?

#header (stacking order 1)

#content (stacking order 1)

#footer (stacking order 1)

now a "z-index: 0" to #content will make it

#header (stacking order 1)

#content (stacking order 0)

#footer (stacking order 1)

So content is "under" footer now.

Share this post


Link to post
Share on other sites

couldn't try it, because i got this error when i tried to install it

Parse Error: syntax error, unexpected '[' (line 20 of /httpdocs/site/modules/FieldtypeFontIconPicker/FieldtypeFontIconPicker.module)

pw 2.5.17

Share this post


Link to post
Share on other sites

ok, this issue comes from the array notation!

$array = array($foo, $bar); // is ok

$array = [$foo, $bar]; // only php version 5.4+

had this issue today with a different module so i thought it was not specific to this module and did some research...

Share this post


Link to post
Share on other sites

ok, this issue comes from the array notation!

$array = array($foo, $bar); // is ok

$array = [$foo, $bar]; // only php version 5.4+

had this issue today with a different module so i thought it was not specific to this module and did some research...

For compatibility, i will change [$foo, $bar] to array($foo, $bar).

- Edit : Done. You can update module.

1 person likes this

Share this post


Link to post
Share on other sites

I don't know what I am doing wrong but I can't get this module to work.

I tried it on a fresh install of processwire 2.5.3

I just get as the image shows below. No way to pick an icon.

post-1906-0-74534800-1426441761_thumb.jp

Share this post


Link to post
Share on other sites

I don't know what I am doing wrong but I can't get this module to work.

I tried it on a fresh install of processwire 2.5.3

I just get as the image shows below. No way to pick an icon.

attachicon.gifCapture.JPG

I created Module with last dev version. Let me check for last stable version and i can see what is problem for oldest versions.

Edit: Problem solved can you confirm after update to v0.0.5

2 people like this

Share this post


Link to post
Share on other sites

On Install i get :

Parse error: syntax error, unexpected '[' in /somepath/site/modules/FieldtypeFontIconPicker/InputfieldFontIconPicker.module on line 22

I guess this is because that server uses php 5.4.   that does not support the new [] Syntax.

The funnie thing about that is that it should support it !

Share this post


Link to post
Share on other sites

Nice module! Love the good work ( Ellerine saglik ukyo ;-) )

I would like to know if it's possible to include the icon package of foundation http://zurb.com/playground/foundation-icon-fonts-3

regards,

Gerald

Yes its possible, you can configure module as your needs

On Install i get :

Parse error: syntax error, unexpected '[' in /somepath/site/modules/FieldtypeFontIconPicker/InputfieldFontIconPicker.module on line 22

I guess this is because that server uses php 5.4.   that does not support the new [] Syntax.

The funnie thing about that is that it should support it !

- Corredted with last commit, you can download 0.0.6 version

1 person likes this

Share this post


Link to post
Share on other sites

Hi! Awesome Module (pun intended) ;)

This would turn out very usefull for my next project, However I get some strange behaviour when leaving an edit page without changing anything on the icon. It gives me a confirm box saying there is unsaved content (see attachment). Does anybody have the same behaviour or knows what I do wrong here? 

Thanks for any suggestion. 

Sascha

post-3736-0-21412600-1444594672_thumb.pn

Share this post


Link to post
Share on other sites

Great extension! Very useful for a project of mine, thank you!

I have the same problem as saschapi. I save my page. Next I want to leave, I get a browser message (firefox) telling me that I have unsaved data.

Google translation from German:

"This page asks you to confirm that you want to leave the page - data you have entered will not be saved under certain circumstances."

Share this post


Link to post
Share on other sites

Hi ukyo, did you find anything? ;)

 

 

Great extension! Very useful for a project of mine, thank you!

 

I have the same problem as saschapi. I save my page. Next I want to leave, I get a browser message (firefox) telling me that I have unsaved data.

 

Google translation from German:

"This page asks you to confirm that you want to leave the page - data you have entered will not be saved under certain circumstances."

 

 

Hi! Awesome Module (pun intended) ;)

 

This would turn out very usefull for my next project, However I get some strange behaviour when leaving an edit page without changing anything on the icon. It gives me a confirm box saying there is unsaved content (see attachment). Does anybody have the same behaviour or knows what I do wrong here? 

 

Thanks for any suggestion. 

 

Sascha

Sorry i am to busy with work and i know the issue. I think this issue appear, because fonticonpicker js library changing the processwire field attributes. I will do one more hidden field for fonticonpicker js attributes and after done i will update processwire field. Started to work on it.

Thanks for interest !

2 people like this

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By zlitrox
      Hi!
      I'm relatively new to the world of Processwire, but so far I'm really impressed by this CMS and its ease, power and speed.
      I've been looking at the different field types and also existing CKEditor modules (pwimage and pwlink).
      Here's what i want to achieve:
      I would like to use or create a own module which allows my admin users to upload pdf files inline in a CKEditor field (page content) the same way images are handled. It should be possible to upload a pdf file and specify its name and from the file uploaded and name i want to show an icon or image inline in editor and the output for that upload should be customized based on the module. Lets make it simple and say that i upload datasheet-1.pdf and want it to be named "My product datasheet", i want the output to be:
      <a href="{ link to uploaded pdf file }">My product datasheet</a>  
      Also the uploaded pdf files should be related to the page the user is editing.
       
      Is this doable? 
       
      Any guidance would be greatly appreciated! Thanks in advance.
      PS. I'm a PHP programmer so i know it would require some custom code, but the real question is where do i start, what should it take and is it even possible to do?
    • By flydev
      Auth2Login for ProcessWire
      A Module which give you ability to login an existing user using your favorite thrid-party OAuth2 provider (i.e. Facebook, GitHub, Google, LinkedIn, etc.)..
      You can login from the backend to the backend directly or render a form on the frontend and redirect the user to a choosen page.
      Built on top of ThePhpLeague OAuth2-Client lib.
      Registration is not handled by this module but planned.
       
      Howto Install
      Install the module following this procedure:
       - http://modules.processwire.com/modules/oauth2-login/
       - https://github.com/flydev-fr/OAuth2Login
      Next step, in order to use a provider, you need to use Composer to install each provider
      ie: to install Google, open a terminal, go to your root directory of pw and type the following command-line: composer require league/oauth2-google
      Tested providers/packages :
          Google :  league/oauth2-google     Facebook: league/oauth2-facebook     Github: league/oauth2-github     LinkedIn: league/oauth2-linkedin
      More third-party providers are available there. You should be able to add a provider by simply adding it to the JSON config file.

      Howto Use It
      First (and for testing purpose), you should create a new user in ProcessWire that reflect your real OAuth2 account information. The important informations are, Last Name, First Name and Email. The module will compare existing users by firstname, lastname and email; If the user match the informations, then he is logged in.
      ie, if my Google fullname is John Wick, then in ProcessWire, I create a new user  Wick-John  with email  johnwick@mydomain.com
      Next step, go to your favorite provider and create an app in order to get the ClientId and ClientSecret keys. Ask on the forum if you have difficulties getting there.
      Once you got the keys for a provider, just paste it into the module settings and save it. One or more button should appear bellow the standard login form.
      The final step is to make your JSON configuration file.
      In this sample, the JSON config include all tested providers, you can of course edit it to suit your needs :
      { "providers": { "google": { "className": "Google", "packageName": "league/oauth2-google", "helpUrl": "https://console.developers.google.com/apis/credentials" }, "facebook": { "className": "Facebook", "packageName": "league/oauth2-facebook", "helpUrl": "https://developers.facebook.com/apps/", "options": { "graphApiVersion": "v2.10", "scope": "email" } }, "github": { "className": "Github", "packageName": "league/oauth2-github", "helpUrl": "https://github.com/settings/developers", "options": { "scope": "user:email" } }, "linkedin": { "className": "LinkedIn", "packageName": "league/oauth2-linkedin", "helpUrl": "https://www.linkedin.com/secure/developer" } } }  
      Backend Usage
      In ready.php, call the module :
      if($page->template == 'admin') { $oauth2mod = $modules->get('Oauth2Login'); if($oauth2mod) $oauth2mod->hookBackend(); }  
      Frontend Usage
      Small note: At this moment the render method is pretty simple. It output a InputfieldForm with InputfieldSubmit(s) into wrapped in a ul:li tag. Feedbacks and ideas welcome!
      For the following example, I created a page login and a template login which contain the following code :
      <?php namespace ProcessWire; if(!$user->isLoggedin()) { $options = array( 'buttonClass' => 'my_button_class', 'buttonValue' => 'Login with {provider}', // {{provider}} keyword 'prependMarkup' => '<div class="wrapper">', 'appendMarkup' => '</div>' ); $redirectUri = str_lreplace('//', '/', $config->urls->httpRoot . $page->url); $content = $modules->get('Oauth2Login')->config( array( 'redirect_uri' => $redirectUri, 'success_uri' => $page->url ) )->render($options); }

       
      Screenshot
       



    • By Robin S
      First a note about my other modules...
      I have three existing modules that are similar in that they allow restrictions to be placed on repeating inputfields: Limit Repeater, Limit PageTable, Limit Table
      Restrict Repeater Matrix takes a different approach to the module configuration from those other modules. The module settings for Restrict Repeater Matrix are applied in the field settings rather in a module config screen. I think this new approach is better, but it means that it isn't practical to create different settings for different roles via the admin interface. Instead the module has a hookable method, allowing roles to be targeted and other advanced usages to be achieved via a hook. The result is that the module is more flexible.
      I intend to transition my other modules to the same approach over the coming weeks, but because this will result in breaking changes I will be releasing the updated modules under new names ("Restrict Repeater", etc) to avoid users upgrading via the Upgrades module without full awareness of the changes. The old modules will be marked as deprecated.
       
      Restrict Repeater Matrix
      A module for ProcessWire CMS/CMF. Allows restrictions and limits to be placed on Repeater Matrix fields. Requires FieldtypeRepeaterMatrix >= v0.0.4
      For any matrix type in a Repeater Matrix field you have the option to:
      Prevent drag-sorting of items Prevent cloning of items Prevent toggling of the published state of items Prevent trashing of items Limit the number of items that may be added to the inputfield Please note that restrictions and limits are applied with CSS/JS so should not be considered tamper-proof.
      Usage
      Install the Restrict Repeater Matrix module.
      For each matrix type created in the Repeater Matrix field settings, a "Restrictions" fieldset is added at the bottom of the matrix type settings:

      For newly added matrix types, the settings must be saved first in order for the Restrictions fieldset to appear. Set restrictions for each matrix type as needed. A limit of zero means that no items of that matrix type may be added to the inputfield.
      Setting restrictions via a hook
      Besides setting restrictions in the field settings, you can also apply or modify restrictions by hooking RestrictRepeaterMatrix::checkRestrictions. This allows for more focused restrictions, for example, applying restrictions depending on the template of the page being edited or depending on the role of the user.
      The checkRestrictions() method receives the following arguments:
      $field This Repeater Matrix field $inputfield This Repeater Matrix inputfield $matrix_types An array of matrix types for this field. Each key is the matrix type name and the value is the matrix type integer. $page The page that is open in ProcessPageEdit The method returns a multi-dimensional array of matrix types and restrictions for each of those types. An example of a returned array:

      Example hooks
      Prevent the matrix type "images_block" from being added to "my_matrix_field" in a page with the "basic-page" template:
      $wire->addHookAfter('RestrictRepeaterMatrix::checkRestrictions', function(HookEvent $event) { $field = $event->arguments('field'); $page = $event->arguments('page'); $type_restrictions = $event->return; if($field->name === 'my_matrix_field' && $page->template->name === 'basic-page') { $type_restrictions['images_block']['limit'] = 0; } $event->return = $type_restrictions; });  
      Prevent non-superusers from trashing any Repeater Matrix items in "my_matrix_field":
      $wire->addHookAfter('RestrictRepeaterMatrix::checkRestrictions', function(HookEvent $event) { $field = $event->arguments('field'); $type_restrictions = $event->return; if($field->name === 'my_matrix_field' && !$this->user->isSuperuser()) { foreach($type_restrictions as $key => $value) { $type_restrictions[$key]['notrash'] = true; } } $event->return = $type_restrictions; });  
      http://modules.processwire.com/modules/restrict-repeater-matrix/
      https://github.com/Toutouwai/RestrictRepeaterMatrix
    • By psy
      ProcessWire DropboxAPI on GitHub: https://github.com/clipmagic/DropboxAPI
       
      This module is a wrapper for Kunal Varma's Dropbox PHP SDK https://github.com/kunalvarma05/dropbox-php-sdk
      It was created to perform a specific function for a client, ie upload PDF files on a PW website to a specific Dropbox account folder.
      The PDF files, created using @Wanze's excellent PagesToPdf module using the WirePDF functions, are generated from Formbuilder forms completed by front-end site visitors.  Works a treat!
      There's more that could be done to allow ProcessWire to take advantage of all the features of the SDK, eg downloads, multiple Dropbox accounts, etc. You are welcome to request changes and/or fork the GitHub project to extend the feature set.
      Enjoy!
      System requirements
      PHP 5.6.4 or greater Composer The PHP mbstring extension General information
      This module enables you to access a single Dropbox (www.dropbox.com) account to upload files from a ProcessWire website.
      All kudos to (https://github.com/kunalvarma05/dropbox-php-sdk) for the PHP API.
      First steps
      Visit (https://www.dropbox.com/developers) and read the documentation. Log into Dropbox and create a new application. It's recommended to limit ProcessWire App access to a specified folder Make a note of the App key, the App secret and the name of the Dropbox folder Installation
      Download the zip file into your site/modules folder then expand the zip file. Next, login to ProcessWire > go to Modules > click "Refresh". You should see a note that a new module was found. Install the DropboxAPI module. Configure the module with your App key, App secret and your Call Back URL You need to generate a Dropbox access token to enable your site to communicate with the nominated Dropbox account. Dropbox will generate a token for you or you can create a page for the front end of your ProcessWire site with a template to submit the token request to Dropbox, eg:
      <?php namespace ProcessWire; $drop = $modules->get('ProcessDropboxAPI'); if ($input->get->code && $input->get->state) { $code = $sanitizer->text($input->get->code); $state = $sanitizer->text($input->get->state); //Fetch the AccessToken $accessToken = $drop->getAccessToken($code, $state); echo "Copy/paste this code into the module configuration: " . $accessToken; } else { echo "<p><a href='" . $drop->getAuthURL() . "'>Log in with Dropbox</a></p>"; } ?> Once you have entered the token in the module configuration, you can unpublish this page.
      Usage
      Read the dropbox-php-sdk documentation!
      An example template for sending a file to a Dropbox App folder from ProcessWire:
      <?php namespace ProcessWire; use Kunnu\Dropbox\Dropbox; use Kunnu\Dropbox\DropboxApp; use Kunnu\Dropbox\DropboxFile; // send pdf to Dropbox $drop = $modules->get('DropboxAPI'); $app = new DropboxApp($drop->app_key, $drop->app_secret, $drop->authorization_code); if ($app) { //Configure Dropbox service $dropbox = new Dropbox($app); $dropboxFile = new DropboxFile('/path/to/myfilename.pdf'); $file = $dropbox->upload($dropboxFile, "/myfilename.pdf", ['autorename' => true]); //Uploaded File meta data if ($file) { $success = $file->getName() . " uploaded to Dropbox"; $drop->log($success); } }  
       
    • By Sipho
      I recently needed a module that automatically fills the title field of a page using fields on that page. I couldn't see one that already existed so I made my own. This is mostly based on ProcessSetupPageName by @kixe which I use along with this module. Keep in mind I am very new to ProcessWire so perhaps somebody else can contribute or make a better one 
      Note: The title is automatically hidden when using this module
      You can enter any string. To add a fieldname, subfield or property, you surround the fieldname with {}. Dot syntax allowed. Example:
      Fish: {parent.title} {myfield}
      https://github.com/nextgensparx/AutoPageTitles