Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 10/23/2015 in all areas

  1. Okay, settled with "InputfieldURLChecker" as the module name as I found no better one. In the last few days the module got some major updates: allow button and hotkey modes to be used together asmSelect fields for enabled fields/templates add "placeholder" to asmSelect fields make strings translatable (with __FILE__ textdomain) JS optimizations/fixes Check the github repo for the details - the options page screenshot shows most of them.
    4 points
  2. Or, you could use my page render cache. https://github.com/adamkiss/PageRenderCache/blob/master/README.md
    3 points
  3. What I would try is install a fresh PW with intermediate profile and edit images, and see if it happens. If not, it may some problems of you're install, third-party module or your own code somewhere. 99% of the cases when such things happend it was a fault of myself or another module and not PW. I've never experienced image saving problems, unless I made my own image field. I remember someone having same problems, so a search turns up: https://processwire.com/talk/topic/3363-image-field-description-not-saving/ Coincidence that there same issue and no solution with a user Ovi?
    3 points
  4. They don't have to be that size, safari could check if the favicon has enough quality to be shown, and show it only then. Just please don't force us to prepare more unnecessary files and add more tags to our code... Edit: @AndZyk, I do agree with you that we should add this to the PW site, that's not the question here
    3 points
  5. I have a couple pages that just do JSON transactions. In them I confirm $config->ajax is TRUE and the $_SERVER['REQUEST_METHOD'] is 'POST'. But then the only way I have found to get the JSON payload is to use file_get_content('php://input') then use either decode_json or wireDecodeJSON to return an associative array. It would be great if the $config->ajax is set for PW to create $input->json (or possibly $input->xml if the payload is XML though I think that is less relevant). Is there a cleaner way to handle this than what I am doing?
    2 points
  6. I removed the check to constructor arguments with the latest release on the dev branch. However, you always need to set the config options before saving the PDF file. This feature is available on the dev branch, you should now be able to call any method on the mPDF instance directly trough WirePDF (as long as the method does not exist as public method on WirePDF already). Technically setting back the mPDF instance was not needed before, I removed this from the ReadMe. If you find any time to get a copy from the dev branch and check if everything works for you, that would be great! Cheers
    2 points
  7. Hi Ivan, nice catch. I made that change. I'll sent a PR to Ryan in the next few days so he can include an updated version of Reno in the core. In the meantime, you can update your copy. Just swap out the renderTopNav() method in AdminThemeRenoHelpers.php public function renderTopNav() { $items = array(); $class = ''; $user = $this->wire('user'); $config = wire("config"); $adminTheme = $this->wire('adminTheme'); $fieldName = "avatar_field_" . $user->template->name; $adminTheme->$fieldName != '' ? $avatarField = $adminTheme->$fieldName : $avatarField = ''; $avatarField != '' ? $imgField = $user->get($avatarField) : $imgField = ''; $avatar = "<i class='fa $adminTheme->profile'></i>"; // View site $items[] = array( "class" => "", "label" => "<i class='fa {$adminTheme->home}'></i>", "link" => $config->urls->root ); // Search toggle $items[] = array( "class" => "search-toggle", "label" => "<i class='fa fa-search'></i>", "link" => "#" ); // Superuser quick links if ($this->user->isSuperuser()){ $items[] = array( "class" => "superuser", "label" => "<i class='fa fa-bolt'></i>", "children" => array( "<i class='fa fa-life-ring'></i> " . $this->_('Support Forums') => array('http://processwire.com/talk/', 'target="_blank"'), "<i class='fa fa-book'></i> " . $this->_('Documentation') => array('https://processwire.com/docs/', 'target="_blank"'), "<i class='fa fa-github'></i> " . $this->_('Github Repo') => array('https://github.com/ryancramerdesign/ProcessWire/', 'target="_blank"'), "<i class='fa fa-code'></i> " . $this->_('Cheatsheet') => array('http://cheatsheet.processwire.com', 'target="_blank"'), "<i class='fa fa-anchor'></i> " . $this->_('Captain Hook') => array('http://processwire.com/api/hooks/captain-hook/', 'target="_blank"'), ) ); } // Avatar field for user information if ($imgField != '') { $class = 'avatar'; count($imgField) ? $img = $imgField->first() : $img = $imgField; $userImg = $img->size(52,52); // render at 2x for hi-dpi (52x52 for 26x26) $avatar = "<img src='$userImg->url' alt='$user->name' />"; } // User information and logout link. Check for profile-edit permission below. $userItem = array( "class" => "avatar", "label" => "$avatar <span>" . $this->getDisplayName($user) . "</span>", "children" => array( "<i class='fa $adminTheme->signout'></i> " . $this->_('Logout') => $config->urls->admin . "login/logout/" ) ); // if user has profile-edit permission add and edit link to the userItem['children'] array. if ($this->user->hasPermission('profile-edit')){ $profileEditLink = array("<i class='fa fa-user'></i> " . $this->_('Profile') => $config->urls->admin . "profile/"); $userItem['children'] = array_merge($profileEditLink, $userItem['children']); } // add the userItem to the menu $items[] = $userItem; return $this->topNavItems($items); } I'm not sure about the translation issue. I will try to look into it later today.
    2 points
  8. +1 what cstevensjr said re Github. Re the problem, it sounds like the module assumes some authentication will be required (not surprised that it assumes this, surprised there's SMTP services which don't require auth). On a general note, this module providing as it does a way to send mail via Mandrill.com, has been a life saver for me. No more lost emails due to recipients email systems assuming an email from a tiny unknown host is spam (as Mandrill delivers millions of emails their reputation is superb and so emails invariably get to their destination w/o getting rejected).
    2 points
  9. The important thing is that the emails are processed and work. I believe if wireMail() is working then this module is working (as it uses wireMail()). If you could open an issue on Github, the module creator/maintainer can have a look at the issue you are reporting.
    2 points
  10. I would do a blank Installation of a pw 2.3 (you find the old versions on github) and change the site folder like explained above. A new installation is a matter of minutes. Trying to replace the profile is more pain I think. When you have your 2.3 site running I would install http://modules.processwire.com/modules/process-wire-upgrade/ (it says it is compatible with 2.3) and let it do the upgrade for you
    2 points
  11. perfectly valid HTML5: <!DOCTYPE html> <title>pw</title> <p> Time to drop your <head> ?
    2 points
  12. They probably just thought that "hey, this fav/app icon/metadata stuff is a mess anyway, so where's the harm in adding one more to the list" <link rel="apple-touch-icon" sizes="57x57" href="/apple-touch-icon-57x57.png"> <link rel="apple-touch-icon" sizes="60x60" href="/apple-touch-icon-60x60.png"> <link rel="apple-touch-icon" sizes="72x72" href="/apple-touch-icon-72x72.png"> <link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-icon-76x76.png"> <link rel="apple-touch-icon" sizes="114x114" href="/apple-touch-icon-114x114.png"> <link rel="apple-touch-icon" sizes="120x120" href="/apple-touch-icon-120x120.png"> <link rel="apple-touch-icon" sizes="144x144" href="/apple-touch-icon-144x144.png"> <link rel="apple-touch-icon" sizes="152x152" href="/apple-touch-icon-152x152.png"> <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png"> <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32"> <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192"> <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96"> <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16"> <link rel="manifest" href="/manifest.json"> <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"> <meta name="msapplication-TileColor" content="#da532c"> <meta name="msapplication-TileImage" content="/mstile-144x144.png"> <meta name="theme-color" content="#ffffff"> .. and yeah, the current situation is a joke, really. Everyone is just adding their own metadata requirements, because hey, everyone else is doing it too and, perhaps, partly because of some messed up "we're so special we can't use what others use" mentality. If only this was the one place where this is happening, but of course not. What about something like the Open Graph metadata? Great idea, except that every service implements it in different way, and then along comes Twitter who decides that they're way too special to use what others use, and require their own twitter-metadata in addition to a half-assed support for Open Graph. Sorry for the (mainly off-topic) rant, by the way
    2 points
  13. Media Manager Released 31 March 2016 https://processwireshop.pw/plugins/media-manager/ Documentation http://mediamanager.kongondo.com/ As of 10 May 2019 ProcessWire versions earlier than 3.x are not supported ******************************************************* ORIGINAL POST ******************************************************* API Example (frontend; will be added to documentation site) Accessing and outputting the contents of the MediaManager field(s) in your template is quite simple. The fields are accessed like many other ProcessWire fields. The fields return an array of type MediaManagerArray that need to be looped to output each media within. Assuming you created a field of type MediaManager named 'media', you can loop through it for a given page as shown below. @note: Each MediaManager object has the following 5 basic properties: DATABASE (saved properties) 1. id => pageID of the page where the media lives (hidden in admin and not important to know about) 2. type => integer denoting media type (1=audio; 2=document; 3=image [for variations this will be 3x, where x is the number of the variation of an original image]; 4=video) RUNTIME 3. typeLabel => user friendly string denoting media type (audio, document, image, video) 4. media => a ProcessWire Image/File Object including all their properties (ext, filesizeStr, height, width, description, tags, filename, basename, etc.) 5. title => title of media (@note: this is the title of the page where the media lives; may or may not be the same as the name of the media file itself). This can be used as a user-friendly name for your media $media = $page->media;// returns a MediaManagerArray. Needs to be looped through foreach ($media as $m) { echo $m->id;// e.g. 1234 (hidden page in /admin/media-manager/media-parent/) echo $m->type;// e.g. 3 (a media of type image) OR 1 (a media of type audio) echo $m->typeLabel;// e.g. 'document' (i.e. type would be 2) echo $m->title;// e.g. 'My Nice Trip' (whose media file could be my-nice-trip.mp4) /* @note: - $m->media returns an object; either a ProcessWire Image (for image media) or File object (for audio, document and video media) - This means you have access to all the properties of that object, e.g. ext, tags, description, url, filename, basename, width, height, modified, created, filesize, filesizeStr, etc as well as associated methods, e.g. size() */ echo $m->media->tags; } // only output images foreach ($media as $m) { if($m->typeLabel =='image') { echo "<img src='" . $m->media->size(100,75)->url . "'><br>"; } } // There's also a toString() method so you can do: echo $page->media; /* All your media will be output wrapped in appropriate HTML tags, i.e.: audio: <audio></audio>; document: <a></a>; image: <img>; video: <video></video>; */ ******************************************************* ORIGINAL POST ******************************************************* The topic of a central media manager feature for ProcessWire has come up several times: https://processwire.com/talk/topic/4330-get-image-from-other-pages-via-images-field/ https://processwire.com/talk/topic/4330-get-image-from-other-pages-via-images-field/?p=42578 https://processwire.com/talk/topic/4330-get-image-from-other-pages-via-images-field/?p=42582 https://processwire.com/talk/topic/425-file-manager/ https://processwire.com/talk/topic/425-file-manager/?p=13802 https://processwire.com/talk/topic/425-file-manager/?p=13861 https://processwire.com/talk/topic/10763-asset-manager-asset-selector/ More recently, regarding my Visual Page Selector module, I have been asked several times why the module does not have an in-built feature to upload images. There's two camps on the topic of a central media manager: those who like them (especially those coming in to PW from other CMSes) and those who don't like them (primarily because of the chaotic way some CMSes (dis)organise their media management) . I think that we can have our cake and eat it too! If done the right way, closely following the principles of and harnessing the power of ProcessWire, we can have a well-implemented, organised, feature-rich, site-wide media manager. Introducing Media Manager: (a commercial module) Alongside a number of modules I am currently working on (both free and commercial), I have been developing a centralised Media Manager for ProcessWire. Before you cast the first stone, no, this is not going to be a one-large-media-bucket as in other CMS where it gets very messy very quickly . In the backend things are neatly stored away, yes, in pages. However, those are pages you will not see (just like repeater pages). Before anyone has a go at pages, remember a page is not that thing you see on the ProcessWire Tree (that's just its visual representation); A page is a record/row in the database . For the end-user of Media Manager, all they will see is the 'familiar media bucket' to select their media from. As long as it works efficiently, I don't think they care about the wizardry behind the scenes . The module allows for the comprehensive management of several media types: Audio Video Images Documents Each media type will be handled by its own sub-module so the user can pick and install/choose the type of media management they want. Features include: Access controls Centralized uploads of media Bulk management of media: tag, delete, describe, replace, etc. Bulk upload: zip; scan, single Quick upload in page edit mode Usage stats across pages (maybe?) Etc.. Would love to hear your thoughts and any feature suggestions. I think there's enough demand for such a module. If not, please let me know so that I can instead focus on other things , thanks. How other CMS do it The more efficient (PW) way of doing it
    1 point
  14. Some time ago I developed a module (FieldtypeImageExtra) which extends Fieldtype Image with the ability to add custom fields to an image. This worked well but it had a somehow restricted applicability and did not meet all of our needs. There of course are other useful image modules like CroppableImage or ImageFocusArea, but up to now there was no possibility to combine image cropping with custom fields support. So you had to decide whether to add image cropping or the possibility to add custom fields because each of those modules sets up their own field type (and input type) which cannot be combined. The new module ImageExtra allows you to have both functionalities. You can get the module from GitHub. For more informations have a look at this blog post. If you notice any problems or unexpected behaviour please let me know.
    1 point
  15. InputfieldURLChecker This is a tiny module to add a URL check button to InputfieldURL. It's live, meaning that it opens what you just typed in, and visible only if the field is non-empty. It's as unobtrusive as can Modules directory GitHub It would be the best if something similar would be built-in to PW. There will be probably some tweaks and settings in the future. Suggestions welcome (even for module name).
    1 point
  16. Just wanted to post it here for others that might look for an example. I'm currently working on importing a Site to PW2.1. Following code I figured is needed to create pages using the Bootstraped API: <?php include(./index.php) // bootstrap PW $p = new Page(); // create new page object $p->template = 'page'; // set template $p->parent = wire('pages')->get('/about/'); // set the parent $p->name = 'mynewpage_url'; // give it a name used in the url for the page $p->title = 'My New Page'; // set page title (not neccessary but recommended) // added by Ryan: save page in preparation for adding files (#1) $p->save(); // populate fields $p->image = 'path/to/image.jpg'; // populate a single image field (#2) $p->images->add('path/to/image1.jpg'); // add multiple to images field $p->save(); // testing echo 'id: '.$p->id.'<br/>'; echo 'path: '.$p->path; Note: in PW 3 with multi-instance support adding new Objects https://processwire.com/blog/posts/processwire-2.6.21-upgrades-comments-more-on-pw-3.x/#more-updates-on-processwire-3.0 [Edit by Ryan #1] Added first $p->save(); [Edit by Ryan #2] Changed $p->image('...') to $p->image = '...';
    1 point
  17. Yes, that's basically what I'm doing now except I'm using wireDecodeJSON because it will return an empty array for an empty JSON array. I don't have to special-case checks. Yes, I thought it would be a nice feature. I spent a lot of time trying to dig the payload out of $input before I gave up and went to PHP-native code. Thanks for looking.
    1 point
  18. Aaaah big thanks Horst...
    1 point
  19. Have a look into Functions.php line 805, function wireMail(): $mail = null; $modules = wire('modules'); // attempt to locate an installed module that overrides WireMail foreach($modules as $module) { $parents = class_parents("$module"); if(in_array('WireMail', $parents) && $modules->isInstalled("$module")) { $mail = wire('modules')->get("$module"); break; } } // if no module found, default to WireMail if(is_null($mail)) $mail = new WireMail();
    1 point
  20. Great! Please, can you add it to the modules directory too? It's done in less then 2 minutes, as you have it in a github repo.
    1 point
  21. Hey, you are all right. We have had another issue with authentication and the test, where the original SMTP-class also allowed the missing of authentication. In this regard, the user could successfully pass the test (connecting to the server, IP + Port) without providing authentication credentials. Therefore I have hacked the original class with this code you have posted above. (assuming there will be no open relay servers out there in 2015) But yep, now you comes along here. I will have a closer look to it and provide a better fix. (apropriate for both situations). In the meantime you can A) comment the part in the code, or B) don't use the test anymore on tis server. Thanks for your help.
    1 point
  22. Have you seen https://github.com/ryancramerdesign/ProcessWire/blob/master/wire/core/WireHttp.php?
    1 point
  23. maybe this is the same issue? https://github.com/ryancramerdesign/ProcessWire/issues/1291
    1 point
  24. Hi Sradesign, Any particular reason why you would need that? I don't see the need - Reno is a fully functional admin theme. Or perhaps I am missing something here?
    1 point
  25. https://github.com/ryancramerdesign/ProcessWire/releases
    1 point
  26. Thanks for your help. I understand that there are two different things: "shortcuts" and now the "add new bookmarks". The problem is the same in the "Pages > add new" that in the shortcuts button All available for the admin: Two missing for the client role: But taking a look closer, I see that the 2 missing templates for the client are those that can add a new item in multiple possibles parents, like a new city in any of already department created. For the admin, PW send a page to choose the unique parent among the possibles ones: On the contrary, for the client, PW seems to don't allow this. But, we can add items with multiple possibles parent using the page three, so the right for these templates are well allowed for this role. Do you think it is possible to have the same behavior (use shortcuts) when the client want to quickly add an item in any page of a given template?
    1 point
  27. Ok with 2.6.19 you can access the settings for the Add new Button may there you find a solution. Have a read at: https://processwire.com/blog/posts/processwire-2.6.17-expands-admin-navigation-with-bookmarks/#page-add-bookmarks regards mr-fan
    1 point
  28. After talking to my host they confirmed and had to whitelist mod_sec rules. Thanks again for the pointer in the right direction.
    1 point
  29. Update: Blog Version 2.3.5 (dev branch only for now) Changes Fixed issue of slow loading dashboards on sites with lots of posts. Added some missing translation strings, thanks @mr-fan. Decluttered modal window, thanks @mr-fan. Some code optimisations. I don't think there are any other pending issues. Apologies it took so long to get to this update; we got there in the end
    1 point
  30. Yeah I tried the debug no errors, but it makes sense. This is a new host so it is very likely the issue. Thank you so much for the help! All the best.
    1 point
  31. Thanks. I see there are all kinds of levels of sophistication you can go to. Nice.
    1 point
  32. Why aren't all browsers (and Android/iOS apps) supporting SVG icons ? Looks like Firefox already does and Safari is heading that way: http://caniuse.com/#feat=link-icon-svg Maybe the others will follow and all this icon sizing mess can be a thing of the past! EDIT: Some discussion regarding SVG icons in chromium: https://code.google.com/p/chromium/issues/detail?id=294179
    1 point
  33. Put this in one of your templates, <?php echo $config->version; ?>
    1 point
  34. Here's a working code example that doesn't use render and implements elabx's function mentioned above: <ul> <?php $i = 0; $limit = 4; $t = $modules->get('MarkupTwitterFeed'); function convert_links($tweet) { $tweet = preg_replace('/((http)+(s)?:\/\/[^<>\s]+)/i', '<a href="$0" target="_blank">$0</a>', $tweet ); $tweet = preg_replace('/[@]+([A-Za-z0-9-_]+)/', '<a href="http://twitter.com/$1" target="_blank">$1</a>', $tweet ); $tweet = preg_replace('/[#]+([A-Za-z0-9-_]+)/', '<a href="http://twitter.com/search?q=%23$1" target="_blank">$0</a>', $tweet ); return $tweet; } foreach ($t as $tweet){ if ($i < $limit){ $text = convert_links($tweet['text']); $timestamp = date('F j g:i a', strtotime($tweet['created_at'])); echo '<li>'.$text.'<br><small>'.$timestamp.'</small></li>'; } $i++; } ?> </ul>
    1 point
  35. Hanna code is certainly a great way to place an audio file into a textarea, the files themselves loaded into your files field and then referenced in the RTE; to make it easier for editors you could add tagging on the files and then reference the tag in your hanna code. Using the RTE itself, you could simply use the link button and then select the audio file. Then you can initialize that with something like Soundmanager2. So in other words, you would end up with an anchor in your textarea linking to an audio file, which then using a jQuery selector could be turned into a player. For more control, you could check the field (e.g. using strpos) at the top of your template file, and then do a str_replace on the field. The main advantage in that is that you could initialize the audio players and load specific assets based on the existence of said mp3 link, instead of on all pages, and you could also replace the simple anchor with more specific markup that might be required for your player. Lastly you could make a module that would essentially do the same thing, and apply it as a textformatter to the field.
    1 point
  36. Thanks for the offer, however I don't feel that HBB warrants any sort of payment as it is essentially a simple module. I will indeed give access to the code shortly. I'm not sure if it'll dissapoint, but I'll let you be the judge of that. I am interested in finding out what features people would like included. I'm keeping it as simple as possible, but so far there are fields to store the following information: Author's IP address & user agent string Topic / comment message content Creation / edit date (if edited) Pinned status Locked status Who has viewed the topic Which members can view the topic (ideal for private messages) The $page ID of the comment for reply status reference I'm toying with the idea to add fields for images and attachments, thus allowing the option to store images or attachments with comments, a bit like you can do with this forum.
    1 point
  37. Great minds think alike don't they Tom. I mean, Reno.
    1 point
  38. Tom Reno! You should have picked better nick for your second account... Just kidding of course
    1 point
  39. Hi fliwatuet and welcome to processwire. Many pw users report that working with processwire has a php learning side-effect I can confirm from my own experience with processwire that working with processwire you will learn php along with it. With processwire you don't have to learn first a new cms or need to have a lot of coding experience. Instead you can immediately use all html, css, js and php experience that you already have and start using it with processwire. Processwire comes with multi-language out of the box ! With only a few steps you will have it configured. They all have their place, but when compared, processwire is going to save you a lot of time and headache.
    1 point
  40. Thanks. Your example didn't work as-is (determining if customrole is in the array), so I did some research and came up with this (makes use of jQuery in the CSS loading part): $(function () { var customrole = 'superuser', info = config.AdminCustomFiles; function getRole(){ var arr = info.roles; for(var j = 0; j<arr.length;j++ ){ if(arr[j] == customrole){ return true; } } } if (getRole() === true) { loadCSS = function(href) { var cssLink = $("<link rel='stylesheet' type='text/css' href='"+href+"'>"); $("head").append(cssLink); }; loadCSS("/site/templates/AdminCustomFiles/piilota-kielet.css"); } else { console.log("Don't do it!"); } }); CSS for hiding all but default language: .LanguageSupport { display: none; } .LanguageSupport:nth-of-type(1) { display: block; } Edit: switched from :first-child to :nth-of-type(1) so that we can see the Name field when adding a page. Edit 3 years later: the new version changed the JSON data, so info.user.roles is now simply info.roles
    1 point
  41. The process is the process that is running. (Admin pages have this process assigned on the page) The roles are the roles the logged-in user has. Admin theme should not matter. // not tested, but should give a clue.... $(function () { var customrole = 'editor', info = config.AdminCustomFiles; if (info.user.roles[customrole].length) { $('#element').addClass('hide-me'); console.log('Do your stuff'); } else { console.log("Don't do it!"); } });
    1 point
  42. How do I use the config data? I want to restrict a CSS style to a role. So I understand I need to put in the Dependencies field: AdminCustomFiles/myconfig.js But what do I put as the contents of that .js file? The example in the module page gives no help: var config = { "AdminCustomFiles": { "adminTheme": "AdminThemeReno" "process": "ProcessPageEdit", "host": "domain.net", "user": { "id": 41, "name": "admin", "email": "user@domain.net", "roles": [ "guest", "superuser" ] }, Why is there a specific user id and a specific process? How can I do it for all users with a specific role and just take the processes defined in the module settings? What if I don't use the Reno theme? Thanks.
    1 point
  43. I just noticed that the complete ACE editor is bundled with TextformatterHannaCode. Wouldn't it be nice to make it a separate js module and use it if it's installed? Also there's already a ACE editor fieldtype from Adam. Since ACE editor source comes with 1million! files I think it would be the way to go. Much like jQueryDataTables or Magnific etc.
    1 point
  44. This not error but feature. You can configure the conversion yourself in the page name module in admin.
    1 point
  45. If you are doing this in a template file, better to use some name other than $page, just so that you don't overwrite the $page provided to the template. $p = $pages->get('/about/'); if(!$p->id) { // create new page, if not already there $p = new Page(); $p->template = 'basic-page'; $p->parent = '/'; $p->name = 'about'; // URL name } $p->of(false); // turns off output formatting $p->title = 'About SwimToWin'; $p->save();
    1 point
×
×
  • Create New...